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
controleremoto@gmail.com
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
controleremoto@gmail.com
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 <= 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
controleremoto@gmail.com
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!
Segue planilha. Selecione uma grade e o que preciso é que a nome do impresso, 3 coluna, fique em ordem alfabética!
Atenciosamente,
Alex Lacerda
controleremoto@gmail.com
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!
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
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!
Nossa, não entendi nada, vou dar uma estudada! Grato a todos!
Atenciosamente,
Alex Lacerda
controleremoto@gmail.com
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=71509A 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
controleremoto@gmail.com
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
controleremoto@gmail.com
Agora sou MEMBRO VIP!!! Só com minhas dúvidas!
Atenciosamente,
Alex Lacerda
controleremoto@gmail.com
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
controleremoto@gmail.com
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!