tl;dr:当在 I2 单元格中检测到单元格更改(由另一个脚本引起,而不是用户输入)时,如何强制运行自动筛选脚本?(注意:Excel 365,我没有看到该标签的特定标签,但如果我错过了,请随意调整!)
我已将单元格链接到不同的选项卡上,只要其他选项卡上的单元格的值发生变化,这些单元格的值也会随之变化。如果您在一个选项卡上设置 5,它将把其他选项卡上的其他单元格的值更改为相同的值。这是来自 tab1 的示例(其他选项卡目前在内容和布局上完全相同,但此脚本的版本已进行本地调整):
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
我尝试根据此值过滤这两个选项卡上的行:如果设置为 5,则应显示 A 列中包含 5 或更小值(或 3 或更小值、2 或更小值等)的所有行。我为此创建了一个辅助列,用于检查 I2 中的值并比较 A 列值:
=IF(A5<=$I$2,"yes","no")
这个想法是,任何带有“是”的东西都会显示出来,而任何带有“否”的东西都会被隐藏起来。
目前我在每个选项卡上手动使用自动筛选,但我想自动更改筛选条件。虽然我使用内置公式将复杂的电子表格组合在一起方面相当熟练,但使用 vba 我还很陌生。
这看起来很有希望(上面也有介绍): https: //www.tutorialspoint.com/how-to-autofilter-rows-based-on-cell-values-in-excel,它似乎没有使用完整的自动筛选下拉菜单,但仍然有效:
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
这将获取 E2 的值并隐藏标题与 E1 匹配的列中值的行。自动筛选下拉菜单不可用,但这没问题,因为筛选才是最重要的部分。
我遇到的问题是,这个脚本似乎无法识别链接单元格的更改,只能识别直接用户输入的更改。因此,您必须再次对每个选项卡进行编辑,这正是我想要避免的(即在一个地方更改值,让过滤器在所有地方都更改)...
诀窍在于为第二个单元格添加另一项检查(参见下面的第二行):
此脚本的细微变化(更改“tab1”和“tab2”)现在已应用于三个选项卡中。现在,通过任一选项卡上的下拉菜单更改值会导致自动筛选自动应用于所有三个选项卡。
感谢gns100为我指明正确的方向!
编辑:范围正上方的单元格(在本例中为 A3:E3)需要为空,否则过滤器将隐藏所有内容。