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
Preciso saber para organizar um array com 5 campos sendo que terei que organizar 3
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
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
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
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.
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
Teria como ordenar uma lista com mais de uma coluna e com opção de escolha de colunas a serem ordenadas?
jose,
Aí complica um pouco mais. Melhor no fórum:
http://www.tomasvasquez.com.br/forum
Abraços
Tomás