Frequentemente precisamos criar rotinas para ordenar dados no excel, porém como todos sabemos a Excel já possue essa funcionalidade. Acreditando que nossa base estará tabulada adequadamente, criei uma esta função para auxiliar na ordenação dos dados. Se bem usada nunca mais precisaremos escrever outra rotina para ordenar dados.
Sub OrdenaTabela(NomeTabela As String, NomeColuna As String, Optional NomeColuna2 As String)
ActiveWorkbook.Worksheets(NomeTabela).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(NomeTabela).Sort.SortFields.Add Key:=Coluna(NomeTabela, NomeColuna) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
If NomeColuna2 <> "" Then
ActiveWorkbook.Worksheets(NomeTabela).Sort.SortFields.Add Key:=Coluna(NomeTabela, NomeColuna2) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
End If
With ThisWorkbook.Worksheets(NomeTabela).Sort
.SetRange ThisWorkbook.Worksheets(NomeTabela).UsedRange
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Function Coluna(Tabela As String, Nome As String) As Range
Dim i As Integer
Dim nmCell1 As String
Dim nmCell2 As String
Dim numCols As Long
Dim numLins As Long
numCols = ThisWorkbook.Worksheets(Tabela).UsedRange.Columns.Count
numLins = ThisWorkbook.Worksheets(Tabela).UsedRange.Rows.Count
For i = 1 To numCols
If UCase(ThisWorkbook.Worksheets(Tabela).Cells(1, i)) = UCase(Nome) Then
nmCell1 = ThisWorkbook.Worksheets(Tabela).Cells(2, i).Address
nmCell2 = ThisWorkbook.Worksheets(Tabela).Cells(numLins, i).Address
Set Coluna = ThisWorkbook.Worksheets(Tabela).Range(nmCell1 & ":" & nmCell2)
'Exit For
End If
Next
End Function
Reparem que temos a possibilidade de ordenar por até duas colunas diferentes. E nada impede o desenvolvedor de aprimorar ainda mais a rotina.
Abraços,
Rafael