excel vba excel-vba copy-paste

Excel VBA Cómo detectar si algo se pegó en una Hoja de trabajo



excel-vba copy-paste (2)

Comenzaré diciendo que mi experiencia con Excel y VBA se limita a lo que vi en la escuela. Tengo experiencia en programación, pero en otros idiomas.

Tengo un archivo que recibo todas las semanas. La estructura de este archivo es siempre la misma: ID, Nombre, Fecha, Valor entre 1 y 4, datos no relevantes.

Estos datos se seleccionan a través del botón ''seleccionar todo'' (esquina superior izquierda de la hoja de trabajo, pequeño triángulo debajo del nombre de la celda en MS Excel 2013) y luego se copian en otro archivo predeterminado que rediseña los datos para mostrarlos y filtrarlos en diferentes hojas según el valor 1-4 y la fecha.

Mi pregunta: ¿Cómo detecto cuándo se han / se están pegando los datos? He probado el evento Worksheet.Change, pero el comando pegar (CTRL + V) no activa el evento Change. Además, ¿cómo se copiarán los datos? ¿Se actualizará fila por fila, celda por celda (en qué dirección), ...? Sé que puedo encontrar fácilmente la respuesta a la última pregunta depurándola una vez que pueda detectar el comando de copia, pero nunca se sabe si alguien sabe la respuesta.

¿Hay otra forma más fácil (o mejor) de hacer esto?

Se pueden proporcionar más datos e información si es necesario.

Gracias por tu ayuda.

EDITAR: ''... ¿ha sido / está siendo copiado?'' cambiado a pegado como debería haber sido.


El evento Worksheet_Change hará el trabajo si agrega una fórmula a la celda que nunca se sobrescribirá. Digamos que sus datos se pegan en la celda A1 y ocupan 5 columnas. Entonces, ingrese la fórmula a continuación en 6. columna y fila 1.

=COUNTBLANK(A1:A1048576)

Ahora, puede manejar / detectar eventos de pegado;)


Private Sub Worksheet_Change(ByVal Target As Range) Dim UndoList As String ''~~> Get the undo List to capture the last action performed by user UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1) ''~~> Check if the last action was not a paste nor an autofill If Left(UndoList, 5) = "Paste" Then ''Do stuff End If End Sub

Esto hizo el truco. Para aquellos que necesitan algo similar y conocen el tamaño de su lista, la respuesta de @MaciejLos también funcionaría.