¿Cómo ordenar datos de forma personalizada?

Tengo un archivo de Excel con un registro de recibos impagados. Ya sea para la creación de un formulario en Access o para la gestión manual de los mismos, necesito ordenar los registros de tal modo que los recibos con la fecha de vencimiento más antigua se gestionen antes, pero teniendo en cuenta que un cliente puede tener más de un recibo con fechas de vencimiento distintas y necesitaría que todos los recibos del mismo cliente apareciesen en filas contiguas.
Os dejo un ejemplo de lo que me gustaría conseguir. Son datos inventados y el resultado final lo he ordenado manualmente, pero el listado real comprende más de 500 registros y es inviable realizarlo manualmente.

Y este es resultado de ordenarla manualmente:

Como veis, lo que necesito es que los recibos más antiguos se sitúen en la parte superior, pero si alguno de esos recibos corresponde a un cliente que tenga dos o más recibos, estos aparezcan justamente en las filas siguientes, independientemente de su fecha de vencimiento.

1 Respuesta

Respuesta
3

Te dejo 2 macros. La primera te ordenará la tabla en el mismo lugar.

Entra al Editor de macros (ALT +F11 o desde menú Programador, Visual Basic)

Inserta un módulo y allí copia lo siguiente:

Sub reordenaVtos()
'x Elsamatilde
Dim x As Integer, finx As Integer, z As Integer, canti As Integer, i As Integer
Dim nbre As String
Dim esta As Byte
'se recorre la tabla ordenada x vtos
x = 2                                           'primera fila con datos
finx = Range("A" & Rows.Count).End(xlUp).Row    'ultima fila con datos
While Range("A" & x) <> ""
    'se evalúa si hay más registros del mismo nombre hacia abajo
    nbre = Range("A" & x)
    z = x + 1
    canti = Application.WorksheetFunction.CountIf(Range("A" & z & ":A" & finx), nbre)
    If canti > 0 Then     'si hay repeticiones las va insertando 
        For i = 1 To canti
            esta = 0
            While Range("A" & z) <> "" And esta = o
                If Range("A" & z) = nbre Then
                    Range("A" & z & ":D" & z).Cut
                    Range("A" & x + 1).Insert Shift:=xlDown
                    x = x + 1: esta = 1
                End If
                z = z + 1
            Wend
        Next i
    End If
    x = x + 1
Wend
End Sub

En el mismo u en otro módulo, copia esta 2da macro que te reordena la tabla en un rango auxiliar, por si necesitas mantener la tabla original.

Sub dobleOrden()
'x Elsamatilde
'se recorre la col D ordenada x vtos
x = 2: y = 2    'fila destino
While Range("A" & x) <> ""
    'se pasa a un rango auxiliar
    Range("A" & x & ":D" & x).Copy Destination:=Range("H" & y)
    y = y + 1
    'se evalúa si hay más registros del mismo nombre
    canti = Application.WorksheetFunction.CountIf(Range("A" & x + 1 & ":A" & finx), Range("A" & x))
    If canti > 0 Then
        z = x + 1: nbre = Range("A" & x)
        For i = 1 To canti
            esta = 0
            While Range("A" & z) <> "" And esta = o
                If Range("A" & z) = nbre Then
                    Range("A" & z & ":D" & z).Copy Destination:=Range("H" & y)
                    'se quita de la lista original
                    Range("A" & z & ":D" & z).Delete Shift:=xlUp
                    y = y + 1: esta = 1
                End If
                z = z + 1
            Wend
        Next i
    End If
    x = x + 1
Wend
End Sub

Si esto resuelve tu consulta no olvides marcar una valoración/votación o comentario para darla por cerrada.

Como el sitio estuvo unos días fuera de servicio, no se si llegaste a leer la respuesta.

Quiero remarcar, que debes optar por una de las 2 macros, no las 2 juntas ;)

Dependerá de si quieres el resultado ordenado sobre tu misma tabla (primera macro) o en una rango u hoja aparte, y en este caso solo debes ejecutar la segunda macro.

En ambos casos, debes ajustar las referencias (filas y columnas) según tu modelo ya que en tu imagen no se aprecian los encabezados de filas y columnas.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas