高级过滤器的宏不自动工作

时间:2013-03-11 19:39:33

标签: excel excel-vba vba

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

我的代码如下。

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

3 个答案:

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

REFERENCE TO OTHER SO ARTICLE


进一步修改

您可能最好为组合框的更改事件创建一个事件过程,该事件过程在B1:B2中提供值。这个封闭的问题实际上是一个很好的起点,因为它与其他问题有很多联系:

REFERENCE TO OTHER SO ARTICLE ABOUT COMBOBOX EVENTS

答案 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