Propiedad celda cambio o modificación VBA

Estoy utilizadno el Excel para pasarle datos de otro programa, y quiero ir metiendo los datos en una celda
Ejemplo C3, siempre quiero que los metan en C3 y que me machaque datos anteriores(eso lo hago desde un programa externo) y lo que quiero es hacer una macro que cada vez que el programa externo me coloque un dato en execl este lo coloque en una celda nueva
ejemplo 1º dato en C6 2º dato en C7 y así sucesivamente, ya tengo el código hecho pero utilice Worsheets_SelectionChange y también me detecta cambio de ratón y no me vale
después el mismo código lo copie y cambie a Worsheets_Change y el contador que utilice se me dispara cuanta constantemente con o si cambio en C3 cosa que no comprendo.
Solo necesito saber cual es la propiedad de la celda que me indica que cambia o se modifica,(incluyendo si es el mismo valor, para distinto valor con Worsheets_selectionChange ya lo conseguí)

2 Respuestas

Respuesta
1
Si quieres un ejemplo adicional a lo que te voy a explicar mira una respuesta que di a la pregunta "Encontrar la última fecha" o algo así.
Bueno, veo que vas muy avanzado en lo del cógigo, yo te recomiendo que utilices el evento
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Por las razones que ya anotaste, lo que debes tener en cuenta es que se activa cada vez que modificas algo en cualquier parte de la hoja entonces lo que debes hacer es validar que celda fue modificada antes de realizar el resto del procedimiento, esto lo puedes lograr con un condicional que encierre todo el código dentro del procedimiento... algo así como
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
if target.column=3 then
...instrucciones...
end if
end sub
O puedes validar la dirección del target (target es el rango de celdas o la celda que fue modificada) con target. Address
Bueno, espero haberte ayudado en algo, si necesitas que me explique mejor no dudes en escribirme que con gusto te contestaré, si la respuesta te parece adecuada te pido el favor de finalizar la pregunta con una valoración acorde con la calidad y oportunidad de la misma.
Ante todo muchas gracias por la contestación pero no me funciona hay algo que hago mal
Mi código es:
Y no funciona lo que intento es introducir datos en C3 y cada vez que introduzca un cambio pase la 1ª vez a C6 y la siguiente a C7 y así sucesivamente.
Public Ini As Boolean
Public contador As Integer
Public Nuevo As Double
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.colum = 3 Then
If Target.Row = 3 Then
Nuevo = Cells(3, 3).Value
If Ini = False Then
Cells(6, 3).Value = Nuevo
contador = 1
Ini = True
Else
Cells(6 + contador, 3) = Nuevo
contador = contador + 1
End If
End If
Application.EnableEvents = True
End Sub
REME
Me gusta trabajar con usuarios como tu que intentan e intentan... sólo así se aprende.
Te cuento varias cosas sobre el código que me enviaste que te pueden servir para el futuro y luego te transcribo el código que yo hice para que lo pruebes.
1. Debes tener en cuenta la cantidad de if que tiene el código y cada uno debe contener su end if (en tu código falta uno)
2. Las propiedades, al tu pasar al renglón siguiente automáticamente quedan con la primera letra en mayúscula, así te das cuenta si te quedó bien escrito (en tu código falta una n el la propiedad column)
3. Las variables que tu declaras en un procedimiento pierden su valor al terminar la ejecución así las declares como públicas, lo de públicas te sirve para llamarlas en cualquier módulo sin necesidad de declararlas, para que la variable conserve su valor entre llamada y llamada debes usar la palabra STATIC.
Bueno esa era la parte pedagógica del asunto.. ahora el código:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Address = "$C$3" Then
fila = 3
Do While Target.Offset(fila, 0).Value <> ""
fila = fila + 1
Loop
Target.Offset(fila, 0).Value = Target.Value
End If
Application.EnableEvents = True
End Sub
El código busca de C6 hacia abajo hasta que encuentre una celda vacía y coloca el valor de C3 en la celda que encuentre desocupada.
Muchísimas gracias me ha sido de gran ayuda, estoy empezando a programar en VBA, y necesitaba unas pequeñas aclaraciones Muchísimas gracias Cesar Mera
Respuesta
1
Por lo que comentas, es correcto que escribas el código en el evento Change de la hoja. Pero ten en cuenta lo siguiente:
Si escribes dentro del evento Change una instrucción que CAMBIE algo en la hoja, esa instrucción producirá un nuevo evento Change en la hoja, ¿comprendes?
Entonces, prueba desactivando los eventos mientras ejecutas tu código.
Por ejemplo,
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'tu código
Application.EnableEvents = True
End Sub
Fíjate que al producirse el evento change, primero desactivo los eventos, ejecuto luego el código, y luego vuelvo a habilitar los eventos.
Además, fíjate que para darle más precisión a tu código y que se ejecute sólo cuando cambia la celda que te interesa, puedes utilizar el argumento Target, que contiene la celda o rango de celdas que están cambiando.
Ante de todo muchas gracias por la pronta contestación, y por haberme atendido y acontinuación le expongo mi duda->
El código que he introducido es:
Public Ini As Boolean
Public contador As Integer
Private Sub Worksheet_Change(ByVal C3 As Range)
Application.EnableEvents = False
Nuevo = Cells(3, 3).Value
If Ini = False Then
Cells(6, 3).Value = Nuevo
contador = 1
Ini = True
Else
Cells(6 + contador, 3) = Nuevo
contador = contador + 1
End If
Application.EnableEvents = True
End Sub
La primera vez introduzco los valores de la celda C3 en la celda C6 y en los sucesivos C7, c8, c9 pero no me va hay algo que me falta que puede ser.
Te respondo rapidito y sin verificar que el único error sea ese, pero te cuento que
Private Sub Worksheet_Change(ByVal C3 As Range)
Tiene un error. En lugar de C3, deja Target. Allí se guardara la dirección de la celda que esta cambiando.
Por ejemplo
Private Sub Worksheet_Change(ByVal Target As Range)
If target.address= "$C$3" then MsgBox "Cambió C3!"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas