Ir ao conteúdo
  • Cadastre-se

Excel Carregamento lento de listbox


Ir à solução Resolvido por josequali,

Posts recomendados

Bom dia @LaerteB @Midori

Atualmente venho enfrentando a seguinte situação.

Trabalho com uma planilha que tem mais de 10 mil linhas e com colunas que variam entre 20 a 80 colunas.
O meu problema é o seguinte: quando preciso realizar uma pesquisa no meu banco de dados usando a
minha listbox para obter alguma informação, o carregamento torna-se muito lento e acaba travando,
devido ao carregamento das informações ocorrer a medida que vou digitando ou apagando o campo da minha textbox.
Procurei alguns modelos de planilha com botão de pesquisa associado a uma textbox, mas só achei modelos com até 10 colunas.
Gostaria de saber como poderia resolver esse empasse. Qual seria a melhor solução. Segue em anexo o modelo do projeto.


Desde já agradeço a ajuda de todos. Obrigado :).
 

 

IMAGEM 1.png

imagem2.png

modelo.rar

Link para o comentário
Compartilhar em outros sites

@josequali  Agora vi que na pesquisa o seu listbox deve ser atualizado dinamicamente. Então acho que o melhor é fazer como o @RafaVillani comentou e usar o auto filtro.

 

Para deixar a pesquisa mais rápida o ideal é evitar loops e para isso terá que carregar o listbox só com RowSource.

 

Quando efetuar uma pesquisa, a macro vai filtrar a planilha de acordo com o critério da busca (ID, Status, etc), copiar a tabela filtrada para uma planilha auxiliar e carregar novamente o ListBox atribuindo o RowSource com essa tabela auxiliar, p.ex,

 

Para filtrar a tabela de acordo com o valor da busca e a coluna,

 

O parâmetro Coluna é o número da coluna na planilha, p.ex ID é a coluna 1, Status é a coluna 11.

 

Sub FiltrarPlanilha(Valor As String, Coluna As Integer)
    Dim Area As Range
    Set Area = ThisWorkbook.Sheets("Documentos").Range("A2:AC2")
        Area.AutoFilter Field:=Coluna, Criteria1:=Valor
End Sub

 

Copiar as células filtradas para uma planilha auxiliar,

Sub CopiaFiltro()
    L = ThisWorkbook.Sheets("Documentos").[A2].End(xlDown).Row
    ThisWorkbook.Sheets("AUX").[A:K].Clear
    ThisWorkbook.Sheets("Documentos").Range("A2:K" & L).Copy
    ThisWorkbook.Sheets("AUX").[A1].PasteSpecial
End Sub

 

E para carregar/atualizar o ListBox,

 

Sub CarregaListBox(Lista As Object, Optional Filtro As Boolean = False)
    If Filtro = False Then
        L = ThisWorkbook.Sheets("Documentos").[A2].End(xlDown).Row
        Lista.RowSource = "Documentos!A3:K" & L
    Else
        L = ThisWorkbook.Sheets("AUX").[A2].End(xlDown).Row
        Lista.RowSource = ""
        Lista.RowSource = "AUX!A2:K" & L
    End If
End Sub

 

Link para o comentário
Compartilhar em outros sites

@Midori Tentei fazer as alterações mas não deu certo. Removi do meu projeto os códigos que não preciso agora e só deixei os que estão envolvidos na pesquisa e na filtragem da listbox1. Poderia me auxiliar na troca de código. Não entendi muito bem :( onde alterar. Desde já, agradeço a disponibilidade :) 

modelo.rar

Link para o comentário
Compartilhar em outros sites

@josequali  Cole estas macros no módulo,

 

Option Explicit

Private L As Long

Public Const FILTRO_ID  As Integer = 1
Public Const FILTRO_PROCESSO As Integer = 2
Public Const FILTRO_STATUS = 11

Sub LimpaFiltro()
    [A2:AC2].AutoFilter
    [A2:AC2].AutoFilter
End Sub

Sub FiltraPlanilha(Valor As String, Coluna As Integer)
    Dim Area As Range
    
    Set Area = ThisWorkbook.Sheets("Documentos").Range("A2:AC2")
        Area.AutoFilter Field:=Coluna, Criteria1:=Valor
End Sub

Sub CopiaFiltro()
    L = ThisWorkbook.Sheets("Documentos").[A2].End(xlDown).Row
    ThisWorkbook.Sheets("AUX").[A:K].Clear
    ThisWorkbook.Sheets("Documentos").Range("A2:K" & L).Copy
    ThisWorkbook.Sheets("AUX").[A1].PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub

Sub CarregaListBox(Lista As Object, Optional Filtro As Boolean = False)
    If Filtro = False Then
        L = ThisWorkbook.Sheets("Documentos").[A2].End(xlDown).Row
        Lista.RowSource = "Documentos!A3:K" & L
    Else
        L = ThisWorkbook.Sheets("AUX").[A2].End(xlDown).Row
        Lista.RowSource = ""
        Lista.RowSource = "AUX!A2:K" & L
    End If
End Sub

 

Este no evento Initialize do formulário,

 

Call CarregaListBox(form_documentos.ListBox1)

 

 

Tire todas as macros do evento Click dos options e do evento Change do TextoBox1 (da pesquisa).

 

E cole esta no formulário.

 

A pesquisa será feita quando um option estiver selecionado e ao digitar enter.

 

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim Coluna As Integer
    
    If KeyCode = 13 Then
        If opt_id.Value = True Then Coluna = FILTRO_ID
        If opt_status.Value = True Then Coluna = FILTRO_STATUS
        If opt_tipodedoc.Value = True Then Coluna = FILTRO_PROCESSO
        
        If Coluna <> 0 Then
            Dim Pesquisa As String
            If Coluna = FILTRO_ID Then
                Pesquisa = TextBox1.Text
            Else
                Pesquisa = "*" & TextBox1.Text & "*"
            End If
            
            Call LimpaFiltro
            Call FiltraPlanilha(Pesquisa, Coluna)
            Call CopiaFiltro
            Call CarregaListBox(Me.ListBox1, True)
        End If
    End If
End Sub

 

Link para o comentário
Compartilhar em outros sites

@Midori Boa tarde! Fiz tudo como indicado, consegui carregar as informações de forma ágil, :) . Entretanto, perdi todas as configurações do cabeçario, além de que ele não carrega as informações de todas as colunas. O que será que aconteceu? :( Desde já agradeço pela ajuda e disponibilidade. Obrigado!

 

image.thumb.png.3ed146d08f08d4af1934a52cd466667e.png

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!