Notifications
Clear all

VBA-Sort dados de um listbox

14 Posts
3 Usuários
0 Reactions
4,715 Visualizações
chook
(@chook)
Posts: 197
Estimable 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!

Atenciosamente,

Alex Lacerda
[email protected]

 
Postado : 02/04/2012 1:45 pm
chook
(@chook)
Posts: 197
Estimable 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

Atenciosamente,

Alex Lacerda
[email protected]

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

Atenciosamente,

Alex Lacerda
[email protected]

 
Postado : 02/04/2012 1:55 pm
arthurdiegoo
(@arthurdiegoo)
Posts: 99
Trusted Member
 

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

Tem como?

Atenciosamente,

Arthur Andrade
Seja Cordial, trate os outros membros com respeito!

Caso sua dúvida tenha sido resolvida, clique no botão verde no canto direito superior da sua tela, marcando como [RESOLVIDO]
Agradeça quem te ajudou! Clique na mãozinha!

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

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

Atenciosamente,

Alex Lacerda
[email protected]

 
Postado : 02/04/2012 2:34 pm
arthurdiegoo
(@arthurdiegoo)
Posts: 99
Trusted 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!

Atenciosamente,

Arthur Andrade
Seja Cordial, trate os outros membros com respeito!

Caso sua dúvida tenha sido resolvida, clique no botão verde no canto direito superior da sua tela, marcando como [RESOLVIDO]
Agradeça quem te ajudou! Clique na mãozinha!

 
Postado : 02/04/2012 3:53 pm
Fernando Fernandes
(@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

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 02/04/2012 8:17 pm
arthurdiegoo
(@arthurdiegoo)
Posts: 99
Trusted 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

Atenciosamente,

Arthur Andrade
Seja Cordial, trate os outros membros com respeito!

Caso sua dúvida tenha sido resolvida, clique no botão verde no canto direito superior da sua tela, marcando como [RESOLVIDO]
Agradeça quem te ajudou! Clique na mãozinha!

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

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

Atenciosamente,

Alex Lacerda
[email protected]

 
Postado : 03/04/2012 5:50 am
chook
(@chook)
Posts: 197
Estimable 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!

Atenciosamente,

Alex Lacerda
[email protected]

 
Postado : 03/04/2012 5:51 am
chook
(@chook)
Posts: 197
Estimable 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!

Atenciosamente,

Alex Lacerda
[email protected]

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

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

Atenciosamente,

Alex Lacerda
[email protected]

 
Postado : 03/04/2012 6:09 am
chook
(@chook)
Posts: 197
Estimable 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

Atenciosamente,

Alex Lacerda
[email protected]

 
Postado : 03/04/2012 6:39 am
arthurdiegoo
(@arthurdiegoo)
Posts: 99
Trusted 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.

Atenciosamente,

Arthur Andrade
Seja Cordial, trate os outros membros com respeito!

Caso sua dúvida tenha sido resolvida, clique no botão verde no canto direito superior da sua tela, marcando como [RESOLVIDO]
Agradeça quem te ajudou! Clique na mãozinha!

 
Postado : 03/04/2012 6:47 am