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