注意:我一直在提及這個鏈接的人現在很多,所以我會讓這個Worksheet_Change
一站式發佈。無論何時,當我抽出時間時,我都會添加新的內容,以便人們可以從中受益。
我使用Worksheet_Change
當你不需要工作表名稱總是推薦這樣做。據瞭解,該代碼將在當前圖紙上運行,除非您試圖使用另一張表作爲參考。 「testpage」是Activesheet的名稱還是不同的工作表?
每當您使用Worksheet_Change
事件時。如果要將數據寫入單元,請始終切換Off
事件。這是必需的,以便代碼不會進入無限循環
每當您關閉事件時,如果出現錯誤,請使用錯誤處理,否則代碼將不會在下次運行。
嘗試,你可能要與此事件工作時就知道這個
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
Range("A1:A8").Formula = "=B1+C1"
Letscontinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume Letscontinue
End Sub
一些其他的東西。
如果你想確保在多個小區改變,那麼加一個小檢查
Private Sub Worksheet_Change(ByVal Target As Range)
'~~> For Excel 2003
If Target.Cells.Count > 1 Then Exit Sub
'
'~~> Rest of code
'
End Sub
的CountLarge
在Excel 2007中引入的代碼不能運行以後,因爲Target.Cells.Count
返回一個Integer
值由於增加了行/列,Excel 2007中出現錯誤。 Target.Cells.CountLarge
返回值Long
。
Private Sub Worksheet_Change(ByVal Target As Range)
'~~> For Excel 2007
If Target.Cells.CountLarge > 1 Then Exit Sub
'
'~~> Rest of code
'
End Sub
要與已更改使用此代碼
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aCell As Range
For Each aCell In Target.Cells
With aCell
'~~> Do Something
End With
Next
End Sub
爲了檢測特定的細胞變化的所有細胞不起作用,使用Intersect
。例如,如果在細胞A1
一個改變發生,則下面的代碼將觸發
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
MsgBox "Cell A1 was changed"
'~~> Your code here
End If
End Sub
要在一組特定的範圍檢測變化,再次使用Intersect
。例如,如果在範圍A1:A10
的變化情況,然後下面的代碼將火
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
MsgBox "Cell in A1:A10 range was changed"
'~~> Your code here
End If
End Sub
類中的代碼不會在那裏「崩潰」,而是在調用代碼中。 「testpage」是否存在? –
是的,它似乎只發生在我運行Worksheet_Change中的代碼時 – derek
當你寫公式時,「testpage」表中的Range(「A1:A8」)是否乾淨?有沒有數據透視表或任何其他類似的東西?此外,只是好奇,爲什麼你需要在工作表中每次更改之後在同一個地方寫同一個公式? –