2013-08-29 141 views
3

這應該很簡單。當單元格的值發生變化時,我想觸發一些VBA代碼。單元格(D3)是來自另外兩個單元格=B3*C3的計算。我曾嘗試方法2:VBA觸發宏單元格值更改

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Column = 4 And Target.Row = 3 Then 
    MsgBox "There was a change in cell D3" 
    End If 
End Sub 

由於該小區是當值的變化,因爲計算是一樣的,這是不觸發計算。我也試過:

Private Sub Worksheet_Calculate() 
    MsgBox "There was a calculation" 
End Sub 

但我有多個計算表上,它會觸發多次。有沒有一種方法可以確定哪些計算在計算事件中發生了變化?還是有另一種方式可以跟蹤D3的變化?

回答

5

你能試試這樣的事嗎?將公式更改爲=D3AlertOnChange(B3*C3)

Private D3OldVal As Variant 

Public Function D3AlertOnChange(val) 
    If val <> D3OldVal Then MsgBox "Value changed!" 
    D3OldVal = val 
    D3AlertOnChange = val 
End Function 
+0

我將變量和公共函數放置在單元格所在的vba表單中。我將公式更改爲'= D3AlertOnChange(B3 * C3)'並且它說'#NAME?'我是否將代碼放置在錯誤的位置? –

+2

嘗試將其放入標準模塊。右鍵單擊任何圖紙並選擇「插入 - >模塊」。 – Chel

+0

雖然我可以調整此解決方案以滿足我的需求,但我想提到的是,在單元格更新單元格之前觸發此事件,而不是之後。在函數的開頭放置一個'MsgBox(val)',你可以看到函數獲得了新的參數值,但是你可以看到該表單元格中的值尚未更新,所以要小心。 –

3

或者嘗試

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim numdependences As Integer 
On Error Resume Next 
HasDependents = Target.Dependents.Count 
If Err = 0 Then 
    If InStr(Target.Dependents.Address, "$D$3") <> 0 Then 
     MsgBox "change" 
    End If 
End If 
On Error GoTo 0 
End Sub 

您需要在情況下,你改變並沒有家屬單元格中的差錯控制。

+0

我以爲這會起作用,但事實並非如此。我看着我的細胞D3改變,沒有事件觸發。 –

+0

它應該只在你的例子中改變B3或C3時才起作用。如果你直接改變D3,它就無法工作。 – Diego

1

試試這個:

Sub Worksheet_Change(ByVal Target As Range) 

    If Not Intersect(Target, Target.Worksheet.Range("B1")) Is Nothing Then 

     Call macro 

    End If 

End Sub 

會在B1單元格的值的變化,然後執行「宏觀」

0

如果你只在看,如果Worksheet_Change那麼它將計數任何改變即使與之前的值相同,也輸入。爲了克服這個問題,我使用一個Public變量來捕獲起始值並進行比較。

這是我的代碼來做到這一點。它還允許您省略工作表的某些部分,或者可以使用它來評估工作表中的每個單元格。

將此代碼放在工作表中。

Public TargetVal As String 'This is the value of a cell when it is selected 


Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
If Target.Cells.CountLarge > 1 Then 'If more then one cell is selected do not save TargetVal. CountLarge is used to protect from overflow if all cells are selected. 
    GoTo EXITNOW 
Else 
    TargetVal = Target 'This sets the value of the TargetVal variable when a cell is selected 
End If 
EXITNOW: 
End Sub 

Sub Worksheet_Change(ByVal Target As Range) 
'When a cell is modified this will evaluate if the value in the cell value has changed. 
'For example if a cell is entered and enter is pressed the value is still evaluated 
'We don't want to count it as a change if the value hasn't actually changed 

Dim ColumnNumber As Integer 
Dim RowNumber As Integer 
Dim ColumnLetter As String 

'--------------------- 
'GET CURRENT CELL INFO 
'--------------------- 
    ColumnNumber = Target.Column 
    RowNumber = Target.Row 
    ColumnLetter = Split(Target.Address, "$")(1) 

'--------------------- 
'DEFINE NO ACTION PARAMETERS 
' IF CELL CHANGED IS IN NO ACTION RANGE, EXIT CODE NOW FOR PERFORMANCE IMPROVEMENT OR TO NOT TAKE ACTION 
'--------------------- 
    If ColumnNumber <> 4 Then 'This would exempt anything not in Column 4 
     GoTo EXITNOW 
    ElseIf RowNumber <> 3 Then 'This would exempt anything not in Row 3 
     GoTo EXITNOW 
    'Add Attional ElseIf statements as needed 
    'ElseIf ColumnNumber > 25 Then 
     'GoTo EXITNOW 
    End If 

'--------------------- 
'EVALUATE IF CELL VALUE HAS CHANGED 
'--------------------- 
Debug.Print "---------------------------------------------------------" 
Debug.Print "Cell: " & ColumnLetter & RowNumber & " Starting Value: " & TargetVal & " | New Value: " & Target 

    If Target = TargetVal Then 
     Debug.Print " No Change" 
     'CALL MACRO, FUNCTION, or ADD CODE HERE TO DO SOMETHING IF NOT CHANGED 
    Else 
     Debug.Print " Cell Value has Changed" 
     'CALL MACRO, FUNCTION, or ADD CODE HERE TO DO SOMETHING IF CHANGED 
    End If 
Debug.Print "---------------------------------------------------------" 

EXITNOW: 
End Sub 
相關問題