Evento Worksheet_Change(ByVal Target As Range)

Quería me puedan ayudar con una duda, el evento Worksheet_Change(ByVal Target As Range), puede colocarse en la hoja 7 por ejemplo y pedir a la macro que copie datos a la hoja 2 o solo permite cambios en la misma hoja. He creado una macro para que realice esto, pero se obtiene resultados inesperados, a veces funciona, otras no, o realiza cosas que no indico. Sin más les pongo mi macro, que esta realizada en la hoja 7 y debe copiarme datos en la hoja 1 (unos datos debajo de otros), cada vez que coloco "si" en la columna Y de la hoja 7:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ConTAR As Integer, fiLA As Integer, Rango As Range
Set Rango = Range("Y3:y80")
If Intersect(Target, Rango) Is Nothing Then Exit Sub
On Error Resume Next
Application.ScreenUpdating = False
If Target.Value = "Si" Then
ConTAR = ActiveCell.Row
Worksheets(7).Range(Cells(ConTAR, 1), Cells(ConTAR, 24)).Copy
Worksheets(1).Activate
Range("a3").Activate
fiLA = 3
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
fiLA = ActiveCell.Row
Loop
Worksheets(1).Range("A" & [fiLA] & "").PasteSpecial (xlPasteValues)
Worksheets(1).Range("A" & [fiLA] & "").PasteSpecial (xlPasteComments)
Worksheets(7).Range(Cells(ConTAR, 5), Cells(ConTAR, 25)).ClearContents
Worksheets(7).Range(Cells(ConTAR, 5), Cells(ConTAR, 25)).ClearComments
End If
Application.ScreenUpdating = True
End Sub 

Favor si alguien puede indicarme si estoy usando bien el evento Worksheet o corregir la macro que indico.

Respuesta
2

Te anexo la macro actualizada

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
'Act.Por.Dante.Amor
    Dim fila As Integer, Rango As Range, u
    Set Rango = Range("Y3:Y80")
    If Intersect(Target, Rango) Is Nothing Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    If LCase(Target.Value) = LCase("Si") Then
        Application.ScreenUpdating = False
        fila = Target.Row
        Range(Cells(fila, "A"), Cells(fila, "X")).Copy
        With Sheets(1)
            u = .Range("A" & Rows.Count).End(xlUp).Row + 1
            .Range("A" & u).PasteSpecial xlPasteValues
            .Range("A" & u).PasteSpecial xlPasteComments
        End With
        Application.EnableEvents = False
        Range(Cells(fila, "E"), Cells(fila, "Y")).ClearContents
        Range(Cells(fila, "E"), Cells(fila, "Y")).ClearComments
        Application.EnableEvents = True
    End If
End Sub

La fila debe tomarse de Target.row, si la tomas de Activecell.row es de la celda activa y puede ser otra celda, por ejemplo, si modificas la celda Y5 y presionas enter, la fila de Target.row es la 5, después del enter, el cursor se desplaza hacia abajo a la celda Y6, entonces la fila de activecell es la 6. Es por eso que a veces te copia otra fila.

Después borras los datos de la fila desde la columna "E" y hasta la misma columna "Y", eso hace que se active nuevamente el evento Change, por eso puse la instrucción Application.enableevents=false, de esa forma se desactivan los eventos para que no se ejecute nuevamente la macro, pero después los vuelvo a activar, para que siga funcionando.


.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Estimado, muchas gracias, realizare lo indicado y lo voy a probar. Comunicare mis resultados.

R ecuerda regresar a valorar la respuesta.

¡Muchas gracias!, eso era exactamente lo que necesitaba. Gracias por su apoyo.

Disculpe, pero en su macro, que significa Target.Count > 1,  (¿el contador del target puede ser mayor a 1?), si puede indicarme dónde podría profundizar más sobre este tema o sobre el evento Worksheet_Change(ByVal Target As Range), estaré muy agradecido. Pero igual gracias por responder a mi pregunta original.

Partamos desde un inicio, una celda es un objeto, le llamo objeto porque a la celda le puedes aplicar "procesos", por ejemplo, le puedes poner un valor, o borrar el contenido de la celda, o la puedes copiar o la puedes pegar, ordenar, buscar, etc. Además una celda tiene características como el tipo de letra, el tamaño de letra, el color de la celda, el contorno de la celda, etc.

Regresando al evento Change, cuando modificas una o varias celdas de la hoja, en Target tienes un arreglo de objetos, dicho de otra forma, en Target tienes todos los objetos celdas modificadas.

Por ejemplo, si insertas una columna o una fila, estás modificando cientos de celdas, entonces en Target tienes todos los objeto celdas.

Si copias 10 celdas y las pegas, entonces en target tienes 10 objetos celdas. En target, puedes saber el contenido de cada una de las celdas.

Entonces Sí, en Target puedes tener más de un valor o más bien dicho más de un objeto celda.

Cuando pongo If Target. Count > 1 then exit sub, significa que estás modificando más de una celda. En tu explicación mencionas que vas a poner un "Si" en una celda, entonces asumo que si estás modificando más de una celda, significa que estás insertando una fila o una columna o copiando un rango, en estos casos la macro no debería continuar.


Consulta la página de Microsoft sobre el tema del evento change.

Sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas