2013-03-11 56 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