计算事件:在单元格中插入注释如果值,则删除任何注释,如果不是值

时间:2013-07-17 23:16:50

标签: vba excel-vba excel

以下代码是一个更改事件处理程序,它搜索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

1 个答案:

答案 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作为单个单词;这个冒号可能会引起问题。

在OPs编码解决方案之后

添加:您的代码可以简化:

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