Como Classificar um Array em VBA

 

Anteriormente, no VBA, era difícil classificar um array.

Era necessário escrever sua própria função de ordenação ou copiar os dados para a planilha e ordená-los lá. Nenhum dos métodos era ideal.

Mas desde o Excel 2021 e 365 existe uma nova função de ordenação de planilha que podemos usar para classificar nossos arrays. Neste artigo, vou mostrar como usá-la com muitos exemplos.

Dados de Exemplo para este artigo

Este é o conjunto de dados que vamos usar neste artigo:

NomeIdadeDepartamento
Bob93 RH
Fiona31 Finanças
Ethan79 Engenharia
Ian99 Marketing
George43 Engenharia
Charlie41 RH
Julia77 Finanças
Hannah89 Marketing
Alice70 Engenharia
Diana86 RH

Você pode usar o seguinte código para testar os exemplos de ordenação. Este código lê os dados da Planilha1, ordena os dados e escreve os dados ordenados na Planilha2.

 Sub TestSort()

    ' Ler dados da planilha1
    Dim data As Variant
    data = ThisWorkbook.Worksheets("Planilha1").Range("A2:C11").Value
    
    ' Ordenar os dados
    data = WorksheetFunction.Sort(data)
    
    ' Escrever os dados ordenados na planilha2
    ThisWorkbook.Worksheets("Planilha2").Range("A2:C11").Value = data

 End Sub

A Função de Ordenação da Planilha

Os parâmetros da função Sort

array: o array ou intervalo a ser ordenado

sort_Index: um número indicando a linha ou coluna a ser ordenada.

sort_order: um número indicando a ordem de classificação desejada; 1 para ordem crescente (padrão), -1 para ordem decrescente.

By_col: um valor lógico indicando a direção de ordenação desejada; FALSO para ordenar por linha (padrão), VERDADEIRO para ordenar por coluna.

Exemplos

    ' coluna 1. Crescente. Por linha.
    data = WorksheetFunction.Sort(data, 1, 1, False)
    
    ' coluna 2. Crescente. Por linha.
    data = WorksheetFunction.Sort(data, 2, 1, False)
    
    ' coluna 3. Crescente. Por linha.
    data = WorksheetFunction.Sort(data, 3, 1, False)
    
    ' coluna 1. Decrescente. Por linha.
    data = WorksheetFunction.Sort(data, 1, -1, False)
    
    ' coluna 2. Decrescente. Por linha.
    data = WorksheetFunction.Sort(data, 2, -1, False)
    
    ' coluna 3. Decrescente. Por linha.
    data = WorksheetFunction.Sort(data, 3, -1, False)
    
    ' linha 1. Crescente. Por coluna.
    data = WorksheetFunction.Sort(data, 1, 1, True)
    
    ' linha 1. Decrescente. Por coluna.
    data = WorksheetFunction.Sort(data, 1, -1, True)

Classificando Arrays para versões anteriores do Excel

Se a nova função Sort não estiver disponível na sua versão do Excel, você precisará usar uma função como QuickSort abaixo:

 ' https://excelmacromastery.com/
 Sub QuickSort(arr As Variant, first As Long, last As Long)
  
  Dim vCentreVal As Variant, vTemp As Variant
  
  Dim lTempLow As Long
  Dim lTempHi As Long
  lTempLow = first
  lTempHi = last
  
  vCentreVal = arr((first + last) \ 2)
  Do While lTempLow <= lTempHi
  
    Do While arr(lTempLow) < vCentreVal And lTempLow < last
      lTempLow = lTempLow + 1
    Loop
    
    Do While vCentreVal < arr(lTempHi) And lTempHi > first
      lTempHi = lTempHi - 1
    Loop
    
    If lTempLow <= lTempHi Then
    
        ' Trocar valores
        vTemp = arr(lTempLow)

        arr(lTempLow) = arr(lTempHi)
        arr(lTempHi) = vTemp
      
        ' Mover para as próximas posições
        lTempLow = lTempLow + 1
        lTempHi = lTempHi - 1
      
    End If
    
  Loop
  
  If first < lTempHi Then QuickSort arr, first, lTempHi
  If lTempLow < last Then QuickSort arr, lTempLow, last
  
 End Sub

Você pode usar esta função assim:

 ' https://excelmacromastery.com/
 Sub TestSort()

    ' Criar array temporário
    Dim arr() As Variant
    arr = Array("Banana", "Melão", "Pêssego", "Ameixa", "Maçã")
  
    ' Ordenar array
    QuickSort arr, LBound(arr), UBound(arr)

    ' Imprimir arr na Janela Imediata (Ctrl + G)
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        Debug.Print arr(i)
    Next i

 End Sub

Aprenda mais sobre Excel: https://www.render.com.br/cursos/excel

 

Artigo escrito por: Paul Kelly

Compartilhe e curta!