更改数据后如何自动刷新Excel自动筛选器?
用例:我将一个单元格的值更改为已过滤的值。我希望看到当前行消失而无需执行其他任何操作。
更改数据后如何自动刷新Excel自动筛选器?
用例:我将一个单元格的值更改为已过滤的值。我希望看到当前行消失而无需执行其他任何操作。
Answers:
我发现当我使用表格时,这是行不通的。过滤器不在表上,而是在桌子上。这段代码成功了
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
.AutoFilter.ApplyFilter
End With
End Sub
我在这里找到信息:http : //www.jkp-ads.com/articles/Excel2007TablesVBA.asp
右键单击您的工作表名称,选择“查看代码”,然后粘贴以下代码。粘贴后,单击左上方“文件”下方的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
我也使用基于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(选择足够大的数字)当然)。操作很简单:当我的工作表上的内容发生更改时,指定范围内的过滤器将再次被删除/重新应用,以使其刷新。这里需要一点解释的是Field和Criteria。
该字段是范围的整数偏移量。就我而言,我只有一个单列过滤器,范围是由一个单列(L)构成的,该列是该范围中的第一列(因此我将1用作值)。
该标准是描述适用于数据范围过滤器的字符串。在我的示例中,我只想显示L列不同于0的行(因此我使用了“ <> 0”)。
就这样。有关Range.AutoFilter方法的更多参考,请参见:https ://msdn.microsoft.com/zh-cn/library/office/ff193884.aspx
抱歉,没有足够的评论。(管理员,请在上面的评论中随意添加。)用户“ danicotra”响应开头为“我也基于Worksheet_Change事件使用了VBA /宏,但我的方法...”开头为“
首先删除过滤器
”,然后应用再次
是使用Excel 2007+时的正确解决方案。但是.AutoFilter.ApplyFilter在XL03及更早版本中无效,因此我在下面显示了方法。
我恳求真正的专家和专家来阅读代码,因为我非常有信心这是最上层的材料。当人们看到下面有什么好东西时,也许无法解释这个答案的数字。
danicotra使用了一个简化的示例。实际上,您可以更一般地执行此操作。假设使用ActiveSheet用于以下内容(或其他一些工作表对象):
保存自动过滤器的范围。它具有.AutoFilter.Filters.Count列和(.AutoFilter.Range.Count / .AutoFilter.Filters.Count)行,保存到rngAutofilter
在数组myAutofilters中收集每个.AutoFilter.Filters.Count自动过滤器项的4个属性中的每个属性,请注意当.On或.Operator为false时,避免出现“应用程序定义的错误”。(myAutofilters将在步骤1中重新调整为行数和列数)
关闭过滤器,但使用.ShowAllData保留下拉列表
对于根据保存的数组为.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
在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;“”)