以下代码是一个更改事件处理程序,它搜索col B中的单词“fee”,如果在col B中找到“fee”一词,则在3个相邻的cols中插入注释:
Private Sub Worksheet_Calculate()
Dim rng As Range, cell As Range
Set rng = Range("B:B")
If Not rng Is Nothing Then
For Each cell In rng.Cells
If cell.Value = "fee" Then
cell.Offset(0, 1).AddComment "fi"
cell.Offset(0, 2).AddComment "fo"
cell.Offset(0, 3).AddComment "fum"
End If
Next
End If
End Sub
上面的代码工作正常。
我还想搜索col B并删除3个相邻cols中的任何现有注释,如果col中没有出现“fee”这个词。所以,我添加了一个Else语句:
Private Sub Worksheet_Calculate()
Dim rng As Range, cell As Range
Set rng = Range("B:B")
If Not rng Is Nothing Then
For Each cell In rng.Cells
If cell.Value = "fee" Then
cell.Offset(0, 1).AddComment "fi"
cell.Offset(0, 2).AddComment "fo"
cell.Offset(0, 3).AddComment "fum"
Else:
cell.Offset(0, 1).Comment.Delete
cell.Offset(0, 2).Comment.Delete
cell.Offset(0, 3).Comment.Delete
End If
Next
End If
End Sub
这会导致运行时错误:“对象变量或未设置块变量”,调试器指向
cell.Offset(0, 1).Comment.Delete
VBA似乎要我使用With语句,但是我尝试过的With permutations会导致同样的错误。有什么想法吗?
跟进安迪的正确建议。如果满足条件,代码会添加注释,如果不符合则清除注释:
Private Sub Worksheet_Calculate()
Dim rng As Range, cell As Range
Set rng = Range("B:B")
If Not rng Is Nothing Then
For Each cell In rng.Cells
cell.Offset(0, 1).ClearComments
cell.Offset(0, 2).ClearComments
cell.Offset(0, 3).ClearComments
If cell.Value = "fee" Then
cell.Offset(0, 1).AddComment "fi"
cell.Offset(0, 2).AddComment "fo"
cell.Offset(0, 3).AddComment "fum"
End If
Next
End If
End Sub
答案 0 :(得分:1)
VBA并不建议您使用With。如果您在没有注释时尝试删除注释,则会发生错误。
您可以在尝试Delete
之前检查是否存在评论:
Dim cmt As Comment
Set cmt = Range("A1").Comment
If Not cmt Is Nothing Then
Range("A1").Comment.Delete
End If
或更简单,使用ClearComments
:
Range("A1").ClearComments
另请注意,您的第一个代码位于Calculate
事件,而不是Change
。
在Else
之后删除冒号 - 在其自己的行上始终将Else作为单个单词;这个冒号可能会引起问题。
添加:您的代码可以简化:
If Not rng Is Nothing Then
For Each cell In rng.Cells
cell.Offset(0, 1).ClearComments
cell.Offset(0, 2).ClearComments
cell.Offset(0, 3).ClearComments
'or even just
'cell.Range("B1:D1").ClearComments
If cell.Value = "fee" Then
cell.Offset(0, 1).AddComment "fi"
cell.Offset(0, 2).AddComment "fo"
cell.Offset(0, 3).AddComment "fum"
End If
Next
End If