Notifications
Clear all

filtro listview

25 Posts
3 Usuários
0 Reactions
6,880 Visualizações
cleiton jm
(@cleiton-jm)
Posts: 115
Estimable Member
Topic starter
 

Pessoal preciso de uma força, eu tenho uma função que filtra o listview, só que quando eu carrego a plan que tem os dados(são mais de 65500 dados)mais o codigo que esto usando não faz esse filtro ele da erro,(erro em tempo de execução 6....estouro) tem como para esse erro, segue a função que uso
Private Sub TextBox2_Change()
If Me.ComboBoxCampos.ListIndex = -1 Then
MsgBox "Selecione um Campo.", 64, "Treino Listview"
Me.TextBox2 = ""
Exit Sub
End If

Dim strObjetoBuscar As String
Dim lngResultado As Long
'Dim lngColumna As Long, lngFila As Long
Dim a As Integer
Dim coluna
coluna = Me.ComboBoxCampos.ListIndex + 1
ListView1.ListItems.Clear
strObjetoBuscar = TextBox2.Value
If strObjetoBuscar = "" Then GoTo 99
strObjetoBuscar = LCase(strObjetoBuscar)
For a = 2 To 65536 aqui era 2010 aumentei para 65536
lngResultado = InStr(1, Plan1.Cells(a, coluna), strObjetoBuscar, vbTextCompare)
If lngResultado > 0 Then
Set li = ListView1.ListItems.Add(Text:=Format(Plan1.Range("A" & a).Value, "00"))
li.ListSubItems.Add Text:=Plan1.Range("B" & a).Value
li.ListSubItems.Add Text:=Plan1.Range("C" & a).Value
li.ListSubItems.Add Text:=Plan1.Range("D" & a).Value
End If
Next a
99:
Me.Label2.Caption = Format(ListView1.ListItems.Count, "00")
End Sub

 
Postado : 23/01/2012 6:59 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Enquanto alguém melhor do que não te responda poderia postar seu arquivo?

:mrgreen:

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

 
Postado : 23/01/2012 8:13 pm
cleiton jm
(@cleiton-jm)
Posts: 115
Estimable Member
Topic starter
 

Alexandre esto anexando o exemplo, tenho dois criteiros de pesquisa nele q não está funcionando, primeiro na pesquisa de cliente que me filtra dados da planilha,
segundo é um filtro, que filtra as proprias informações que consta no listview, mais só to conseguindo faze ele filtra numeros mesmo assim o filtro não ta saindo perfeito, gostaria que ele me filtrasse nomes que consta na coluna 4 no listview, se alguem puder me ajudar, como eu sei que aqui tem feras no vba axo, sei que vcs poderam me ajuda....

boa terça feira a todos!

 
Postado : 23/01/2012 9:30 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia !!!

Tentei consegui ajudar para você

Private Sub txtPesquisa_Change()
    
    If txtPesquisa.Text = "" Then
        RelatórioForm
    Else
        X = 1
        With ListView1.ListItems
            y = .Count
            While (X <= y) And (X < .Count)   ' without this 2nd condition X might become < 1
                If InStr(1, .Item(X), txtPesquisa.Text, vbTextCompare) = 0 Then
                    .Remove X      ' I don't think you need the brackets around the X here
                    X = X - 1
                    y = y - 1
                End If
                X = X + 1
            Wend
        End With
    End If
End Sub
Sub RelatórioForm()
    
    ' dim lastRow as long   ' double declaration: see top of module
    Dim lastResultRow As Long
    Dim X As Long
    Dim C As Long   ' C = column
    Dim Lvx As Integer  ' = ListViewItem index
    
    ' this is part of the code
    ' it must FOLLOW the Dim statements
    ' on error resume next ' don't use this unless you want to handle the error
    ' you have no error handling device here.
    ' therefore you should let the error show
    Application.EnableEvents = False
    ' Verifica qual a ultima célula preenchida
    With Plan1
        ' count the rows in Plan1 !!!
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
        
    lastResultRow = 2 'linha resultado
    Me.ListView1.ListItems.Clear

    ' Ciclo em todas as linhas
    For X = 2 To lastRow '1 Linha dados pequisa
        ' verifica se o valor é igual ao da pesquisa
        ' if any of these CDate conversions should fail your code will crash.
        ' Before applying this function you should examine them
        ' for their availability and capability to be converted.
        If CDate(Plan1.Cells(X, 5).Value) >= CDate(txtDataInicial.Value) _
           And CDate(Plan1.Cells(X, 5)) <= CDate(txtDataFinal) Then
            ' Copia os valores
            With ListView1.ListItems
                .Add 1, , Plan1.Cells(X, 1).Value
                Lvx = Lvx + 1
                For C = 2 To 12
                     Debug.Print X, C, Plan1.Cells(X, C).Value
                    .Item(Lvx).ListSubItems.Add C - 1, , Plan1.Cells(X, C).Value
                Next C
            End With
            lastResultRow = lastResultRow + 1
        End If
    Next
        
    Application.EnableEvents = True
End Sub

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

 
Postado : 24/01/2012 6:31 am
cleiton jm
(@cleiton-jm)
Posts: 115
Estimable Member
Topic starter
 

alexandre vc fez as alterações, não fico mais ou menos como esperava, eu gostaria que a primeira macro filtrasse as informações que está dentro do listview(segunda coluna dos nomes),mais não consigo fazer ela filtra nomes corretamente.

essa é a macro que gostaria de acertada se possivel, não consigo fazer ela filtrar a coluna nome do meu listview com precisão, agora se alguem tiver outra macro que filtra os informações que estão dentro do listview pode me mostrar se possivel

Private Sub txtPesquisa_Change()

If txtPesquisa.Text <> "" Then
X = 1
y = ListView1.ListItems.Count
While (X <= y)
If ((InStr(UCase(ListView1.ListItems.Item(X)), UCase(txtPesquisa.Text)) > 0)) Then GoTo Fim

ListView1.ListItems.Remove (X)
X = X - 1
y = y - 1
Fim:
X = X + 1
Wend
End If
If txtPesquisa = "" Then

End If
End Sub

 
Postado : 24/01/2012 10:12 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Substua por essa:

Private Sub txtPesquisa_Change()
Dim strObjetoBuscar As String
Dim lngResultado As Long
Dim lastRow As Long

'Dim lngColumna As Long, lngFila As Long
Dim a As Integer
Dim coluna
coluna = 2
ListView1.ListItems.Clear
strObjetoBuscar = txtPesquisa
If strObjetoBuscar = "" Then GoTo 99
strObjetoBuscar = LCase(strObjetoBuscar)
        lastRow = Plan1.Cells(Rows.Count, 1).End(xlUp).Row

    For a = 2 To lastRow
        lngResultado = InStr(1, Plan1.Cells(a, coluna), strObjetoBuscar, vbTextCompare)
            If lngResultado > 0 Then
 Set li = ListView1.ListItems.Add(Text:=Format(Plan1.Range("A" & a).Value, "00"))
                 li.ListSubItems.Add Text:=Plan1.Range("B" & a).Value
                 li.ListSubItems.Add Text:=Plan1.Range("C" & a).Value
                 li.ListSubItems.Add Text:=Plan1.Range("D" & a).Value
            End If
    Next a
99:
 Call SomarItens
End Sub

Acrescente mais linhas, seguindo a mesma lógica, para preencher toda sua lista.

Para esse problema: For a = 2 To 65536 aqui era 2010 aumentei para 65536

Acrescente essa linha:

lastRow = Plan1.Cells(Rows.Count, 1).End(xlUp).Row

e mude para: For a = 2 To lastRow

Será contado até a última linha preenchida.

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

 
Postado : 24/01/2012 4:50 pm
cleiton jm
(@cleiton-jm)
Posts: 115
Estimable Member
Topic starter
 

joseA deu erro (erro tempo de execução 6 "estouro"), como é muita informação dentro da planilha ele não consegue filtra, tem como eu faze assim, eu fiiltra intervalos de data no listview que já tenho essa função, e depois filtro as infomações que está dentro do listview ao inves de filtra direto da planilha, porque dentro do listview eu concentro menos infomações.

a macro que vc passo esta dando erro aqui ---- > For a = 2 To lastRow

 
Postado : 24/01/2012 5:42 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

cleiton, pelo que vi, utilizando a rotina que o José passou, é realizado exatamente o que pretende, isto se entendi corretamente.

Você filtra no ListView por data e ao digitar no campo - "txtPesquisa" o Listview vai sendo filtrado pela coluna 2 (Nome), vejano anexo com a alteração do José:

[]s

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

 
Postado : 24/01/2012 8:25 pm
cleiton jm
(@cleiton-jm)
Posts: 115
Estimable Member
Topic starter
 

Bom dia mauro coutinho, realmente ele funciona, mais quando tem pouco informações para filtrar, mais quando a planilha esta com mais de 40.000 linhas preenchidas ele da esse erro e não filtra, se tiver jeito precisava que ele fiiltrasse até 65.536 linhas

 
Postado : 25/01/2012 4:59 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

cleiton, entendi, eu andei fazendo uma pesquisa rápida referente ao limite de linhas em um controle ListView, mas até o momento não encontrei nada sobre o assunto, somente o link abaixo que tem todas as propriedades do mesmo :

ListView Control
http://msdn.microsoft.com/en-us/library ... 60%29.aspx

Assim que possível vou ver se simulo um exemplo com esta qde de linhas e testar, ou se quiser enviar um modelo, mas teria de ser via 4shared ou sendspace, pois o tamanho do arquivo não será aceito aqui no forum.

Por hora é só, assim que eu tiver algo eu posto novamente.

[]s

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

 
Postado : 25/01/2012 7:42 am
cleiton jm
(@cleiton-jm)
Posts: 115
Estimable Member
Topic starter
 

Então Mauro eu tenho uma macro que poderia qbra meu galho, ele filtra os dados que então dentro do listview,então eu colocava data inicial data final filtrava para listview as informações referente as mes que queria, e atravez dessa outra macro eu filtrava só os nomes que queria no listview, mais ela só me filtra criterios de numeros, para filtrar nomes não consigo adpta ela. Mais obrigado pela ajuda e o esforço de vcs por estarem ajudando eu até agora...eu fico no aguardo até acharem uma solução, eu tambem estarei aqui pesquisando, se eu axa eu informo vcs..

este é o exemplo que esto falando

Private Sub txtPesquisa_Change()

If txtPesquisa.Text <> "" Then
X = 1
y = ListView1.ListItems.Count
While (X <= y)
If ((InStr(UCase(ListView1.ListItems.Item(X)), UCase(txtPesquisa.Text)) > 0)) Then GoTo Fim

ListView1.ListItems.Remove (X)
X = X - 1
y = y - 1
Fim:
X = X + 1
Wend
End If
If txtPesquisa = "" Then
Call RelatórioForm
End If
End Sub

 
Postado : 25/01/2012 10:18 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Cleiton, me tire uma duvida, você disse quanto a qde de itens na planilha são em torno de 40.000 a 65.536.

Então, quando é aberto o Formulário estes itens são carregados todos no LIstView ? No exemplo que você enviou já tem a rotina que filtra por datas, seria só acertar para filtrar pelo Nome, é isto ?

Sendo assim, se o ListView é carregado com todos os itens no inicio (entre os 40000 e 65536), e o filtro por Data não dá nenhum erro, acredito que o problema não seria pela qde de linhas no LV e assim algum outro parametro ou variável que está passando despercebido, ou até mesmo em alguma celula da coluna ser tipo diferente, então o ideal seria, se for possível enviar o seu arquivo original, nem que seja com dados ficticios, para poder analizar melhor, uma vez que as rotinas que foram postadas, funcionam corretamente.

[]s

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

 
Postado : 25/01/2012 11:14 am
cleiton jm
(@cleiton-jm)
Posts: 115
Estimable Member
Topic starter
 

Coutinho o listview filtra por datas perfeitamente, eu não carrego todos os itens da planilha no listview, só carrego as que filtro no intervalos de datas, ai as informações que filtrei no listview pelo intervalo de datas eu gostraria de filtrar os nomes dentro daquele intervalos de datas que digito em outro textbox ele vai me filtrando conforme vo digitando no textbox o nome que quero.

então seria que vc falo, depois que filtrei as datas carregando o listview, eu tenho que ter outro textbox para filtra o nome dentro daquele intervalo filtrado, eu vo digitando o nome na textbox ele vai filtrando em tempo de excução.

eu esto no trabalho, hora que eu chega a noite em casa vou anexar um novo exemplo aqui do meu programa

 
Postado : 25/01/2012 12:02 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Em tempo de execução, filtrando diretamente no controle, penso que só será possível por um ComboBox.

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

 
Postado : 25/01/2012 12:18 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Cleiton, vamos analisar novamente :

O Form é iniciado com o LV em branco - Ok
Ao utilizar a Filtragem por Data, o LV é Carregado com a filtragem - OK, conforme você disse funciona corretamente, e conforme eu disse anteriormente, utilizando a rotina do José temos o filtro por nome corretamente, mas como vc mencionou, com poucos itens não da erro.

Neste caso, quantas linhas(registros) são carregadas no LV após a filtragem por Datas?

Se o mesmo for carregado com qde de linhas acima de 40.000 apos a filtragem por data, eliminamos a questao de limite no LV, e para identificar o erro só mesmo com o arquivo original.

[]s

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

 
Postado : 25/01/2012 12:22 pm
Página 1 / 2