5 octubre, 2022

PROGRAMAR LA FUNCIÓN ORDENAR EN VBA

Hola a todos! ¿cómo estáis?, espero que bien.

Siguiendo con las funciones de matrices dinámicas, hoy quiero centrarme en otra fórmula muy interesante e imprescindible en nuestros procesos y automatizaciones. La función Ordenar.

Al igual que el caso de la función UNICOS y el post que escribí: PROGRAMAR LA FUNCIÓN ÚNICOS EN VBA os dejaré tres formas de programar esta función (hay otras, pero estas me parecen las más interesantes).

Con el método uno, utilizamos la función de hoja en nuestro editor de VBA. En este caso tendremos que utilizar un loop para devolver los datos de elementos únicos, dado que se guardan en una matriz.

Sub F_ORDENAR_1()
    'Declaramos variables
    Dim fin As Long, i As Long, Ordenar As Variant
    With Sheets("Hoja1")
        fin = Application.CountA(.Range("A:A"))
        Ordenar = WorksheetFunction.Sort(Range("A2:A" & fin), 1, 1)
        'Obtenemos los datos de la matriz y los pasamos a la hoja
        For i = LBound(Ordenar) To UBound(Ordenar)
            .Cells(i + 1, 2) = Ordenar(i, 1)
            Next i
        End With
    End Sub

Para el segundo ejemplo, utilizaremos otra forma: Componemos la función con una cadena de texto y llamamos a la fórmula.

Sub F_ORDENAR_2()
    Dim fin As Long, i As Long, Ordenar As Variant
    With Sheets("Hoja1")
        fin = Application.CountA(.Range("A:A"))
        'Componemos la función y la evaluamos.
        Ordenar = "=SORT(" & "A" & 2 & ":" & "A" & fin & ",1,1)"
        .Cells(2, 3) = Ordenar
        'Eliminamos referencia estructurada
        .Cells(2, 3).Replace What:="@", Replacement:="", LookAt:=xlPart, FormulaVersion:=xlReplaceFormula2
    End With
End Sub

Para el tercer ejemplo vamos a utilizar el método Evaluate:

Sub F_ORDENAR_3()
    Dim fin As Long, i As Long, Ordenar As Variant
    With Sheets("Hoja1")
        fin = Application.CountA(.Range("A:A"))
        Ordenar = Evaluate("SORT(" & "A" & 2 & ":" & "A" & fin & ",1,1)")
        For i = LBound(Ordenar) To UBound(Ordenar)
            .Cells(i + 1, 4) = Ordenar(i, 1)
            Next i
    End With
End Sub

El resultado de aplicar estos tres métodos es este:

Aunque resulta obvio, para cambiar el orden (descendente o ascendente) de la función, debemos cambiar el signo del último 1 de la fórmula. En positivo es ascendente, en negativo es descendente.

Nota: Aunque es obvio, los códigos únicamente van a funcionar en versiones de Excel que tengan instaladas las nuevas funciones de matrices dinámicas.

Y esto es todo, espero que os haya resultado de interés 🙂

A continuación puedes descargar el archivo:

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

2 comentarios en «PROGRAMAR LA FUNCIÓN ORDENAR EN VBA»

  1. Hola, da error al correr las macros para ordenar.
    En la primera el error es en esta linea: unicos = WorksheetFunction.Sort(Range(«A2:A» & fin), 1, 1) No se puede obtener la propiedad sort de la clase WorksheetFunction
    En la segunda en esta linea: .Cells(2, 3) = unicos Error definido por la aplicacion o el objeto
    En la tercera en esa linea: For i = LBound(unicos) To UBound(unicos) No coinciden los tipos

    1. Hola Victor: Estas fórmulas hacen referencia a la función Ordenar. Es decir que para que funcionen debes tener la función instalada en el equipo ¿es así?. Si no lo es, no funcionará. Si tienes una versión antigua o que no tenga actualización de funciones, no va funcionar. Saludos.

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies