Bienvenido a la mayor comunidad de usuarios EXCEL

Regístrate ahora y podrás: / 💪 Hacer preguntas a los expertos / ⬇️ Descargar ejemplos y plantillas / 🏅 Acceder a contenidos premium

Regístrate gratis

OrdenarPorSeriePersonalizada

Hola, muy buenas!

Estoy intentando ordenar un rango de acuerdo a los valores de la columna Z por el siguiente orden personalizado de 3 strings: "REV_DFFNFCTD", "REV_LNFNDCST", "REV_INTBTERM", y luego ya el resto por orden alfabético. Para ello, uso este código, pero no funciona bien porque parece que sigue ordenando por puro orden alfabético:

Código:
Sub MacroOrdenPorSeriePersonalizada()
    'Ordenamos la columna por las strings
    'Generamos un array para una CustomList y así ordenar en base a ella
    Dim sCustomList(1 To 3) As String
        sCustomList(1) = "REV_DFFNFCTD"
        sCustomList(2) = "REV_LNFNDCST"
        sCustomList(3) = "REV_INTBTERM"
    'Añadimos la CustomList a Excel
    Application.AddCustomList ListArray:=sCustomList
    'Usar esto si quieres la CustomList en base a un rango de Excel
    ' Application.AddCustomList ListArray:=Range("D1:D3")

    ActiveSheet.UsedRange.Select
    Selection.Sort Key1:=Range("Z1"), HEADER:=xlYes, _
    OrderCustom:=Application.CustomListCount, MatchCase:=False, DataOption1:=xlSortNormal
    '¡¡¡Para usar el argumento OrderCustom tiene que haberse registrado previamente la serie personalizada!!!

    'Eliminamos la CustomList de Excel
    Application.DeleteCustomList Application.CustomListCount
    
    Range("Z1").Select
End Sub


¿Alguien por favor puede ayudarme a ver qué está fallando? Muchas gracias en cualquier caso.

Saludos!!
 

Héctor Miguel

Well-known member
Confirmo que los datos en la columna Z no son fórmulas ni nada más que valores constantes.
Por tanto, no creo que sería el problema.
la prueba que hice fue "inventando" un modelo con los datos de tu consulta, probar la macro y el resultado fue como se esperaba
convendria que adjuntes (una copia re-du-ci-da de) tu modelo (en archivo "de excel") con todo y la macro
solo asegura que se reproduce el comportamiento que describes (?)
 

Héctor Miguel

Well-known member
Adjunto un ejemplo... en el que se puede aplicar el código arriba puesto
(RE)analiza tu adjunto original, porque trae varios detalles que impiden que funcione el procedimiento que utilizas (p.ej.)

1) del codigo:
- de donde lo tomaste fue transcrito con errores (adaptaciones, omisiones, etc.)
- una forma de agilizarlo es como este:
Código:
Sub myCustomSort(): Dim llistaPersonal
  listapersonal = Array("REV_DFFNFCTD", "REV_LNFNDCST", "REV_INTBTERM")
  Application.AddCustomList ListArray:=listapersonal
  [a1].CurrentRegion.Sort Key1:=[z1], Header:=xlYes, _
    OrderCustom:=Application.CustomListCount + 1
  ActiveSheet.Sort.SortFields.Clear
  Application.DeleteCustomList Application.CustomListCount
End Sub

=> toma nota que en el Array van solo 3 elementos, en tu archivo hay 4 (probablemente en la realidad sean mas ?)

2) del archivo, es muy probable que este en riesgo de caer (o ya cayo) en las "garras de la corrupcion" (?)
- ERA una tabla (listObject) que convertiste a rango (PERO...)
- el "UsedRange" incluye sendas columnas SIN datos (es necesario ELIMINARLAS y hacer un "reset" al usedrange)
- las celdas de la columna "Z" ("REV_DFFNFCTD", etc.) traen tambien sendos espacios al final (hay que LIMPIAR)
- las celdas que "parecen" vacias, NO lo estan, contienen "rastros de algo" (esto pudiera NO ser de impacto, solo lo comento)

corrigiendo los puntos en el archivo, ya puedes ejecutar la propuesta de macro
si no das en el clavo, comentas ? (para adjuntar TU modelo corregido y funcionando)
 
Hola de nuevo, Héctor Miguel!

Pues la verdad que siguiendo tus consejos he conseguido hacer funcionar la macro! :) .

Eso sí, tengo una duda. Es verdad que tú pones OrderCustom:=Application.CustomListCount + 1, lo cual es exactamente igual a como lo encontré en una web. No obstante, no entiendo porqué añadir 1 al nº de CustomList que hay, pues si acabas de crear una nueva serie de relleno con el comando AddCustomList , la serie a la que debería hacer referencia debería ser la última, y no la última más 1... ¿o por contra me estoy perdiendo algo aquí? :unsure:

Por cierto, es verdad que en mi archivo hay 4 elementos. De hecho, la idea es que puede haber mucho más, pero la macro tiene que ordenar poniendo los 3 primeros "REV_DFFNFCTD", "REV_LNFNDCST", "REV_INTBTERM" y después el resto por orden alfabético.

Mil gracias!

Saludos
 

Héctor Miguel

Well-known member
OrderCustom:=Application.CustomListCount + 1, lo cual es exactamente igual a como lo encontré en una web. No obstante, no entiendo porqué añadir 1 al nº de CustomList que hay, pues si acabas de crear una nueva serie de relleno con el comando AddCustomList
si lo viste en una web (sus razones tendria, no ?), pero NO lo probaste "tal como lo viste"...
como la (nueva) lista la creaste "al vuelo", excel no se ha "enterado" de que hay otra lista en la lista
despues de haberla utilizado, ya la cuenta en la cuenta (se entiende ?)
 
Hola de nuevo!
Sí, lo ví en la web y también pensé que tendría su razón de ser, pero por si acaso hice algunas pruebas...
Así que apliqué CustomListCount antes de añadir ninguna serie en la macro, y me salía 8 (el nª de series que ya había de antes). Y, al hacer lo mismo tras añadirla, el CustomListCount me mostraba 9. Por tanto, concluí que Excel sí que se entera!

En cualquier caso, el tema es que con +1 lo hace correctamente y tiro para adelante.

Mil gracias por todo!

saludos
 
Arriba