Macro pega datos dentro de tablas dinámicas

Tengo una macro que funcionaba bien en el archivo común pero ahora que lo convertí en tabla no me funciona;adjunto código

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub       'solo funciona cuando modifica 1 sola celda
If Not (Intersect(Target, Range("w2:w5000")) Is Nothing) Then
  If Target.Value = "si" Or Target.Value = "SI" Then
    Application.EnableEvents = False    'para que no interfiera con otros eventos
    Target.Offset(0, -14).Copy _
      Sheets("ventas").Range("Z1000000").End(xlUp).Offset(1, 0)
    Target.Offset(0, 1).Copy _
      Sheets("ventas").Range("C1000000").End(xlUp).Offset(1, 0)
    Application.EnableEvents = True     'dejo todo como estaba
  End If
End If
End Sub
Respuesta
1

Trabajar con tablas tiene sus particularidades... una tabla nunca esta sin datos... siempre sobrevive al menos el primer registro (la primera fila).

No has indicado si fue la base de datos o la de la hoja "ventas" la que convertiste a tabla... pero el error que reportas solo podría darse si fuera en la hoja ventas... pues al usar movimientos de desplazamiento con teclas, la reacción de End+Up no es el mismo con tablas que con celdas...

Técnicamente tu macro funcionaría bien a partir del segundo registro... pero cuando la tabla este en blanco no lo hará...

Lo que tienes que hacer es usar puro VBA, no movimiento de celdas...

Aquí te paso una alternativa que si funcionará, técnicamente es un poco más lento, pero en la práctica la diferencia será imperceptible... (también he mejorado para que funcione con SI, si, sI o Si)

No olvides valorar la respuesta.

Option Compare Text ' para que no diferencie mayusculas de minusculas
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, dato As Variant
If Target.Count > 1 Then Exit Sub       'solo funciona cuando modifica 1 sola celda
If Not (Intersect(Target, Range("w2:w5000")) Is Nothing) Then
    If Target.Value = "si" Then
        Application.EnableEvents = False    'para que no interfiera con EL MISMO EVENTO
        ' LEER EL DATO QUE IRA EN LA COLUMNA Z
        dato = Target.Offset(0, -14)
        '  BUSQUEDA DE LA PRIMERA CELDA VACÍA EN LA COLUMNA Z
        i = 0
        Do
            i = i + 1
        Loop Until Sheets("ventas").Cells(i, "Z") = Empty
        ' ESCRIBIR EL DATO EN LA CELDA VACIA
        Sheets("ventas").Cells(i, "Z").Value = dato
        ' LEER EL DATO QUE IRA EN LA COLUMNA C
        dato = Target.Offset(0, 1)
        '  BUSQUEDA DE LA PRIMERA CELDA VACÍA EN LA COLUMNA C
        i = 0
        Do
            i = i + 1
        Loop Until Sheets("ventas").Cells(i, "C") = Empty
        ' ESCRIBIR EL DATO EN LA CELDA VACIA
        Sheets("ventas").Cells(i, "C").Value = dato
        Application.EnableEvents = True     'reactiva los eventos
    End If
End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas