Como atualizar automaticamente um filtro automático do Excel quando os dados são alterados?

15

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.

sorin
fonte
3
Consegui fazê-lo funcionar quando coloquei esse código no evento Worksheet_Change () em vez do evento Worksheet_Calculate ().
precisa saber é o seguinte
1
coloque isso como resposta e aceite-o, para que outros saibam o que você fez e que a pergunta foi resolvida.
jzd
Eu tive que fazer outra modificação porque o Calculate estava esperando um parâmetro. Agora funciona!
sorin

Respostas:

7

A troca do código com isso parece funcionar também (pelo menos no Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
Chris
fonte
4

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

Não há mais truques
fonte
1

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
sorin
fonte
1

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

danicotra
fonte
0

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! ;)

Cara aleatório
fonte
-1

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):

  1. Salve o intervalo do filtro automático. Possui colunas .AutoFilter.Filters.Count e linhas (.AutoFilter.Range.Count / .AutoFilter.Filters.Count), salvas em rngAutofilter

  2. 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)

  3. Desative o filtro, mas preserve os menus suspensos com .ShowAllData

  4. 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
MicrosoftShouldBeKickedInNuts
fonte
Por que no mundo alguém rebaixou essa resposta útil, que inclui até um código completo e autônomo (e altamente testado) e até fornece uma explicação detalhada do código? Estou perguntando, sério. As pessoas querem uma boa ajuda profissional em superusuário ou eu não deveria nem me preocupar? Existem trolls que acabam votando abaixo, a fim de se sustentarem relativamente?
MicrosoftShouldBeKickedInNuts
1
Pelo menos, tenha o b___s para comentar se você votou negativamente, para que eu possa usar o feedback para melhor atender a comunidade. Administradores, é uma proposta que eu gostaria de fazer. Todas as votações negativas exigem um comentário explicativo. Eu já vi muitos posts claramente excelentes, inexplicavelmente com votos negativos, o que realmente parece ser uma epidemia no superusuário - e em nenhum outro lugar.
MicrosoftShouldBeKickedInNuts
-1
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; "")

Bojan Djuric
fonte