Macro para ordenar alfabéticamente por varios campos

Tengo un macro que hace una serie de procesos y luego me arroja el siguiente resultado:

 Individuo         Exp        Box

SFW00119       H12        Box3

SFW09201       H1          Box5

SFW03054       A14        Box11

SFW05662       A1          Box11

SFW07777       H75        Box2

SFW03392       E12        Box1

SFW04331       B12        Box1

Es mucho más largo… y necesito ordenar partiendo como parámetro el campo Box. Yo logro ordenar los box pero no lo puedo extender a al campo Exp e Individuo.

Intente con listas personalizadas pero el campo Exp utiliza las letras A hasta H y cada una puede tomar los valores 1.. 100

Utilizo excel2010

2 Respuestas

Respuesta
1

No entendí a que te refieres con: "extender a al campo Exp e individuo".

¿Lo qué quieres ordenar lo quieres hacer con una macro?

Quieres ordenar por Box, ¿luego por Exp y luego por individuo?

Puedes poner exactamente en qué columnas y en qué fila empiezan tus datos y en otra tabla poner cómo quieres los datos después de ordenarlos.

Con la siguiente macro ordenas la columna C, luego la B y por último la A

Sub Macro5()
'por.DAM
    u = Range("A" & Rows.Count).End(xlUp).Row
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("C2:C" & u), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("B2:B" & u), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("A2:A" & u), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Hoja1").Sort
        .SetRange Range("A1:C" & u)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Prueba y me comentas

Hola Dante estuve probando tu macro, pero es lo mismo que logro yo solo me ordena alfabéticamente la columna c no me ordena la b ni la A.

Yo necesito que en columna C queden todos los Box1, 2, 3, ... y en la columna de las letras B me quede para los box1 todos ordenados A1, A2, C5, C10, C11, H3, H4, H96... para todos los Box2 lo mismo y así sucesivamente, siguiendo un orden por numero de menor a mayor. Y luego cada individuo en la columna A.

Tu macro igual que el mio solo ordena en "orden" los box!

Espero tus comentarios

Muchas gracias!

Ahora estoy más confundido, puedes enviarme tu archivo con un rango mayor de datos, en una hoja me dices cómo los tienes y en otra hoja pon cómo los quieres.

Hola Dante ya te envíe la planilla. Muchas gracias

sdos

Te envié el archivo con la macro, lo que hice fue separar la columna para ordenar por separado las letras y los números. Si la columna de Exp, siempre tiene una letra y después números y si la columna de Box, siempre tiene 3 letras y después números, entonces no tendrás problemas, pero si eso cambia, debemos adecuar la macro.

Sub Macro1()
'Por.Dante Amor
    Application.DisplayAlerts = False
    Set h1 = Sheets("Resultado primer paso")
    h1.Columns("C:C").TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
        FieldInfo:=Array(Array(0, 1), Array(3, 1)), TrailingMinusNumbers:=True
    h1.Columns("C:C").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    h1.Columns("B:B").TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
        FieldInfo:=Array(Array(0, 1), Array(1, 1)), TrailingMinusNumbers:=True
    h1.Range("E1") = "Box2"
    u = h1.Range("A" & Rows.Count).End(xlUp).Row
    With h1.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("D2:D" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("E2:E" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("B2:B" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("C2:C" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("A2:A" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A1:E" & u)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    h1.Range("F1:F" & u) = "=CONCATENATE(RC[-2],RC[-1])"
    h1.Columns("F:F").Copy
    h1.Range("D1").PasteSpecial Paste:=xlPasteValues
    Columns("E:F").Delete Shift:=xlToLeft
    h1.Columns("D:D").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    h1.Range("D1:D" & u) = "=CONCATENATE(RC[-2],RC[-1])"
    h1.Columns("D:D").Copy
    h1.Range("D1").PasteSpecial Paste:=xlPasteValues
    Columns("B:C").Delete Shift:=xlToLeft
End Sub

Qué bien que ya te funcionó!

No olvides valorar la respuesta

Respuesta

Puedes hacerlo de esta forma que es muy óptima y simple.

Sub ordenar()
Columns("A:C").Sort key1:=Range("C2"), key2:=Range("B2"), key3:=Range("A2"), Header:=xlYes
End Sub

Se supone que los datos empiezan en la segunda fila y la primera es encabezamiento.  Si empezaran el la primera sobraría la parte del Header:=xlYes

Hola Valero Angel muchas gracias por tu aporte pero solo me ordena la columna C yo necesito que en la b las letras tambien queden ordedenadas en funcion del numero que tengan de menor a mayor Ej

indv1             A3           Box1

indv5             A5           Box1

indv34          A13          Box1

indv 32         H1           Box1

indv2            H2           Box1

El macro debe contemplar los numeros de la columna b y no se como hacerlo...

espero tus comentarios

muchas gracias

Creo que no he entendido lo que querías decir. Yo he hecho una macro que ordena filas, es decir, cuando cambia una celda cambia toda la fila. Eso es lo normal cuando se pregunta ordenar por varios campos, cada fila corresponde a datos de una persona (por ejemplo y se cambia toda entera. Entonces yo habia supuesto que se ordenaba primero por la tercera columna, luego por la segunda y finalmente por la primera.

Pero por lo que dices entiendo que lo que quieres es que simplemente te ordene las tres columnas. Eso sería asi

Sub OrdenarLasColumnas()
Columns("A:A").Sort key1:=Range("A2"), Header:=xlYes
Columns("B:B").Sort key1:=Range("B2"), Header:=xlYes
Columns("C:C").Sort key1:=Range("C2"), Header:=xlYes
End Sub

Pero la pregunta "ordenar por varios campos" invitaba a hacer lo que hice al principio, la pregunta para esto sería "ordenar varias caolumnas"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas