es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

VBA para AutoFiltro Ordenar SortFields no ordenando con clasificaciones de columnas adicionales.

Tengo una matriz de datos varias filas hacia abajo desde la parte superior. Tengo un código VBA de trabajo que limita los datos con un Rango y los almacena en una variable. Luego los redimensiona para incluir una fila de encabezado, borra el filtro y luego lo vuelve a agregar según el rango seleccionado.

En ese punto, quiero ordenar los datos por 3 filas.

Utilizo Cells.Find para encontrar el título de la columna que quiero y luego ordenar la fila y la columna en variables. Agrego 1 a la variable Column y la almaceno como una variable para la siguiente ordenación…

He probado cada uno de los comandos de ordenación y funcionan de forma independiente, pero no puedo hacer que funcionen en el orden combinado Fecha:, luego Prioridad:, luego Estado:.

Gracias por la ayuda de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para ordenar los datos por filas de a 3, se puede usar el siguiente código VBA:

    Cells.Find(What:="Due:", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
    
    Dim DueRowNumber As Long, DueColumnNumber As Long
    DueRowNumber = ActiveCell.Row
    DueColumnNumber = ActiveCell.Column
    
    Dim PriorityRowNumber As Long, PriorityColumnNumber As Long
    PriorityRowNumber = ActiveCell.Row
    PriorityColumnNumber = ActiveCell.Column + 1
    
    Dim StatusRowNumber As Long, StatusColumnNumber As Long
    StatusRowNumber = ActiveCell.Row
    StatusColumnNumber = ActiveCell.Column + 2
    
    With ActiveWorkbook.Worksheets("Action Items").Sort
        .SortFields.Clear
        .SortFields.Add Key:=Cells(DueRowNumber, DueColumnNumber), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortTextAsNumbers
        .SortFields.Add Key:=Cells(PriorityRowNumber, PriorityColumnNumber), SortOn:=xlSortOnValues, _
            Order:=xlAscending, CustomOrder:="High,High-Med,Med,Med-Low,Low", DataOption:=xlSortNormal
        .SortFields.Add Key:=Cells(StatusRowNumber, StatusColumnNumber), SortOn:=xlSortOnValues, _
            Order:=xlDescending, CustomOrder:="Late,In Work,Not Started,On Hold,Completed", _
            DataOption:=xlSortNormal
        .SetRange Range("A1").CurrentRegion
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    

    Este código primero encuentra la celda con el encabezado “Due:” usando Cells.Find, y luego determina los números de fila y columna para esta celda y las columnas correspondientes para “Priority:” y “Status:”. Luego se utiliza el método SortFields del objeto Sort para agregar tres claves de ordenamiento, una para cada una de las columnas, cada una con sus propias opciones de ordenamiento. El método SetRange se utiliza para especificar el rango a ordenar, en este caso toda la tabla comenzando desde la celda A1. Por último, se establecen las opciones de ordenamiento y se aplica el ordenamiento con el método Apply. Esto debería ordenar los datos primero por fecha, luego por prioridad y por último por estado.

Comments are closed.