Como atualizar automaticamente um filtro automático do Excel quando os dados são alterados?
Caso de uso: altero o valor de uma célula para um valor que foi filtrado. Eu quero ver a linha atual desaparecendo sem ter que fazer mais nada.
Como atualizar automaticamente um filtro automático do Excel quando os dados são alterados?
Caso de uso: altero o valor de uma célula para um valor que foi filtrado. Eu quero ver a linha atual desaparecendo sem ter que fazer mais nada.
Respostas:
Eu descobri que quando eu trabalhava com tabelas, isso não funcionava. O filtro não estava na folha, mas na mesa. esse código fez o truque
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
.AutoFilter.ApplyFilter
End With
End Sub
Encontrei as informações aqui: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp
Clique com o botão direito do mouse no nome da planilha, escolha "Visualizar código" e cole o código abaixo. Após colar, clique no ícone do Excel abaixo de "Arquivo" no canto superior esquerdo ou digite Alt-F11 para retornar à exibição da planilha.
Isso permitirá a atualização automática. Não se esqueça de salvar o arquivo em um formato com mentira de suporte a macro .xlsm
.
Private Sub Worksheet_Change(ByVal Target As Range)
If Me.FilterMode = True Then
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
With ActiveWorkbook
.CustomViews.Add ViewName:="Mine", RowColSettings:=True
Me.AutoFilterMode = False
.CustomViews("Mine").Show
.CustomViews("Mine").Delete
End With
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
End If
End Sub
Eu uso um VBA / Macro baseado em Worksheet_Change
evento também, mas a minha abordagem é um pouco diferente ... Ok, primeiro o código e, em seguida, as explicações:
Private Sub Worksheet_Change(ByVal Target As Range)
' first remove filter
ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1
' then apply it again
ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1, Criteria1:="<>0"
End Sub
(Use a combinação de teclas Alt+ F11para fazer aparecer o painel de desenvolvimento e cole o código na planilha que contém o filtro que você deseja atualizar automaticamente.)
No meu exemplo, suponho que tenha um filtro simples em uma única coluna (L no meu caso) e que meu intervalo de dados esteja nas linhas de 1 (mesmo que possa conter o cabeçalho) a 126 (escolha um número grande o suficiente para ser certo). A operação é simples: à medida que algo é alterado na minha planilha, o filtro no intervalo especificado é removido / reaplicado novamente para que seja atualizado. O que precisa de um pouco de explicação aqui são Field e Critérios .
o campo é um deslocamento inteiro do intervalo. No meu caso, só tenho um filtro de coluna única e o intervalo é definido por uma única coluna (L), que é a primeira do intervalo (portanto, uso 1 como valor).
o critérios são uma sequência que descreve o filtro a ser aplicado ao intervalo de dados. No meu exemplo, quero mostrar apenas as linhas em que a coluna L difere de 0 (portanto, usei "<> 0").
Isso é tudo. Para obter mais referências sobre o método Range.AutoFilter, consulte: https://msdn.microsoft.com/en-us/library/office/ff193884.aspx
Apenas para consolidar a (s) resposta (s):
Sorin diz:
Clique com o botão direito do mouse no nome da planilha, escolha "Visualizar código" e cole o código abaixo. Após colar, clique no ícone do Excel abaixo de "Arquivo" na parte superior esquerda ou digite Alt-F11 para retornar à exibição da planilha.
Isso permitirá a atualização automática. Não se esqueça de salvar o arquivo em um formato com suporte a macro: .xlsm.
E Chris usou esse código (o que acabei de fazer em 2010):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.AutoFilter.ApplyFilter
End Sub
Se você não expandir a postagem, verá apenas a resposta longa! ;)
Desculpe, representante insuficiente para comentar. (Administradores, sinta-se à vontade para cortar isso em um comentário acima.) Resposta do usuário "danicotra" começando com "Eu também uso uma macro / VBA baseada no evento Worksheet_Change, mas minha abordagem ..." com
'first remove filter
' e aplique-a novamente
é a solução correta ao usar o Excel 2007+. No entanto .AutoFilter.ApplyFilter é inválido no XL03 e versões anteriores, então mostro o caminho abaixo.
Peço que verdadeiros especialistas e gurus leiam o código porque estou bastante confiante de que é um material de primeira qualidade. Talvez a contagem inexplicável de votos negativos nesta resposta possa ser revertida quando as pessoas vêem o que é feito de bom abaixo.
danicotra usou um exemplo simplificado. Na verdade, você pode fazer isso de maneira mais geral. Suponha com ActiveSheet o seguinte (ou algum outro objeto de planilha):
Salve o intervalo do filtro automático. Possui colunas .AutoFilter.Filters.Count e linhas (.AutoFilter.Range.Count / .AutoFilter.Filters.Count), salvas em rngAutofilter
Colete em uma matriz myAutofilters cada uma das 4 propriedades de cada um dos itens de filtro automático .AutoFilter.Filters.Count, tomando cuidado para evitar "erros definidos pelo aplicativo" quando .On ou .Operator for falso. (myAutofilters seriam redimensionados para o número de linhas e colunas na etapa 1)
Desative o filtro, mas preserve os menus suspensos com .ShowAllData
Para cada item de filtro que estava .De acordo com sua matriz salva, redefina 3 das 4 propriedades de cada um dos itens de filtro automático .AutoFilter.Filters.Count. Mais uma vez, evite "Erros definidos pelo aplicativo" quando .Operator for falso, portanto, para cada item "i",
campo rngAutofilter.AutoFilter: = i, Critérios1: = myAutofilters (i, 2)
ou
rngAutofilter.AutoFilter Field: = i, Critérios1: = myAutofilters (i, 2), Operador: = myAutofilters (i, 3), Critério2: = myAutofilters (i, 4)
Agora, o filtro automático será reinstituído, no mesmo intervalo que era antes do seu código começar, mas com o filtro automático atualizado para alterações nos dados.
Public myAutofilters As Variant, rngAutofilter As Range 'Public
Sub SaveAndRestoreAutofilters()
'This will update the autofilter display to recognize data changes by turning autofilter off and then on, preserving all characteristics
'Note, XL2007 and later have .autofilter.applyfilter, but not the invaluable XL03 and earlier
Dim i As Long, iNumAutofilters As Long, iNumActiveAutofilters As Long
iNumActiveAutofilters = SaveAutoFilterInfo(iNumAutofilters) 'NOTE! Use CALL or assignment to prevent parentheses from forcing ByVal !
If iNumActiveAutofilters < 1 Then
Application.StatusBar = "0 ACTIVE filters;" & iNumAutofilters & " autofilters"
Exit Sub
End If
ActiveSheet.ShowAllData
Rem Here optionally do stuff which can include changing data or toggling autofilter columns
For i = 1 To iNumAutofilters
If myAutofilters(i, 1) Then
If myAutofilters(i, 3) <> 0 Then 'then .Operator is something, so set it and Criteria2, else just Criteria1
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2), Operator:=myAutofilters(i, 3), Criteria2:=myAutofilters(i, 4) ', On:=true by rule
Else
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2) ', On:=true by rule (it's R/O anyway)
End If
Rem Selection.AutoFilter Field:=i 'How you'd "turn off" only a single column's autofiltering. FYI .On is R/O!
End If
'activesheet.autofiltermode=false 'just FYI, how you comprehensively turn off filtering on a sheet (erasing the dropdowns and criteria and filter range!)
Next i
End Sub
Function SaveAutoFilterInfo(iNumAutofilters As Long) As Long
Dim i As Long, iRowsAutofiltered As Long
SaveAutoFilterInfo = 0 'counts the number that are .On, and returns the total
iNumAutofilters = ActiveSheet.AutoFilter.Range.Columns.Count
If ActiveSheet.AutoFilter.Filters.Count <> iNumAutofilters Then MsgBox "I can't explain this. All bets are off. Aborting.": Exit function
ReDim myAutofilters(1 To iNumAutofilters, 4)
For i = 1 To iNumAutofilters
myAutofilters(i, 1) = ActiveSheet.AutoFilter.Filters(i).On
If myAutofilters(i, 1) Then
SaveAutoFilterInfo = SaveAutoFilterInfo + 1
myAutofilters(i, 2) = ActiveSheet.AutoFilter.Filters(i).Criteria1
myAutofilters(i, 3) = ActiveSheet.AutoFilter.Filters(i).Operator
If myAutofilters(i, 3) <> 0 Then 'then is either xlAnd, xlOr, etc., and there's a second criteria
myAutofilters(i, 4) = ActiveSheet.AutoFilter.Filters(i).Criteria2
End If
End If
Next i
iRowsAutofiltered = ActiveSheet.AutoFilter.Range.Count / ActiveSheet.AutoFilter.Range.Columns.Count
Set rngAutofilter = Cells(ActiveSheet.AutoFilter.Range.Row, ActiveSheet.AutoFilter.Range.Column).Resize(iRowsAutofiltered, iNumAutofilters)
End Function
usando "dados, da tabela" / power query no excel, que nos dá a opção de atualizar os dados ao abrir o arquivo. (também classificar automaticamente e coluna de índice (número de linhas filtradas automaticamente)) Isso criará resultado em outra planilha. - selecione os dados necessários usando o mouse (linhas e colunas) -clique na guia dados, da tabela -na última coluna, exclua espaços em branco (opcional, se você deseja exibir apenas células preenchidas) -add coluna, coluna de índice (opcional, se você deseja adicionar o número da linha aos resultados filtrados) -close e carregue para para editar novamente, clique na guia consulta e, em seguida, em editar clique na guia design no excel, na seta abaixo de atualização, propriedades da conexão, atualizar dados ao abrir o arquivo. adaptado de: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/ parte: 3. Classificando listas suspensas usando a consulta de energia você também pode copiar dados da planilha1 se não estiver vazio, por exemplo, campo a1. copie isso para o campo a1 na planilha2: = SE (Folha1! A1 ""; Folha1! A1; "")