2012-06-04 37 views
2

我寫了下面的代碼來檢測單元格的值的變化,然後運行宏,但是當數據由於數據連接而刷新時,代碼不起作用。數據刷新時宏不運行?

Private Sub worksheet_change(ByVal target As Range) 
If target.Address = "$A$2" Then 

If target.Value = 1 Then 

taskID = Shell("c:\imawesome.bat", vbNormalFocus) 
    End If 
    If target.Value = 0 Then 

taskID = Shell("c:\Sender.bat", vbNormalFocus) 
    End If 
    End If 
End Sub 

該代碼只適用於手動輸入單元格中的數據。 請建議在刷新數據時運行的代碼。

+1

來自Microsoft的此KB文章可能會有幫助[link](http://support.microsoft.com/kb/213187) – Ateszki

+1

@Ateszki +1。您應該將此作爲答案(假定數據連接是查詢表) – brettdj

回答

0

如果worksheet_change不會觸發,請嘗試使用worksheet_calculate事件。它在任何單元格計算時執行,因此您可以爲您所需的單元格和(之前)值進行測試。

+0

private Sub Worksheet_Calculate() Dim target As Range Set target = Range(「A1」) If Not Intersect(target,Range(「 A1 「))是Nothing然後 如果target.Value = 1然後 的TaskID =殼牌(」 C:\ imawesome.bat 「vbNormalFocus) 結束如果 如果target.Value = 0然後 的TaskID =殼牌(」 c:\ Sender.bat「,vbNormalFocus) 結束如果 結束如果 結束小組它根本沒有工作在刷新。 –

1

在此之後微軟的文章KB213187和假設你的數據連接是的QueryTable

你可以試試這個

創建一個新的模塊,並把這個代碼在它

Public WithEvents qt As QueryTable 

Private Sub qt_BeforeRefresh(Cancel As Boolean) 

    'do your stuff here 

End Sub 

然後另一個模塊創建班級

Dim X As New Class1 

Sub Initialize_It() 
    Set X.qt = Thisworkbook.Sheets(1).QueryTables(1) 
End Sub 

並確保每次打開文檔時都運行Initialize_It。

請注意,此代碼僅適用於每個文檔一個qquerytable,如果您擁有更多,則需要進行修改。

希望它有幫助。