martes, 12 de septiembre de 2017

VBA: Ordenar una Array Multidimensional

Veremos en el post de hoy cómo conseguir ordenar, empleando una array en VBA para Excel, un rango de celdas de varias columnas.
Como punto especial veremos que sirve para cualquier dimensión de rango (número de filas y columnas) y que es configurable cuál es el campo o columna prioritaria a la hora de la ordenación.

Veamso el punto de partida y el resultado tras la ejecución de la macro:

VBA: Ordenar una Array Multidimensional



La función definida personalizada que veremos a continuación: 'OrdenarMatrices' emplea el método de burbuja de ordenación, que ya vimos en esta entrada hace algún tiempo; si bien en esta ocasión en modo función.

Y ahora lo importante.. en un módulo estándar incluimos los siguiente procedimientos:

Function OrdenarMatrices(TempArray() As Variant, NumCol As Long, TotalCol As Long)
Dim situacion As Boolean
Dim elto As Long, col As Long
'definimos la dimensión de una matriz temporal
Dim Temp()
x = Val(TotalCol)
'la redimensionamos
ReDim Temp(1 To x)

'añadimos un bucle para pasar por todos los elementos de la matriz
Do
    situacion = True
    'recorremos cada elemento de la matriz de trabajo cargada
    For elto = LBound(TempArray) To UBound(TempArray) - 1
        'con el < ordenamos de menor a mayor o ascendente (con > en sentido descendente)
        If TempArray(elto, NumCol) < TempArray(elto + 1, NumCol) Then
            situacion = False
            'recorremos cada columna de cada elemento
            For col = 1 To TotalCol
                'hacemos un trasvase de datos de la matriz temporal a la cargada
                Temp(col) = TempArray(elto, col)
                TempArray(elto, col) = TempArray(elto + 1, col)
                TempArray(elto + 1, col) = Temp(col)
            Next
        End If
    Next
'salimos del bucle...
Loop While Not situacion

End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Ordenamos()
Dim MiMatriz() As Variant
'cargamos la matriz con datos
MiMatriz = Range("A1:D10")
'ordenamos de menor a mayor según la tercera columna el rango anterior
Call OrdenarMatrices(MiMatriz, 3, UBound(MiMatriz, 2))

'devolvemos la matriz oredenada a la hoja de cálculo
Range("F1:I10") = MiMatriz
    
End Sub

Tras la ejecución de 'Ordenamos' obtenemos el resultado esperado, tal como se veía en la imagen primera....

No hay comentarios:

Publicar un comentario