VBA – Ordenando Arrays e Listas
Uma funcionalidade não nativa do VBA é a ordenação, seja lá ela qual for.
Ela comumente é necessária em Arrays e controles de lista, como ListBox e ComboBox. Métodos de ordenação existem aos montes. Neste caso, usarei o QuickSort, escrito pelo camarada Frederik do http://users.skynet.be/am044448/Programmeren/. O código abaixo faz a ordenação de um Array passado por parâmetro.
Private Sub QuickSort(strArray() As String, intBottom As Integer, intTop As Integer) Dim strPivot As String, strTemp As String Dim intBottomTemp As Integer, intTopTemp As Integer intBottomTemp = intBottom intTopTemp = intTop strPivot = strArray((intBottom + intTop) \ 2) While (intBottomTemp <= intTopTemp) While (strArray(intBottomTemp) < strPivot And intBottomTemp < intTop) intBottomTemp = intBottomTemp + 1 Wend While (strPivot < strArray(intTopTemp) And intTopTemp > intBottom) intTopTemp = intTopTemp - 1 Wend If intBottomTemp < intTopTemp Then strTemp = strArray(intBottomTemp) strArray(intBottomTemp) = strArray(intTopTemp) strArray(intTopTemp) = strTemp End If If intBottomTemp <= intTopTemp Then intBottomTemp = intBottomTemp + 1 intTopTemp = intTopTemp - 1 End If Wend 'faz a chamada recursiva a si própria até que lista esteja preenchida If (intBottom < intTopTemp) Then QuickSort strArray, intBottom, intTopTemp If (intBottomTemp < intTop) Then QuickSort strArray, intBottomTemp, intTop End Sub
A função não tem um retorno, mas como um array passado por parâmetro para um função é sempre por referência, após a execução desta seu Array estará ordenado em ordem crescente.
Para testar o funcionamento da função, crie um userForm no VBA. Coloque nele um ListBox e um CommandButton, sem se preocupar com alterar seus nomes. Coloque no código do Form a função QuickSort mostrada acima, mais o código abaixo.
Private Sub CommandButton1_Click() Dim MyArray(12) As String Dim i As Long 'caso não haja itens na lista, não é necessário fazer ordenação If ListBox1.ListCount <= 1 Then Exit Sub 'alimenta o array For i = 0 To ListBox1.ListCount - 1 MyArray(i) = ListBox1.List(i, 0) Next i 'ordena o array QuickSort MyArray, LBound(MyArray), UBound(MyArray) 'limpa o listbox ListBox1.Clear 'usa o array ordenado para preencher o listbox For i = 1 To UBound(MyArray) ListBox1.AddItem MyArray(i) Next i End Sub Private Sub UserForm_Initialize() 'preenche o listbox com os meses do ano For i = 1 To 12 ListBox1.AddItem MonthName(i, False) Next End Sub
Ao executar o form da primeira vez, pode-se ver que o ListBox é preenchido com os meses do ano através da função MontName.
O código colocado no evento click do botão cria um array de string de tamanho 12, preenche o array com a lista de valores presente no listbox, ordena o array através da função QuickSort e re-preenche o listbox.
Uma forma bem simples de fazer ordenação em listas sempre precisar ficar re-pensando no código sempre que precisar.
Abraços
Tomás

54 Convidados
4 Bots
dezembro 23rd, 2008 at 17:04
Preciso saber para organizar um array com 5 campos sendo que terei que organizar 3
dezembro 24th, 2008 at 15:58
Gilmar,
Creio que não há função pronta que faça isso. Sugiro que monte um sub-array com os três primeiros itens, ordene e em seguida remonte o array original com todos os itens.
Espero que ajude.
Abraços
Tomás
outubro 1st, 2009 at 9:08
Bom dia amigo, gostaria de saber pra que server nas suas verificações os caracteres “<”. Inseridos nos whiles e nos Ifs. Acontece que no meu excel isso não está sendo reconhecido. Utilizo Excel 2000 VB 6.0
oBRIGADO
outubro 1st, 2009 at 11:18
Higor,
O símbolo “< " quer dizer "menor que" no VBA, da mesma forma que em expressões matemáticas.
Por exemplo:
A < B ==> A é menor que B
Num teste condicional:
A = 1
B = 2
IF A < B ==> Verdadeiro.
Espero que ajude.
Abraços
Tomás
março 20th, 2010 at 12:28
Caro Thomas.
Parabens pelo artigo muito bom..
Tentei baixar o exemplo e não consegui..
Fiquei com a mesma dúvida de um colega, tenho um lista que tem 5 campos e queria ordenar os campos com esse método.
março 20th, 2010 at 17:28
Flavio,
Testei o link e funcionou muito bem. Tentou outro navegador?
Para discussões sobre nossos modelos, dê uma olhada no nosso fórum:
http://www.tomasvasquez.com.br/forum
Abraços
Tomás
agosto 6th, 2010 at 10:56
Teria como ordenar uma lista com mais de uma coluna e com opção de escolha de colunas a serem ordenadas?
agosto 6th, 2010 at 11:39
jose,
Aí complica um pouco mais. Melhor no fórum:
http://www.tomasvasquez.com.br/forum
Abraços
Tomás