Página 1 de 1

LISTBOX com dados FILTRADOS e ORDENADOS - RESOLVIDO

Enviado: 28 Jan 2022 às 13:37
por JCabral
Boa tarde

Mais uma vez pedindo ajuda.
Tenho uma planilha de registo de km's, ou seja, DATA, KmInicial, KmFinal e MATRICULA e gostaria na USERFORM de Filtrar, Ordenar e apresentar os dados consoante o mês numa ListBox.

Consegui Filtrar os dados em função dos meses, basta clicar nos Labels dos meses, mas não não consegui nem ordenar - do inicio do mês para o fim do mês - nem consegui mostrar os dados filtrados e ordenados na Listbox.

E era essa a ajuda que precisava ou seja ordenar os dados em função do mês escolhido e apresenta-los na ListBox.
Gostaria que, se possível, não fosse feito através de copiar os dados para outra planilha, depois ordena-los e no fim traze-los para a ListBox

Obrigado
Jorge Cabral

Re: LISTBOX com dados FILTRADOS e ORDENADOS

Enviado: 28 Jan 2022 às 15:13
por osvaldomp
Salve, Jorge.
#
JCabral escreveu: 28 Jan 2022 às 13:37 E era essa a ajuda que precisava ou seja ordenar os dados em função do mês escolhido e apresenta-los na ListBox.
A ordenação pode ser feita na planilha e os dados carregados já ordenados na ListBox ?

Ou você quer que os dados sejam carregados sem mexer na ordenação da planilha ?

Re: LISTBOX com dados FILTRADOS e ORDENADOS

Enviado: 28 Jan 2022 às 15:31
por JCabral
Boa tarde Osvaldo

Boa pergunta, julgo que fica mais fácil ordenar na planilha e carregar os dados já ordenados.
Mas, por uma questão puramente académica confesso que gostava de ver tb a outra solução.

Muito obrigado mais uma vez

Re: LISTBOX com dados FILTRADOS e ORDENADOS

Enviado: 29 Jan 2022 às 18:06
por osvaldomp
Olá, Jorge.

Fiz a solução que julgo ser a mais simples. Utilizei um intervalo auxiliar (K:O) para ordenar os dados filtrados e depois carregá-los na ListBox.

A alternativa de não utilizar intervalo auxiliar talvez fosse carregar os dados filtrados em algum tipo de Collection e aí ordenar, mas nesse caminho me perece que o código ficaria bem mais complexo.
Código: Selecionar todos
Sub FilterRows(theMonth As Integer)
 Dim LR     As Long
  Application.ScreenUpdating = False
  TurnOFFAutoFilter
  Columns("K:O") = ""
  LR = Cells(Rows.Count, "A").End(xlUp).row
  On Error Resume Next
  lstKmsDiarios.List = ""
  Range("A1").AutoFilter Field:=1, Operator:=xlFilterDynamic, Criteria1:=theMonth
  If ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(12).Count > 1 Then
   Range("A2:E" & LR).Copy [K1]
   ActiveSheet.ShowAllData
   Range("K1:O" & Cells(Rows.Count, "K").End(xlUp).row).Sort Key1:=[K1], Order1:=xlAscending
   lstKmsDiarios.List = Range("K1:O" & Cells(Rows.Count, "K").End(xlUp).row).Value 'rng.Cells.Value
  End If
  ActiveSheet.ShowAllData
  Columns("K:O") = ""
End Sub
#
obs. falta setar manualmente nas propriedades da ListBox:
1. ColumnCount ~~~> 5
2. ColumnWidths ~~~> 55 pt;65 pt;55 pt;55 pt;70 pt

Re: LISTBOX com dados FILTRADOS e ORDENADOS

Enviado: 29 Jan 2022 às 21:42
por JCabral
Boas Caro Osvaldo

Eu diria que essa solução estava quase perfeita, na fosse o problema das datas que me aparecem no formato "mm-dd-aaaa" e não atender ao meu ultimo requisito do tópico .
O problema é nem sempre ser possível colocar aqui a planilha "verdadeira" mas aquele ultimo requisito reflecte a necessidade da planilha real, ou seja será que não posso fazer o filtro no range dos dados sem copiar para outro local e depois, dos dados filtrados e ordenados, adicionar os dados à Listbox ? É que copiar par outro local vai mexer com muitos dados. E depois tem o problema da formatação da data.

Re: LISTBOX com dados FILTRADOS e ORDENADOS

Enviado: 30 Jan 2022 às 09:03
por osvaldomp
JCabral escreveu: 29 Jan 2022 às 21:42
... o problema das datas que me aparecem no formato "mm-dd-aaaa"
Aqui tanto na planilha quanto na ListBox as datas aparecem no formato dd/mm/aaaa.

... será que não posso fazer o filtro no range dos dados sem copiar para outro local
Pode sim, basta você manter a tabela ordenada e após aplicar o Filtro fazer um Loop pelas linhas visíveis e então carregá-las na ListBox via método AddItem, pois me parece que não é possível carregar em massa somente as linhas filtradas, por isso optei pelo uso de intervalo auxiliar, pois suponho que seja bem mais rápido do que o Loop.

É que copiar par outro local vai mexer com muitos dados.
O que você quer dizer com "mexer com muitos dados"? É que a quantidade de dados filtrados será grande? Se for isso, não vejo problemas, pois a operação é em massa e rápida.
Por outro lado, se você quis dizer que o uso do intervalo auxiliar irá interferir com dados existentes ou com fórmulas, então você pode utilizar outro intervalo ou até outra planilha. Não entendo qual é o impedimento para isso.
Ou "mexer com muitos dados" tem outro significado?


E depois tem o problema da formatação da data.
Como comentei acima, aqui sempre aparecem como dd/mm/aaaa.