Classificação personalizada usando o Excel sem lista personalizada

3

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.

    
por Smith 26.07.2014 / 03:18

3 respostas

1

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:

    
por 26.07.2014 / 04:10
1

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.

    
por 26.07.2014 / 04:11
0

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)

    
por 28.07.2014 / 13:48