Ir ao conteúdo

Posts recomendados

Postado

Sou estudante de Programação e nunca tinha usado VBA e tenho de entregar um trabalho, mas nunca tive formação nesta linguagem, e estou a ter problemas  no programa na parte de Pesquisar registros com filtros, já tentei ao máximo fazer seguindo tutoriais na internet, vídeo aulas e fórum mas está sempre a dar erro e não consigo resolver. 

 Fico muito agradecido se alguém me conseguir ajudar.

Estágio.zipBuscando informações...

Postado
  Em 22/03/2021 às 17:21, Midori disse:

@Pedro_Gomes Que parte especificamente está com problemas? Qual é o resultado esperado?

Expandir  

eu não sei exatamente qual é o problema e o que eu queria e não sei fazer era uma coisa como está na imagem com os dados da folha dados do exel. fico muito agradecido pela ajuda.

Captura de ecrã 2021-03-22 174558.png

Postado

@Pedro_Gomes  Para isso você pode usar os recursos do próprio filtro da planilha que receberá os valores da pesquisa dos controles do formulário.

 

O listbox será preenchido com os dados filtrados e há duas formas para isso, com um loop que poderá pegar as linhas filtradas ou passando o range para a propriedade RowSource. Fiz com RowSource que é mais simples e rápido no caso de uma planilha com muitas linhas.

 

Para testar o código coloque um filtro na planilha Dados no range A1:L1 e crie uma planilha com o nome de Auxiliar. Cole o código no formulário Pesquisar.

 

Para fazer a pesquisa selecione o campo desejado no combobox, entre com o valor no textbox e aperte enter.

 

Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then Call Filtro(TextBox1.Text, ComboBox1.Text)
End Sub

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then Call Filtro(TextBox2.Text, ComboBox2.Text)
End Sub

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then Call Filtro(TextBox3.Text, ComboBox3.Text)
End Sub

Private Sub UserForm_Initialize()
    ComboBox1.RowSource = "Relatório!A1:A12"
    ComboBox2.RowSource = "Relatório!A1:A12"
    ComboBox3.RowSource = "Relatório!A1:A12"
End Sub

Sub Filtro(ByVal Pesquisa As String, Campo As String)
    Dim Coluna  As Integer
    Dim Area    As Range
    
    Set Area = ThisWorkbook.Sheets("Dados").[A1:L1]
    Coluna = WorksheetFunction.Match(Campo, Area, 0)
    If Pesquisa <> "" Then
        If IsNumeric(Pesquisa) = False Then Pesquisa = "*" & Pesquisa & "*"
        Call Area.AutoFilter(Field:=Coluna, Criteria1:=Pesquisa)
        Call CopiaTabela
        Call PreencheListBox
    End If
End Sub

Sub CopiaTabela()
    ThisWorkbook.Sheets("Auxiliar").[A:L].Clear
    ThisWorkbook.Sheets("Dados").[A1].CurrentRegion.Copy
    ThisWorkbook.Sheets("Auxiliar").[A1].PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub

Sub PreencheListBox()
    Dim Area    As Range
    Set Area = ThisWorkbook.Sheets("Auxiliar").[A1].CurrentRegion
    ListBox1.ColumnCount = Area.Columns.Count
    ListBox1.ColumnHeads = True
    ListBox1.RowSource = "Auxiliar!" & Area.Offset(1).Address
End Sub

 

Postado
  Em 22/03/2021 às 18:45, Midori disse:

@Pedro_Gomes  Para isso você pode usar os recursos do próprio filtro da planilha que receberá os valores da pesquisa dos controles do formulário.

 

O listbox será preenchido com os dados filtrados e há duas formas para isso, com um loop que poderá pegar as linhas filtradas ou passando o range para a propriedade RowSource. Fiz com RowSource que é mais simples e rápido no caso de uma planilha com muitas linhas.

 

Para testar o código coloque um filtro na planilha Dados no range A1:L1 e crie uma planilha com o nome de Auxiliar. Cole o código no formulário Pesquisar.

 

Para fazer a pesquisa selecione o campo desejado no combobox, entre com o valor no textbox e aperte enter.

 

Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then Call Filtro(TextBox1.Text, ComboBox1.Text)
End Sub

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then Call Filtro(TextBox2.Text, ComboBox2.Text)
End Sub

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then Call Filtro(TextBox3.Text, ComboBox3.Text)
End Sub

Private Sub UserForm_Initialize()
    ComboBox1.RowSource = "Relatório!A1:A12"
    ComboBox2.RowSource = "Relatório!A1:A12"
    ComboBox3.RowSource = "Relatório!A1:A12"
End Sub

Sub Filtro(ByVal Pesquisa As String, Campo As String)
    Dim Coluna  As Integer
    Dim Area    As Range
    
    Set Area = ThisWorkbook.Sheets("Dados").[A1:L1]
    Coluna = WorksheetFunction.Match(Campo, Area, 0)
    If Pesquisa <> "" Then
        If IsNumeric(Pesquisa) = False Then Pesquisa = "*" & Pesquisa & "*"
        Call Area.AutoFilter(Field:=Coluna, Criteria1:=Pesquisa)
        Call CopiaTabela
        Call PreencheListBox
    End If
End Sub

Sub CopiaTabela()
    ThisWorkbook.Sheets("Auxiliar").[A:L].Clear
    ThisWorkbook.Sheets("Dados").[A1].CurrentRegion.Copy
    ThisWorkbook.Sheets("Auxiliar").[A1].PasteSpecial xlPasteValues
    Application.CutCopyMode = False
End Sub

Sub PreencheListBox()
    Dim Area    As Range
    Set Area = ThisWorkbook.Sheets("Auxiliar").[A1].CurrentRegion
    ListBox1.ColumnCount = Area.Columns.Count
    ListBox1.ColumnHeads = True
    ListBox1.RowSource = "Auxiliar!" & Area.Offset(1).Address
End Sub

 

Expandir  

vou experimentar muito obrigado pela a ajuda.

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...