Orden personalizado usando Excel sin lista personalizada

Orden personalizado usando Excel sin lista personalizada

Quiero poder ordenar filas de Excel donde se ven los datos

Column - 1                 Other Columns

701-GBL-1843-MLMK          blah
566-JJB-2785-MYJW
254-WYD-3220-NAND
884-GLE-2843-FRYA

Y quiero poder ordenar los datos por el tercer parámetro, de modo que los compare por los números en el medio de la cadena, para que termine como

701-GBL-1843-MLMK
566-JJB-2785-MYJW
884-GLE-2843-FRYA
254-WYD-3220-NAND

¿Hay alguna manera de hacer esto, en lugar de hacer una lista personalizada que tendrá 100000000000000 elementos?

Básicamente quiero saber cómo escribir código para Excel donde puedo hacer una comparación personalizada que será como

seudo:

mycompare(cell1, cell2):
    if(cell1's third param > cell2's third param):
        return GREATER
    if(cell1's third param < cell2's third param):
        return LESS
    return EQUAL

sort(myWorksheet, mycompare)

No hace falta decir que no sé programar ni utilizar VB. Lo siento.

Respuesta1

Crea una columna auxiliar. En la fila 2 de esa columna (suponiendo que la fila 1 tenga encabezados), ingrese la fórmula

=MID(A2,9,4)

Esto extraerá el "tercer parámetro" del valor de la primera columna. Luego ordene en la columna de ayuda:

ordenar en la columna de ayuda

Respuesta2

El enfoque que yo adoptaría es generar una columna adicional de datos. Suponiendo que el formato de sus valores en la columna uno siempre tenga una longitud fija como en su ejemplo, usaría =MID(A2,9,4)para extraer el tercer elemento en una celda separada, para que luego pueda ordenar en esa columna. Mi ejemplo de fórmula selecciona los 4 caracteres comenzando en la posición del noveno carácter, lo que parece funcionar para los ejemplos de datos mostrados.

Si necesita una fórmula que extraiga el tercer elemento basándose en encontrar los guiones segundo y tercero y el número entre ellos, también se puede hacer, solo necesito jugar con ese para encontrar el enfoque más corto, pero se puede hacer fácilmente. .

Respuesta3

Sé que tienes una respuesta, pero como preguntaste cómo hacerlo con VBa

Option Explicit

Sub Testing()

Start (False) ' large to small
Start (True) ' small to big

End Sub

Sub Start(fromSmallToBig As Boolean)

Dim myRow As Integer
myRow = 1

Do While (Range("A" & myRow).Value <> "")

    Dim currentValue As String
    currentValue = Range("A" & myRow).Value

    Dim nextValue As String
    nextValue = Range("A" & myRow + 1).Value

    If (nextValue = "") Then
    Exit Do
    End If

    Dim first() As String
    first = Split(currentValue, "-")

    Dim second() As String
    second = Split(nextValue, "-")


    If (fromSmallToBig) Then
        Call Sorting(first(2), second(2), myRow, nextValue, currentValue)
    Else
        Call Sorting(second(2), first(2), myRow, nextValue, currentValue)
    End If

    myRow = myRow + 1

Loop

End Sub

Sub Sorting(first As String, second As String, myRow As Integer, nextValue As String, currentValue As String)

      If first > second Then

        Dim rowOne() As Variant
        rowOne = Rows(myRow).Value

        Dim rowTwo() As Variant
        rowTwo = Rows(myRow + 1).Value

        Rows(myRow).Value = rowTwo
        Rows(myRow + 1).Value = rowOne

        myRow = 0 ' start all over again, not efficient but, simpler code

    End If

End Sub

Esto también significa que no necesita tener columnas adicionales solo para ordenar, aunque esto puede no ser algo bueno (la respuesta de Scott le permite usar el poder de Excel, mientras que mi respuesta de VBa no es ninguna campana y puede que no lo sea). muy eficiente con datos muy grandes)

información relacionada