Notifications
Clear all

VBA-Sort dados de um listbox

14 Posts
3 Usuários
0 Reactions
4,673 Visualizações
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Boa tarde amigos, Essa é hard!

Tenho um listbox, chamado listbox1, preciso ordenar pela coluna 3, contando a partir do 0.

Como proceder? Valendo!

 
Postado : 02/04/2012 1:45 pm
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Já achei a função Sort, conforme código abaixo:

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
 
Postado : 02/04/2012 1:53 pm
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Agora é onde não consegui evoluir!

Tenho um listbox1 preenchido com 10 colunas, preciso que ele ordene pela 3 coluna, contando a partir do (zero) 0. No exemplo abaixo era um sort para meses do ano, por isso o numero 12.

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 &lt;= 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
 
Postado : 02/04/2012 1:55 pm
(@arthurdiegoo)
Posts: 99
Estimable Member
 

Chook, para visualizar esse problema, seria melhor você postar um modelo compactado do seu arquivo.

Tem como?

 
Postado : 02/04/2012 2:07 pm
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Segue planilha. Selecione uma grade e o que preciso é que a nome do impresso, 3 coluna, fique em ordem alfabética!

 
Postado : 02/04/2012 2:34 pm
(@arthurdiegoo)
Posts: 99
Estimable Member
 

chook, conferi sua planilha mais algumas referências estão inexistentes...

Por isso não deu para testar completamente, mas tente este código:

Sub SortListBox(oLb As MSForms.ListBox, sCol As Integer, sType As Integer, sDir As Integer)
    Dim vaItems As Variant
    Dim i As Long, j As Long
    Dim c As Integer
    Dim vTemp As Variant
     'Put the items in a variant array
    vaItems = oLb.List
     
     'Sort the Array Alphabetically(1)
    If sType = 1 Then
        For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1
            For j = i + 1 To UBound(vaItems, 1)
                 'Sort Ascending (1)
                If sDir = 1 Then
                    If vaItems(i, sCol) > vaItems(j, sCol) Then
                        For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                            vTemp = vaItems(i, c)
                            vaItems(i, c) = vaItems(j, c)
                            vaItems(j, c) = vTemp
                        Next c
                    End If
                     
                     'Sort Descending (2)
                ElseIf sDir = 2 Then
                    If vaItems(i, sCol) < vaItems(j, sCol) Then
                        For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                            vTemp = vaItems(i, c)
                            vaItems(i, c) = vaItems(j, c)
                            vaItems(j, c) = vTemp
                        Next c
                    End If
                End If
                 
            Next j
        Next i
         'Sort the Array Numerically(2)
         '(Substitute CInt with another conversion type (CLng, CDec, etc.) depending on type of numbers in the column)
    ElseIf sType = 2 Then
        For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1
            For j = i + 1 To UBound(vaItems, 1)
                 'Sort Ascending (1)
                If sDir = 1 Then
                    If CInt(vaItems(i, sCol)) > CInt(vaItems(j, sCol)) Then
                        For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                            vTemp = vaItems(i, c)
                            vaItems(i, c) = vaItems(j, c)
                            vaItems(j, c) = vTemp
                        Next c
                    End If
                     
                     'Sort Descending (2)
                ElseIf sDir = 2 Then
                    If CInt(vaItems(i, sCol)) < CInt(vaItems(j, sCol)) Then
                        For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                            vTemp = vaItems(i, c)
                            vaItems(i, c) = vaItems(j, c)
                            vaItems(j, c) = vTemp
                        Next c
                    End If
                End If
                 
            Next j
        Next i
    End If
     
     'Set the list to the array
    oLb.List = vaItems

End Sub

Para ativálo:

Run "SortListBox", ListBox1, 0, 1, 1 ( Alfabético, ascendente )
Run "SortListBox", ListBox1, 0, 1, 2 ( Alfabético, descendente )

Espero que ajude, qualquer coisa vamos adaptando!

 
Postado : 02/04/2012 3:53 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Chook, não cheguei a testar as rotinas que postou,

Arthur, pelo que vi na rotina que postou, acredito que você se baseou no link abaixo:
Sort Listbox Alphabetically Or Numerically
http://www.ozgrid.com/forum/showthread.php?t=71509

A rotina funciona corretamente, desde que o Tipo de dado não seja DATA, então me lembrei que tempos atraz precisei de classificar listbox e cheguei a inciar uma adpatação para esta rotina, mas adicionando o Tipo DATA, então resolvi hoje terminar o que eu havia começado em 2011, e postei o anexo no Forum Biblioteca, deem uma olhada.

O anexo ajustei para que se selecione por qual coluna queremos classificar e qual o tipo de dados.

Classificar Listbox por tipos de dados - Numericos, Texto ou Datas
viewtopic.php?f=21&t=3980

[]s

 
Postado : 02/04/2012 8:17 pm
(@arthurdiegoo)
Posts: 99
Estimable Member
 

Sim Mauro, agora que conferi é essa a fonte, aliás obrigado, eu tinha esse código em uma database que fiz a muito tempo, não lembrava de onde havia tirado.
( Na época que ameaçaram o compartilhamento de arquivos com o Sopa e Pipa )

Lindo seu modelo Mauro, agora quando eu precisar de classificar listbox já sei onde procurar =D

 
Postado : 02/04/2012 8:38 pm
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Nossa, não entendi nada, vou dar uma estudada! Grato a todos!

 
Postado : 03/04/2012 5:50 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Chook, não cheguei a testar as rotinas que postou,

Arthur, pelo que vi na rotina que postou, acredito que você se baseou no link abaixo:
Sort Listbox Alphabetically Or Numerically
http://www.ozgrid.com/forum/showthread.php?t=71509

A rotina funciona corretamente, desde que o Tipo de dado não seja DATA, então me lembrei que tempos atraz precisei de classificar listbox e cheguei a inciar uma adpatação para esta rotina, mas adicionando o Tipo DATA, então resolvi hoje terminar o que eu havia começado em 2011, e postei o anexo no Forum Biblioteca, deem uma olhada.

O anexo ajustei para que se selecione por qual coluna queremos classificar e qual o tipo de dados.

Classificar Listbox por tipos de dados - Numericos, Texto ou Datas
viewtopic.php?f=21&t=3980

[]s

Show de bola!

 
Postado : 03/04/2012 5:51 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Perfeito Mauro, agora tem mais uma questão, como faço para que não coloque a 1ª linha no sort! Pois é o cabeçalho!

 
Postado : 03/04/2012 6:06 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Agora sou MEMBRO VIP!!! Só com minhas dúvidas! :)

 
Postado : 03/04/2012 6:09 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Consegui!!!

Na rotina abaixo na linha For i = LBound(vaItems, 1) + 1 To UBound(vaItems, 1) - 1 somei +1 ao LBound(vaItems, 1) ai ele pulou a primeira linha!

    Sub SortListBox(oLb As MSForms.ListBox, sCol As Integer, sType As Integer, sDir As Integer)
        Dim vaItems As Variant
        Dim i As Long, j As Long
        Dim c As Integer
        Dim vTemp As Variant
       
        'Put the items in a variant array
        vaItems = oLb.List
       
        'Sort the Array Alphabetically(1)
        If sType = 1 Then
            For i = LBound(vaItems, 1) + 1 To UBound(vaItems, 1) - 1
 
Postado : 03/04/2012 6:39 am
(@arthurdiegoo)
Posts: 99
Estimable Member
 

Exatamente o que eu ia observar, se você quiser tirar uma linha intermediária ( ou a última ) é quase o mesmo processo, porém, ao invés de mudar o primeiro termo, você iria mudar o valor dps do To UBound(vaItems, "variável") e definindo essa variável como a contagem de termos de sua listbox.

Isso é bom de se observar, tendo em vista que no seu modelo possuia uma linha de controle, se não me engano.

 
Postado : 03/04/2012 6:47 am