Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
#69210
Boa tarde pessoal!

Vejam se podem me ajudar por favor.

Estou precisando filtrar 2 datas distintas nos rótulos de coluna de uma tabela dinâmica que possui várias datas. Gostaria que esse filtro ocorresse de forma dinâmica. Ou seja, que acrescentasse a data 1 e a data 2 em 2 celulas e que a partir dessas datas o filtro fosse realizado na tabela dinâmica ou que quando atualizasse fosse solicitado a data 1 e a data 2 por inputbox para incluir no filtro da tabela dinâmica.

Eu filtrando manualmente chego exatamente no resultado esperado. Porém, quando gravo a macro, ela retorna o código em anexo que não consigo utilizar pois ele é fixo e a cada dia eu incluiria uma data nova no relatório.

Tentei utilizar o comando "filtros de data" e "é igual a"..Porém, ele só aceita 1 critério e eu precisaria incluir 2 datas e não apenas 1...Se desse pra incluir as 2 seria perfeito....

Desde já..Muito obrigado.

Código: Selecionar todos

Sub FiltrarData()
'


'
    With ActiveSheet.PivotTables("Tabela dinâmica1").PivotFields("DATA")
        .PivotItems("20/12/2021").Visible = False
        .PivotItems("21/12/2021").Visible = False
        .PivotItems("22/12/2021").Visible = False
        .PivotItems("23/12/2021").Visible = False
        .PivotItems("24/12/2021").Visible = False
        .PivotItems("27/12/2021").Visible = False
        .PivotItems("28/12/2021").Visible = False
        .PivotItems("29/12/2021").Visible = False
        .PivotItems("30/12/2021").Visible = False
        .PivotItems("31/12/2021").Visible = False
        .PivotItems("02/02/2022").Visible = False
        .PivotItems("03/02/2022").Visible = False
        .PivotItems("04/02/2022").Visible = False
        .PivotItems("05/02/2022").Visible = False
        .PivotItems("09/02/2022").Visible = False
        .PivotItems("10/02/2022").Visible = False
        .PivotItems("11/02/2022").Visible = False
        .PivotItems("12/02/2022").Visible = False
        .PivotItems("15/02/2022").Visible = False
        .PivotItems("16/02/2022").Visible = False
        .PivotItems("(blank)").Visible = False
    End With
    
    
 'Abaixo tentei utilizar o filtro de data é igual a"
    
    
    Range("C3").Select
    ActiveSheet.PivotTables("Tabela dinâmica1").PivotFields("DATA").PivotFilters. _
        Add Type:=xlSpecificDate, Value1:="16/12/2021"
    
End Sub


Você não está autorizado a ver ou baixar esse anexo.
Editado pela última vez por RahelCunha em 17 Fev 2022 às 23:15, em um total de 1 vez.
#69214
Olá, @RahelCunha .

Ao rodar o código abaixo que está no seu arquivo ele roda de boa ou trava por erro ?
Sub data2()
Range("C3").Select
ActiveSheet.PivotTables("Tabela dinâmica1").PivotFields("DATA").ClearAllFilters
...

Aqui apresenta erro por causa da existência de uma segunda TD na coluna M.

Em G3 você colocou a data1= 16/12/2021 e em I3 a data2= 17/02/2022.
Você quer filtrar somente os registros cujas datas sejam iguais à data1 ou iguais à data2 ou você quer filtrar todas as datas que estejam entre a data1b e a data2?
#69215
osvaldomp escreveu:Olá, @RahelCunha .

Ao rodar o código abaixo que está no seu arquivo ele roda de boa ou trava por erro ?
Sub data2()
Range("C3").Select
ActiveSheet.PivotTables("Tabela dinâmica1").PivotFields("DATA").ClearAllFilters
...

Aqui apresenta erro por causa da existência de uma segunda TD na coluna M.

Em G3 você colocou a data1= 16/12/2021 e em I3 a data2= 17/02/2022.
Você quer filtrar somente os registros cujas datas sejam iguais à data1 ou iguais à data2 ou você quer filtrar todas as datas que estejam entre a data1b e a data2?
Grande mestre @osvaldomp ...

Me perdoe...Foi com o codigo errado...O codigo correto é esse que está aqui no topico...De qualquer forma vou substituir o arquivo, segue o com codigo correto em anexo também.

Então, na verdade eu quero filtrar os registros cujas as datas sejam iguais a data 1 e também os registros cujas as datas sejam iguais a data 2...Qual o intuito disso? Fazer uma comparação de valores entre a data 1 e a data 2.....

Na verdade foi o caminho mais próximo que consegui de chegar ao resultado esperado para comparar a evolução de 2 datas distintas. Por exemplo...Na tabela dinamica, o primeiro item, na linha 5..Item 96577 no dia 16/12/2021(Data 1) tinha apenas 1 peça e já no dia 17/02/2022(Data 2) o mesmo item tinham 4 peças...Ou seja, uma evolução de 3 peças de uma data para a outra...A tabela dinamica já me deu esse resultado...É só eu fazer a data 1 menos a data 2 do jeito que a tabela dinamica está no arquivo....Mas eu tive que filtrar manualmente....Eu gostaria de conseguir realizar esse filtro de forma dinamica via vba...Não precisa ser exatamente por tabela dinamica....Se tiver outra sugestão de como mostrar essa evolução de uma melhor forma visual tbem ficaria muito grato...Como disse, estou usando a tabela pq foi o resultado mais próximo que consegui até o momento.

Estou inserindo uma imagem onde tento exemplificar melhor

Imagem
Você não está autorizado a ver ou baixar esse anexo.
#69220
Olá, @RahelCunha .

Experimente o código abaixo.
Código: Selecionar todos
Sub FiltraTD()
 Dim pvItem As PivotItem, dta1 As Date, dta2 As Date
  dta1 = CDate([G1])
  dta2 = CDate([H1])
  Application.ScreenUpdating = False
  With ActiveSheet.PivotTables("Tabela dinâmica1").PivotFields("DATA")
   .ClearAllFilters
   For Each pvItem In .PivotItems
    If pvItem.Value = "(blank)" Then
     pvItem.Visible = False
    ElseIf CDate(pvItem.Value) <> dta1 And CDate(pvItem.Value) <> dta2 Then
     pvItem.Visible = False
    End If
   Next pvItem
  End With
  Columns("G:H").AutoFit
End Sub
#
preparação da planilha:
1. exclua a TD existente na coluna M, pois o comando .ClearAllFilters só funciona se houver somente uma TD ~~~> selecione-a e aperte Delete
2. coloque a data1 em G1 e a data2 em H1, pois a linha 3 é utilizada pela TD
3. só na primeira vez que rodar o código irá popup um alerta sobre "já existem dados ... blá blá blá " ~~~> cilque em OK

É possível rodar o código após inserir as datas 1 e 2 via evento WS_Change e também é possível aplicar o Filtro diretamente na tabela da Plan1 e também via WS_Change. Retorne se houver interesse.

dicas:
1. se você só quer comparar SOMA ou CONTAGEM de dados entre duas datas, isso pode ser feito por fórmulas.
2. para responder clique em +Resposta, localizada abaixo do última postagem. Só clique em Responder com citação se necessário.
#69223
Obrigado pelas dicas @osvaldomp ,

Perfeito, seria exatamente esse código me atenderia demais. Porém, ele retorna erro em tempo de execução na linha pvItem.Visible = False conforme imagem em anexo . Uma informação importante é que utilizo excel 2007 e talvez haja algum tipo de incompatibilidade.

Me atenderia demais mestre.

Como você disse, formulas também seriam interessantes, mas como as datas são muito dinâmicas, não consegui chegar a uma formula interessante para comparar a data 1 e a data 2 de forma satisfatória.

Imagem
Imagem
Editado pela última vez por RahelCunha em 18 Fev 2022 às 14:38, em um total de 2 vezes.
#69225
RahelCunha escreveu: 18 Fev 2022 às 12:57
... ele retorna erro em tempo de execução na linha pvItem.Visible = False
Você poderia disponibilizar o arquivo em que ocorre o erro, com o código que passei instalado?

... utilizo excel 2007 e talvez haja algum tipo de incompatibilidade.
Em princípio não deveria, mas ... vamos ver depois que você disponibilizar o seu arquivo.

... formulas também seriam interessantes, ...
Se você quiser coloque alguns exemplos e os resultados esperados. Aqui no fórum temos colegas top em fórmulas.
#69238
Baixei o seu arquivo e aqui funciona de boa, sem erro e mostra o resultado correto.

Há alguma suspeita quanto a versão 2007. No passado usei essa versão e também a 2010, e me lembro de algumas dificuldades que tive ao manipular datas.

Se possível faça alguns teste aí:
1. experimente processar na mesma máquina que você tem testado, porém em outra versão do Excel (exceto 2007 e 2010)
2. experimente em outra máquina com Excel 2007 ou 2010
3. experimente em outra máquina com versão do Excel diferente de 2007 e de 2010 (pode ser inclusive com a 2003)
4. experimente rodar no modo Debug (via F8) e pairando com o cursor do mouse sobre as variáveis, observe os valores delas em cada momento: dta1, dta2 e pvItem, comparando com os seus respectivos valores na planilha, notadamente se estão no formato dd/mm/aaaa.
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord