我目前有一个宏来自动过滤我的数据。当单元格发生变化时,我无法自动运行它。我想让宏在单元格中的值发生变化时运行。将不胜感激任何一种帮助。我想知道问题在于我将代码放在哪个工作表中。
我的代码如下。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
' The variable KeyCells contains the cells that will
' cause an alert when they are changed. In this case,
' Cell B2 will be changed when a value is selected on
' another worksheet.
Set KeyCells = Range("B1:B2")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
' Perform advanced filter on data
' Place your code here.
Range("B4:H976").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("SalesByLocation!Criteria"), Unique:=False
End If
End Sub
答案 0 :(得分:0)
欢迎来到SO!
您需要将代码放在要应用更改的工作表模块中。即不要将它放在任何模块中,而是双击项目的SheetX(X是工作表的编号)。
查看您的代码,您可能还应该插入
Application.EnableEvents = False
在IF
子句之后,然后
Application.EnableEvents = True在
End If
之前。否则事件代码可能会再次触发事件,从而导致实际的堆栈溢出。
答案 1 :(得分:0)
对我来说很好。
尝试打开立即窗口(Ctrl + G)并输入以下内容,然后按Enter键:
Application.EnableEvents = True
现在查看代码是否有效? 这将确保应用程序正在侦听要触发的事件。
作为测试,我一直在使用以下内容,消息框显示正常:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("B1:B2")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
' Perform advanced filter on data
' Place your code here.
MsgBox "Hello Event"
End If
End Sub
B1:B2中的值如何变化? - 通过细胞中的公式?或者用户是否进入单元格,更改值,然后按Enter键? ......第二种选择是已经实施的。
修改强>
我认为您需要探索worksheet_calculate
事件
进一步修改
您可能最好为组合框的更改事件创建一个事件过程,该事件过程在B1:B2
中提供值。这个封闭的问题实际上是一个很好的起点,因为它与其他问题有很多联系:
答案 2 :(得分:0)
我解决了这个问题!我最终将代码分成不同的形式,然后调用高级过滤器宏。我猜我前面的代码有点问题。把它改成了这样的东西。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C4")) Is Nothing Then
Exit Sub
Else
Call Sheet4.AFilter
End If
End Sub