Vídeo recomendado
https://youtu.be/diWPPPhW-9E

Filtrar tabela dinâmica com VBA [RESOLVIDO]

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
Fabricio_Tavares
Colaborador
Colaborador
Mensagens: 14
Registrado em: Qui Jul 07, 2016 9:46 pm

Filtrar tabela dinâmica com VBA [RESOLVIDO]

Mensagem por Fabricio_Tavares »

Boa tarde,

Preciso filtrar duas tabelas dinâmicas conforme informações de uma outra aba.

Na planilha em anexo, tem 3 abas. Relatórios - Entradas - Saídas

Na aba relatórios, tem os campos para selecionar "Entrada ou Saída", "Cliente", "Data Inicial" e "Data Final"

Preciso de um código VBA que filtre automaticamente as tabelas ao clicar no botão OK.

Quando selecionado Entrada, devem ser filtrados o nome do cliente selecionado entre as datas inicial e final na tabela Entrada.

Quando selecionado Saída, devem ser filtrados o nome do cliente selecionado entre as datas inicial e final na tabela Saídas.


O resultado do filtro pode ser mostrado na mesma tabela ou copiado para uma outra aba, pois após este filtro, este relatório será impresso e o filtro desfeito.
Anexos
Relatórios.zip
(432.54 KiB) Baixado 247 vezes
Editado pela última vez por Fabricio_Tavares em Qua Jul 27, 2016 11:19 am, em um total de 1 vez.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Avatar do usuário
Mikel Silveira Fraga
Jedi
Jedi
Mensagens: 1173
Registrado em: Sex Mai 27, 2011 3:27 pm
Localização: Governador Valadares - MG
Contato:

Re: Filtrar tabela dinâmica com VBA

Mensagem por Mikel Silveira Fraga »

Fabrício, boa tarde.

Cara, achei muito interessante sua dúvida e resolvi dar uma olhada.

Seguindo sugestões de alguns sites estrangeiros e o ajuda do Excel, consegui desenvolver uma solução para seu caso, porém esta funcionando parcialmente. Segue código que deve ser inserido em um Módulo:

Código: Selecionar todos

Sub ReportFilter()
  'Declara objeto loTable e wsParam.
  Dim loTable As ListObject
  Dim wsParam As Worksheet
  With ActiveSheet
    'Verifica se foi selecionado um destino para filtro.
    If .Cells(8, 9).Value = "" Or .Cells(10, 9).Value = "" Then
      MsgBox "Favor selecionar movimentação e origem do relatório.", vbExclamation, "Aviso"
      GoTo endReport
    End If
    'Verifica se as datas de inicio/fim foram informadas.
    If .Cells(12, 9).Value = "" Or .Cells(14, 9).Value = "" Then
      MsgBox "Favor informar as datas corretas de início e fim para filtro.", vbExclamation, "Aviso"
      GoTo endReport
    End If
    'Cria o objeto loTable, que receberá a
    'tabela dinâmica, conforme seleção do filtro.
    If .Cells(8, 9).Value = "Entrada" Then
      Set wsParam = Sheets("Entradas (Q)")
      Set loTable = wsParam.ListObjects("Entradas")
    Else
      Set wsParam = Sheets("Saídas (W)")
      Set loTable = wsParam.ListObjects("Saídas")
    End If
  End With
  'Declara variável e armazena código do cliente.
  Dim codCliente As Integer
  'Usa a função Match (Corresp) em VBA, para capturar a linha em que
  'se localiza o código correspondente da origem/destino informada.
  codCliente = Sheets("Clientes (T)").Cells(Application.WorksheetFunction.Match( _
                  ActiveSheet.Cells(10, 9), Sheets("Clientes (T)").Columns(2), 0), 1).Value
  'Inicia bloco de filtragem.
  With loTable.Range
    'Limpa o filtro existente.
    .AutoFilter 1: .AutoFilter 2
    'Realiza filtro pela coluna Data.
    .AutoFilter 1, ">=" & ActiveSheet.Cells(12, 9).Value, xlAnd, _
                   "<=" & ActiveSheet.Cells(14, 9).Value, True
    'Realiza filtro pela coluna codCliente.
    .AutoFilter 2, codCliente
  End With
  wsParam.Select
endReport:
  'Limpa relatório.
  Set loTable = Nothing
  Set wsParam = Nothing
End Sub
Um dos sites de referencia foi um artigo da Microsoft chamado: Sorting and Filtering a Table with the List Object in Excel 2010.

Na parte de se realizar o filtro pela data é onde existe algum erro de informação. Em relação ao código, parece estar correto, o que me faz acreditar que o problema seja o tipo de dado dos valores carregados para realização do filtro. Mas não consegui identificar.

Estou deixando o código aqui, para que demais amigos possam dar uma olhada e sugerir alguma alteração sobre os valores datas, para conclusão do filtro.

Espero que esse código já seja um caminho para a solução do mesmo.

Abraços e excelente semana.


Fabricio_Tavares
Colaborador
Colaborador
Mensagens: 14
Registrado em: Qui Jul 07, 2016 9:46 pm

Re: Filtrar tabela dinâmica com VBA [RESOLVIDO]

Mensagem por Fabricio_Tavares »

Bom dia Mikel,

Apanhei bastante e pesquisei também. Consegui montar um código que atendeu bem ao que eu estava precisando:

Sub Relatórios_OK()

If Worksheets("Relatórios").Range("I8") = "" Then
MsgBox "A movimentação é um campo obrigatório. Retorne e preencha corretamente."
Exit Sub
End If

If Worksheets("Relatórios").Range("I10") = "" Then
MsgBox "A unidade de origem/destino é um campo obrigatório. Retorne e preencha corretamente."
Exit Sub
End If

If Worksheets("Relatórios").Range("I12") = "" Then
MsgBox "A data inicial é um campo obrigatório. Retorne e preencha corretamente."
Exit Sub
End If

If Worksheets("Relatórios").Range("I14") = "" Then
MsgBox "A data final é um campo obrigatório. Retorne e preencha corretamente."
Exit Sub
End If

Dim datei As Double
Dim datef As Double

datei = Sheets("Relatórios").Range("I12").Value
datef = Sheets("Relatórios").Range("I14").Value

If Worksheets("Relatórios").Range("I8") = "Entrada" Then
Sheets("Entradas (Q)").Select
ActiveWindow.DisplayHeadings = False
Range("Entradas[Data]").Select
Selection.NumberFormat = "m/d/yyyy"
ActiveSheet.ListObjects("Entradas").Range.AutoFilter Field:=3, Criteria1:=Range("F3").Value
ActiveSheet.ListObjects("Entradas").Range.AutoFilter Field:=1, _
Criteria1:=">= " & datei, Operator:=xlAnd, Criteria2:="<=" & datef
Columns("A:C").Select
Selection.EntireColumn.Hidden = True
Columns("H:K").Select
Selection.EntireColumn.Hidden = True

ActiveSheet.Protect
ActiveSheet.EnableSelection = xlUnlockedCells

End If

If Worksheets("Relatórios").Range("I8") = "Saída" Then
Sheets("Saídas (W)").Select
ActiveWindow.DisplayHeadings = False
Range("Saídas[Data]").Select
Selection.NumberFormat = "m/d/yyyy"
ActiveSheet.ListObjects("Saídas").Range.AutoFilter Field:=3, Criteria1:=Range("F3").Value
ActiveSheet.ListObjects("Saídas").Range.AutoFilter Field:=1, _
Criteria1:=">= " & datei, Operator:=xlAnd, Criteria2:="<=" & datef
Columns("A:C").Select
Selection.EntireColumn.Hidden = True
Columns("H:O").Select
Selection.EntireColumn.Hidden = True

ActiveSheet.Protect
ActiveSheet.EnableSelection = xlUnlockedCells

End If

End Sub

Obrigado pela ajuda!


Avatar do usuário
Mikel Silveira Fraga
Jedi
Jedi
Mensagens: 1173
Registrado em: Sex Mai 27, 2011 3:27 pm
Localização: Governador Valadares - MG
Contato:

Re: Filtrar tabela dinâmica com VBA

Mensagem por Mikel Silveira Fraga »

Fabrício Tavares, bom dia.

Excelente. Inclusive detectei onde estava a minha falha para o filtro da data. Nas planilhas, as datas são armazenadas com "mmddyyyy" e, como eu não estava forçando essa formatação, o filtro estava sendo realizado com a data incorreta.

Meus parabéns pelo resultado.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder