# Ejecucion de macro al cambiar el valor de una celda



## Controller

Hola a todos!

¿Como puedo hacer que una macro se ejecute automaticamente cade vez que cambia el valor de una celda?

Tengo una macro que pivota una tabla con distintos valores en funcion del mes, ahora mismo cada vez que cambio el mes, tengo que ejecutar la macro para que la "pivot table" se actualice. El valor del mes se encuentra en una celda concreta.

Gracias por la ayuda


----------



## Juan Pablo González

Esto se hace con el evento Change() de la hoja, así:

<pre>Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then MiMacro
End Sub</pre>

Esto llamaría el macro MiMacro cada vez que la celda A1 cambie.


----------



## Controller

¡Eso es rapidez en contestar, si señor!

Mil gracias y saludos desde San Sebastian, España....


----------



## Controller

Juan Pablo,

Por mas que lo intento no logro hacerlo funcionar.

¿Donde deben insertarse esas lineas de código? ¿En mi propia macro?....

Gracias....


----------



## valedor

1.- Entra al libro donde quieras poner el codigo
2.- Entra al Editor del Visual Basic (Alt+F11)
3.- Da un doble click en la hoja donde te interese dejar el codigo, esta la veras en el Explorador de proyectos, si no lo ubicas en el siguiente vinculo hay una breve descripcion de esta ventana

http://www.vbalym.netfirms.com/intro.html

4.- Despues del doble click, en la ventana de codigo, copia el codigo que te envio Juan Pablo
5.- Por supuesto la macro a la que llamas debe de existir en un modulo de codigo





> ¿Donde deben insertarse esas lineas de código? ¿En mi propia macro?....


----------



## Controller

Ya funciona.....

Mil gracias


----------



## Torno

Juan Pablo González said:


> Esto se hace con el evento Change() de la hoja, así:
> 
> 
> Private Sub Worksheet_Change(ByVal Target As Range)
> If Target.Address = "$A$1" Then MiMacro
> End Sub
> 
> Esto llamaría el macro MiMacro cada vez que la celda A1 cambie.




y si es un rango de celdas ?? como seria esa linea ??? 
por ejemplo mi macro es esta:

Sub limitartexto()
Dim limite As Object
Range("A2:G100").Select
For Each limite In Selection
limite.Value = Left(limite, 5)
Next
End Sub
Saludos.


----------



## Greg Truby

Bueno, vamos a suponer que usted dió el rango de celdas que vas a observar el nombre "rngCeldasEspeciales".  Entonces cada vez que usted cambia una celda o celdas multiples que se encuentran dentro de rango observado (y nombrado), su macro correrá.

<font face=Consolas, "Lucida Sans Typewriter", "Lucida Console", "Courier New", Monospace><SPAN style="color:#00007F">Private</SPAN> <SPAN style="color:#00007F">Sub</SPAN> Worksheet_Change(<SPAN style="color:#00007F">ByVal</SPAN> Target <SPAN style="color:#00007F">As</SPAN> Range)<br><br>    <SPAN style="color:#00007F">Const</SPAN> c_strNameOfMonitored <SPAN style="color:#00007F">As</SPAN> <SPAN style="color:#00007F">String</SPAN> = "rngCeldasEspeciales"<br><br>    <SPAN style="color:#00007F">Dim</SPAN> rngIntersect    <SPAN style="color:#00007F">As</SPAN> Excel.Range, _<br>        rngMonitored    <SPAN style="color:#00007F">As</SPAN> Excel.Range<br>        <br>    <SPAN style="color:#00007F">Set</SPAN> rngMonitored = Me.Range(c_strNameOfMonitored)<br>    <br>    <SPAN style="color:#00007F">On</SPAN> <SPAN style="color:#00007F">Error</SPAN> <SPAN style="color:#00007F">Resume</SPAN> <SPAN style="color:#00007F">Next</SPAN><br>    <SPAN style="color:#00007F">Set</SPAN> rngIntersect = Application.Intersect(Target, rngMonitored)<br>    <br>    <SPAN style="color:#00007F">If</SPAN> <SPAN style="color:#00007F">Not</SPAN> rngIntersect <SPAN style="color:#00007F">Is</SPAN> <SPAN style="color:#00007F">Nothing</SPAN> <SPAN style="color:#00007F">Then</SPAN><br>    <br>        myMacro rngIntersect<br>        <br>    <SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">If</SPAN><br>    <br><SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN><br><br><SPAN style="color:#00007F">Sub</SPAN> myMacro(<SPAN style="color:#00007F">ByRef</SPAN> rngCellsChanged <SPAN style="color:#00007F">As</SPAN> Excel.Range)<br><br>    MsgBox "The address of the cell(s) you changed was:" _<br>            & vbCr & vbCr & rngCellsChanged.Address(False, False), vbInformation<br><br><SPAN style="color:#00007F">End</SPAN> <SPAN style="color:#00007F">Sub</SPAN><br></FONT>


----------



## Greg Truby

Bueno, ahora que he contestado la pregunta que usted sí hizo, una pregunta para usted.  Los datos que usted está cortando.  ¿Están importados de otro archivo o pegados con copiar y pegar? ¿O están teclados a mano?  Porque si están teclados a mano, usted podría usar validación de datos para limitar el largo del valor entrado a la celda.


----------



## sebascadavid123

Greg, me puedes explicar el codigo que utilizaste por favor para correr la macro si se cmabia el rango? soy nuevo en esto...
Gracias, Saludos


----------



## Controller

Hola a todos!

¿Como puedo hacer que una macro se ejecute automaticamente cade vez que cambia el valor de una celda?

Tengo una macro que pivota una tabla con distintos valores en funcion del mes, ahora mismo cada vez que cambio el mes, tengo que ejecutar la macro para que la "pivot table" se actualice. El valor del mes se encuentra en una celda concreta.

Gracias por la ayuda


----------



## Greg Truby

Hola David,

Si usted habla suficiente inglés, le recomendio este artículo escrito por Chip:  Events In Excel VBA que explica en una forma muy complete el tema sobre como usar eventos.  

El ejemplo simple que puso mi amigo Juan Pablo usa una forma muy común para este tipo de cosa - compara rangos usando direcciones.  El peligro de esta solución es si alguien inserta o suprima columnas a la izquierda o fila arriba de las celdas invulcradas la dirección cambia y su macro va a dar resultados erróneos.  Nombrar el rango primero y hacer referencia a tal nombre hace que su solución es resistente a cambios de posición de las celdas claves.


----------



## carodrigue

Juan Pablo González said:


> Esto se hace con el evento Change() de la hoja, así:
> 
> Private Sub Worksheet_Change(ByVal Target As Range)
> 
> If Target.Address = "$A$1" Then MiMacro
> 
> End Sub
> 
> Esto llamaría el macro MiMacro cada vez que la celda A1 cambie.




Buenos Dias

Amigo se que ha pasado mucho tiempo desde este tema pero tengo el mismo inconveniente y no se como solucionarlo quisiera saber si me puedo ayudar.. sucede lo siguiente 

tengo la siguiente macro:

[FONT=&quot]_Sub limitartexto()_[/FONT]
[FONT=&quot]_Dim limite As Object_[/FONT]
[FONT=&quot]_Range("B:B").Select_[/FONT]
[FONT=&quot]_For Each limite In Selection_[/FONT]
[FONT=&quot]_limite.Value = Left(limite, 10)_[/FONT]
[FONT=&quot]_Next_[/FONT]
[FONT=&quot]_End Sub

Pero al momento de correr usa toda la columna y necesito que sea solo la celda escrita dentro de esa columna que puede ser cualquiera desde la 1 a la 10000, y esto es por que en esa columna se escribe los correlativos de las guias y solo necesito los ultimos 9 digitos, y de esta manera corre cada vez que modifico cada celda asi ya este modificada y esto pone muy lento el proceso.

Atento a su respuesta saludos._[/FONT]


----------



## James006

Hola,

Lo mas importante es de saber precisamente cual es la celda ...

Hasta Luego


----------

