2013-03-11 58 views
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 
+0

你试过调试它吗?在'Set KeyCells = Range(“B1:B2”)'设置一个断点,看看是否有命中。 – nunzabar 2013-03-11 19:44:03

+0

你好,你是什么意思设置一个断点? – sychia2010sis 2013-03-11 19:57:21

+0

要设置断点,请将光标置于'Set KeyCells = ...'行并按F9。当代码被执行时,即事件触发,VBA将停止执行 - 您可以使用F8单步执行代码以查看发生了什么。试一试,让使用知道它是如何去的。 PS:请在任何评论中使用@username,以便在您的回复中收到通知! – 2013-03-11 20:20:01

回答

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 
0

欢迎来到SO!

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

看,你可能还应该插入

 
Application.EnableEvents = False 

IF条款后再

 
Application.EnableEvents = True 
End If

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

+0

我把它放在工作表模块中,就像你说的一样,并将两个语句插入到我的代码中,但它仍然不会运行宏值得到改变。 – sychia2010sis 2013-03-11 19:56:34

+1

...同样,虽然我会试图使用立即窗口运行这段代码'Application.EnableEvents = True',只是为了确保事件在 – whytheq 2013-03-11 21:53:19

0

适合我。

尝试打开立即窗口(Ctrl + G),然后键入以下命令,然后按回车键:

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改变了吗? - 通过单元格中的公式?或者用户进入单元格,更改该值,然后按回车? ......第二种选择是已经实施的。


编辑

我认为你需要探索worksheet_calculate事件

REFERENCE TO OTHER SO ARTICLE


进一步编辑

您可能会更好地创建一个事件过程,用于提供B1:B2中值的组合框的更改事件。这种封闭式的问题实际上是一个很好的起点,因为它有不少链接到其他问题:

REFERENCE TO OTHER SO ARTICLE ABOUT COMBOBOX EVENTS

+0

我试图使用您的代码作为测试和msgbox不出现。这是由于B2中的值是如何改变的?因为它通过一个公式,它接受用户从另一个工作表上的下拉列表中选择的内容? – sychia2010sis 2013-03-12 03:57:18

+0

试着用键盘在单元格中输入一个数字(你总是可以将公式复制回来),并在输入数字后按回车 – whytheq 2013-03-12 08:24:57

+0

我相信它与工作表的触发点有关。我从工作表1上的下拉列表中进行选择,并在工作表2上进行高级筛选。我认为这就是为什么代码的第一部分没有运行。 – sychia2010sis 2013-03-13 08:01:47