1

我目前有一个宏来自动过滤我的数据。当单元格更改时,我无法让它自动运行。我希望宏在单元格中的值发生变化时运行。将不胜感激任何帮助。我想知道问题是否出在我将代码放入哪个工作表中。

我的代码如下。

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
4

3 回答 3

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事件

参考其他 SO 文章


进一步编辑

您可能会更好地为组合框的更改事件创建一个事件过程,该事件在B1:B2. 这个封闭的问题实际上是一个很好的起点,因为它与其他问题有很多链接:

参考其他关于组合框事件的文章

于 2013-03-11T21:57:02.227 回答
0

欢迎来到 SO!

您需要将代码放在要应用更改的工作表模块中。即不要将它放在任何模块中,而是双击项目的SheetX(X 是工作表的编号)。

查看您的代码,您可能还应该插入

Application.EnableEvents = False

IF子句之后然后

Application.EnableEvents = True

之前End If。否则事件代码可能会再次触发事件,导致实际的堆栈溢出。

于 2013-03-11T19:44:37.217 回答
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
于 2013-03-13T11:25:55.157 回答