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:
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)