Crie uma coluna auxiliar. Na linha 2 dessa coluna (supondo que a linha 1 tenha cabeçalhos), insira a fórmula
=MID(A2,9,4)
Isso extrairá o "terceiro parâmetro" do valor na primeira coluna. Em seguida, classifique na coluna auxiliar:
Eu quero poder classificar as linhas do Excel onde os dados se parecem com
Column - 1 Other Columns
701-GBL-1843-MLMK blah
566-JJB-2785-MYJW
254-WYD-3220-NAND
884-GLE-2843-FRYA
E eu quero poder classificar os dados pelo terceiro parâmetro, para que eu possa comparar com os números no meio da string, para que ele acabe como
701-GBL-1843-MLMK
566-JJB-2785-MYJW
884-GLE-2843-FRYA
254-WYD-3220-NAND
Existe uma maneira de fazer isso, em vez de criar uma lista personalizada que terá um comprimento de 100000000000000
Basicamente eu quero querer saber como escrever código para excel onde eu posso fazer uma comparação personalizada que será como
pseudo:
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)
Escusado será dizer que não sei programar ou utilizar o VB. Desculpe.
A abordagem que eu tomaria é gerar uma coluna extra de dados. Supondo que o formato de seus valores na coluna um seja sempre o comprimento fixo, como em seu exemplo, eu usaria,
=MID(A2,9,4)
para extrair o terceiro elemento em uma célula separada, para que você possa classificar nessa coluna. O exemplo da minha fórmula seleciona o caractere 4 começando na posição do 9º caractere, o que parece funcionar para os exemplos de dados mostrados.
Se você precisar de uma fórmula que extraia o terceiro elemento com base na localização do segundo e terceiro traços e o número entre eles, também pode ser feito, só preciso tocar com esse para encontrar a abordagem mais curta, mas pode ser feito facilmente.
Eu sei que você tem uma resposta, mas desde que você perguntou como fazer isso com 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
Isso também significa que você não precisa ter colunas extras apenas para classificar, embora isso possa não ser uma coisa boa (a resposta de Scott permite que você use o poder do Excel, enquanto minha resposta VBa não é sinônimo de pode não ser muito eficiente com dados muito grandes)
Tags microsoft-excel vba