更改数据后如何自动刷新Excel自动筛选器?


15

更改数据后如何自动刷新Excel自动筛选器?

用例:我将一个单元格的值更改为已过滤的值。我希望看到当前行消失而无需执行其他任何操作。


3
当我将代码放在Worksheet_Change()事件而不是Worksheet_Calculate()事件中时,我能够使它工作。
F106dart

1
将其作为答案并接受它,以便其他人知道您做了什么并且问题已得到解决。
jzd

我必须进行另一次修改,因为Calculate需要一个参数。现在可以使用!
sorin 2011年

Answers:


7

与此交换代码似乎也可以解决问题(至少在Excel 2010中):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub


1

右键单击您的工作表名称,选择“查看代码”,然后粘贴以下代码。粘贴后,单击左上方“文件”下方的Excel图标,或键入Alt-F11,以返回到电子表格视图。

这将启用自动刷新。不要忘记将文件保存为具有宏支持lie的格式.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

1

我也使用基于Worksheet_Change事件的VBA /宏,但是我的方法略有不同...好的,首先是代码,然后是解释:

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

(使用Alt+ F11组合键使开发面板出现,并将代码粘贴到包含要自动刷新的过滤器的工作表中。)

在我的示例中,我假设在单列(在我的情况下为L)上有一个简单的过滤器,并且我的数据范围是从1(即使可能包含标题)到126(选择足够大的数字)当然)。操作很简单:当我的工作表上的内容发生更改时,指定范围内的过滤器将再次被删除/重新应用,以使其刷新。这里需要一点解释的是FieldCriteria

字段是范围的整数偏移量。就我而言,我只有一个单列过滤器,范围是由一个单列(L)构成的,该列是该范围中的第一列(因此我将1用作值)。

标准是描述适用于数据范围过滤器的字符串。在我的示例中,我只想显示L列不同于0的行(因此我使用了“ <> 0”)。

就这样。有关Range.AutoFilter方法的更多参考,请参见:https ://msdn.microsoft.com/zh-cn/library/office/ff193884.aspx


0

只是为了巩固答案:

索林说:

右键单击您的工作表名称,选择“查看代码”,然后粘贴以下代码。粘贴后,单击左上方“文件”下方的Excel图标,或键入Alt-F11,以返回到电子表格视图。

这将启用自动刷新。不要忘记将文件保存为具有宏支持lie .xlsm的格式。

克里斯使用了以下代码(我在2010年刚刚做过):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub

如果您不扩大帖子,只会看到冗长的答案!;)


-1

抱歉,没有足够的评论。(管理员,请在上面的评论中随意添加。)用户“ danicotra”响应开头为“我也基于Worksheet_Change事件使用了VBA /宏,但我的方法...”开头为“
首先删除过滤器
”,然后应用再次
是使用Excel 2007+时的正确解决方案。但是.AutoFilter.ApplyFilter在XL03及更早版本中无效,因此我在下面显示了方法。

我恳求真正的专家和专家来阅读代码,因为我非常有信心这是最上层的材料。当人们看到下面有什么好东西时,也许无法解释这个答案的数字。

danicotra使用了一个简化的示例。实际上,您可以更一般地执行此操作。假设使用ActiveSheet用于以下内容(或其他一些工作表对象):

  1. 保存自动过滤器的范围。它具有.AutoFilter.Filters.Count列和(.AutoFilter.Range.Count / .AutoFilter.Filters.Count)行,保存到rngAutofilter

  2. 在数组myAutofilters中收集每个.AutoFilter.Filters.Count自动过滤器项的4个属性中的每个属性,请注意当.On或.Operator为false时,避免出现“应用程序定义的错误”。(myAutofilters将在步骤1中重新调整为行数和列数)

  3. 关闭过滤器,但使用.ShowAllData保留下拉列表

  4. 对于根据保存的数组为.On的每个筛选器项,重置每个.AutoFilter.Filters.Count自动筛选器项的4个属性中的3个。再次注意避免在.Operator为false时避免“应用程序定义的错误”,因此对于每个项目“ i”,
    rngAutofilter.AutoFilter字段:= i,Criteria1:= myAutofilters(i,2)

    rngAutofilter.AutoFilter字段:= i,Criteria1:= myAutofilters(i,2),运算符:= myAutofilters(i,3),Criteria2:= myAutofilters(i,4)

现在,将在与代码开始之前相同的范围内重新设置自动过滤器,但会针对数据更改更新自动过滤器。

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

2
如果您不赞成,至少要有b___s来发表评论,以便我可以使用反馈意见更好地为社区服务。管理员,这是我要提出的建议。让所有否决票都需要解释性评论。我已经看到很多明显很棒的帖子都莫名其妙地被低估了,这似乎真的是超级用户中的一种流行病-而且没有其他地方。
MicrosoftShouldBeKickedInNuts

为“所有选票都需要说明性注释”而+1。
引力

-1
在Excel中使用“表格中的数据” /电源查询,这使我们可以选择在打开文件时刷新数据。
(还有自动排序和索引列(自动为过滤的行编号))

这将在另一张纸上创建结果。

-使用鼠标选择所需的数据(行和列)
单击表中的“数据”选项卡
-在最后一列中,排除空格(如果要仅显示填充的单元格,则为可选)
-add列,索引列(可选,如果要向过滤结果中添加行号)
-关闭并加载到

要再次编辑,请单击“查询”选项卡,然后单击“编辑”。

单击excel中的“设计”选项卡,然后在刷新下方的箭头,连接属性,
打开文件时刷新数据。


改编自:https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/
部分:3.使用Power Query对下拉列表进行排序


您还可以从sheet1复制数据(如果不为空),例如字段a1。
将其复制到sheet2的a1字段中:
= IF(Sheet1!A1“”; Sheet1!A1;“”)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.