# rango de celdas para activacion de macro por cambio de valor



## brantis

Vi en otra liga que contestaban como ligar la activacion de un macro con el cambio de valor de una celda y pusieron esta respuesta:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$D$10" Then Mimacro

End Sub

Mi pregunta es como hago lo mismo pero para un rango de celdas en vez de que solo cheque el cambio de una sola??????

Muchas Gracias!!!


----------



## galileogali

Hya muchas respuesta a esta pregunta. Una de carcater general es la que usa Intersect

Private Sub Worksheet_Change(ByVal Target As Range) 


dim rng as range
set rng = Range("a1:b34") ' el rango que gnerara el evento es "a1:b34"

If intersect(Target,rng) is Nothing then exit sub 

  Mi Macro

End Sub 

GALILEOGALI


----------



## brantis

*Gracias!!!*

Muchas Gracias!!! Funciono muy bien el hacerlo como me sugieres!!!


----------



## brantis

*Gracias!!!*

Muchas Gracias!!! Funciono muy bien el hacerlo como me sugieres!!!


----------



## Greg Truby

Hola brantis y bienvenido a MrExcel. Como Galí ya indicó, la función clave es _Intersect()_ y el objecto vacio _Nothing_ y el operador de comparación de objetos _IS_

En casos asi (tomando una acción dentro de __Change_) siempre aconsejo que uno utilice rangos nombrados en vez de direcciones escritos dentro del macro.  Con un rango nombrado, si el usuario (o usted) inserta o suprima filas/columnas/celdas el macro sigue funcionando bien.  Pero si pone la dirección de forma "hard coded" en el macro, insertar o suprimir a la izquierda o arriba del blanco causa problemas. Ejemplo:
	
	
	
	
	
	




		Code:
__


Private Sub Worksheet_Change(ByVal Target As Range)
    '// el cuaderno tiene un rango definido "TestRange"
    
    Dim rngCell As Range, rngIntersect As Range
    
    If Not Intersect(Range("TestRange"), Target) Is Nothing Then
        Set rngIntersect = Intersect([TestRange], Target)
        For Each rngCell In rngIntersect.Cells
            Application.EnableEvents = False
            MiMacro rngCell
            Application.EnableEvents = True
        Next rngCell
    End If
End Sub

Private Sub MiMacro(rngTarget As Range)
    rngTarget.Formula = UCase(rngTarget.Formula)
End Sub

Favor note el uso de 
	
	
	
	
	
	




		Code:
__


Application.EnableEvents

 Por lo general cuando un está haciendo algo dentro de una rutina de eventos es buenas idea apagar los eventos.  Si no lo hace es muy fácil generar un bucle infinito.
<hr />Hola, Galí.  Todo bien, espero.


----------



## jmpadini

Hola disculpen soy nuevo en este foro, sé que este post ya tiene sus años, pero me encuentro en una situación en la que busco pedirles de su valiosa ayuda y gran experienciia; estoy en un caso similar, tengo 2 columnas con lista desplegables la 2a depende de lo que se seleccione de la primera; mi problema es que requiero que si al cambiar la primer columna, la segunda borré o reinicie lo que antes seleccinado; tengo un código pero es para una sola celda, y yo busco fuera para un rango, es decir más lineas hacia abajo de la misma columna (secundaria), el código es:
If Target = Range("A2") Then 'en esta primer columna se selecciona de la lista desplegable    Range("B2").Value = "" 'en eta otra esta la segunda columna donde hay lista desplegable que borra la celda si cambia la primera.
End If

End Sub

Su amable experiencia me es de gran ayuda, agradezco cualquier comentario.


----------

