Resumo: Como faço para forçar a execução de um script de filtro automático quando uma alteração de célula (induzida por outro script, não pela entrada do usuário) é detectada na célula I2? (observação: Excel 365, não vejo uma tag específica para isso, mas fique à vontade para ajustar se eu não vi!)
Eu vinculei células em diferentes abas que mudam de valor sempre que uma das outras muda seu valor. Se você definir 5 em uma aba, isso mudará as outras células nas outras abas para o mesmo valor. Este é um exemplo, da aba1 (as outras abas são atualmente idênticas em conteúdo e layout, com versões ajustadas localmente deste script):
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("F2").Address Then
Range("A5:E120").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("F1:F2")
End If
If Not Intersect(Target, Range("I2")) Is Nothing Then
If Target = Range("I2") Then
If Sheets("tab2").Range("I2").Value <> Target.Value Then
Sheets("tab2").Range("I2").Value = Target.Value
End If
End If
End If
If Not Intersect(Target, Range("I2")) Is Nothing Then
If Target = Range("I2") Then
If Sheets("tab3").Range("I2").Value <> Target.Value Then
Sheets("tab3").Range("I2").Value = Target.Value
End If
End If
End If
End Sub
Estou tentando filtrar as linhas em duas dessas guias com base neste valor: se definido como 5, ele deve mostrar todas as linhas na coluna A que contêm um valor de 5 ou menos (ou 3 ou menos, ou 2 ou menos etc.). Criei uma coluna auxiliar para esse efeito que verifica o valor em I2 e compara os valores da coluna A:
=IF(A5<=$I$2,"yes","no")
A ideia é que tudo com "sim" será exibido, e tudo com "não" será oculto.
Atualmente, estou usando o AutoFiltro manualmente em cada aba, mas gostaria de automatizar as alterações de filtro. Embora eu seja bem avançado em amarrar planilhas complexas usando as fórmulas internas, com o VBA ainda sou bem novo.
Isso parece promissor (também apresentado acima): https://www.tutorialspoint.com/how-to-autofilter-rows-based-on-cell-values-in-excel , que parece não usar os menus suspensos completos do AutoFiltro, mas funciona mesmo assim:
Private Sub Worksheet_Change(ByVal Target As Range)
'Updated By Nirmal
If Target.Address = Range("F2").Address Then
Range("A5:E120").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("F1:F2")
End If
End Sub
Isso pega o valor de E2 e oculta as linhas com um valor na coluna com o cabeçalho que corresponde a E1. Os menus suspensos do AutoFilter não estão disponíveis, mas isso é bom, pois a filtragem é a parte que importa.
O que estou encontrando é que esse script não parece pegar as alterações de células vinculadas, somente após a entrada direta do usuário. Então você teria que fazer uma edição em cada aba novamente, que é exatamente o que estou tentando evitar (ou seja, alterar o valor em um lugar, ter filtros mudando em todos os lugares)...