Ver Mensaje Individual
  #5 (permalink)  
Antiguo 19/10/2010, 11:42
Avatar de 3pies
3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 5 meses
Puntos: 144
Respuesta: Encontrar valores de las ultimnas celdas

Supongamos que tienes dos hojas: Hoja1 y Hoja2. Imagina que quieres evaluar cambios en la Hoja1, pero solo si afectan a la 1ª columna (columna A). Si se produce un cambio en esa columna, cogeremos los cinco últimos datos de la misma (si hay líneas vacías lo tendremos en cuenta).

Para ello, copia esto en la Hoja1, no en un módulo (desde VBA):

Código:
Sub Worksheet_Change(ByVal Target As Range)
'si hay errores, que continúe
On Error Resume Next
'Ocultamos el procedimiento
'Application.ScreenUpdating = False
'si cambiamos algo de la columna A...
If ActiveSheet.Name = "Hoja1" And Target.Column = 1 Then
    'copiamos los 5 valores del final a otra hoja
    Range("A1").Select
    'bajamos hasta el final de la columna
    ActiveCell.SpecialCells(xlLastCell).Select
    'recogemos el datos de las 5 últimas filas
    If ActiveCell <> "" Then
        'si la celda contiene datos, lo pasamos a una variable
        dato1 = ActiveCell
    Else
        'si no hay datos, buscamos la celda con el último dato
        Do While IsEmpty(ActiveCell)
            ActiveCell.Offset(-1, 0).Select
        Loop
        dato1 = ActiveCell
    End If
 
    If ActiveCell.Offset(-1, 0) <> "" Then
        dato2 = ActiveCell.Offset(-1, 0)
    Else
        Do While IsEmpty(ActiveCell.Offset(-1, 0))
            ActiveCell.Offset(-1, 0).Select
        Loop
        dato2 = ActiveCell.Offset(-1, 0)
    End If
 
    If ActiveCell.Offset(-2, 0) <> "" Then
        dato3 = ActiveCell.Offset(-2, 0)
    Else
        Do While IsEmpty(ActiveCell.Offset(-2, 0))
            ActiveCell.Offset(-1, 0).Select
        Loop
        dato3 = ActiveCell.Offset(-2, 0)
    End If
 
    If ActiveCell.Offset(-3, 0) <> "" Then
        dato4 = ActiveCell.Offset(-3, 0)
    Else
        Do While IsEmpty(ActiveCell.Offset(-3, 0))
            ActiveCell.Offset(-1, 0).Select
        Loop
        dato4 = ActiveCell.Offset(-3, 0)
    End If
 
    If ActiveCell.Offset(-4, 0) <> "" Then
        dato5 = ActiveCell.Offset(-4, 0)
    Else
        Do While IsEmpty(ActiveCell.Offset(-4, 0))
            ActiveCell.Offset(-1, 0).Select
        Loop
        dato5 = ActiveCell.Offset(-4, 0)
    End If
    'llamamos al macro pegardatos
    pegardatos
End If
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub
Ahora en un módulo, copia esto:
Código:
Public dato1 As Variant
Public dato2 As Variant
Public dato3 As Variant
Public dato4 As Variant
Public dato5 As Variant
 
Sub pegardatos()
'vamos a la hoja2
Hoja2.Select
'pegamos los datos
Range("A1") = dato5
Range("A2") = dato4
Range("A3") = dato3
Range("A4") = dato2
Range("A5") = dato1
'volvemos a la hoja1
Hoja1.Select
End Sub
Saludos.

Edito, para colgar el ejemplo: http://www.2shared.com/document/RecDDwxN/Ejemplo.html