我在使用Worksheet_Change时推荐这个
-
您不需要工作表名称。在工作表代码模块中,非限定范围引用引用该工作表。也就是说,使用Me 限定词更清楚。如果您尝试使用其他工作表,请使用该工作表限定范围引用。
-
每当您使用Worksheet_Change 事件时,如果您正在将数据写入任何单元格,请始终切换Off 事件。这是必需的,以便代码不会重新触发 Change 事件,并进入可能的无限循环
-
每当您关闭事件时,请使用错误处理将其重新打开,否则如果出现错误,代码将不会在下次运行。
试试这个
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
Me.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 返回的 Long 值可能会在 Excel 2007 中出错,因为总单元格数增加。
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。例如,如果 Cell A1 发生更改,则以下代码将触发
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.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, Me.Range("A1:A10")) Is Nothing Then
MsgBox "one or more Cells in A1:A10 range was changed"
'~~> Your code here
End If
End Sub