添加评论后如何触发VBA代码?

时间:2016-03-19 11:40:51

标签: vba excel-vba excel

如果您向包含单词"今天"的单元格添加注释,那么我们希望触发VBA代码来替换"今天"今天的评论日期。但问题是我无法找到事件(或任何其他方式)来了解添加评论的时间,或者知道哪个单元格(范围对象)。有任何想法吗?

我当前的愚蠢解决方案是在Worksheet_SelectionChange事件中添加VBA代码(遗憾的是,在选择更改之前我无法获取旧位置),然后执行For Each循环,检查表格中的每个评论,然后执行该替换。

2 个答案:

答案 0 :(得分:0)

解决方法可能是使用“帮助”单元格来存储最后一个选定单元格的地址,以便一旦用户完成注释并选择另一个单元格,事件处理程序将仅检查“最后一个”单元格

类似于下面的内容(我使用单元格“A1”作为“帮助者”)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cmt As Comment

With Target
    If .Address <> Cells(1, 1) Then
    Set cmt = Range(Cells(1, 1)).Comment
        If Not cmt Is Nothing Then
            With cmt
                .Text (Replace(.Text, "today", Date))
            End With
        End If
    End If
End With

Cells(1, 1) = Target.Address

End Sub

答案 1 :(得分:0)

上次单击的单元格的地址可以方便地存储在变量中。下面的代码应安装在期望采取措施的选项卡的代码表中。激活工作表后,它将记录ActiveCell并跟踪此后的每次单击。如果上次单击的单元格中有评论,它将用当前计算机日期替换“今天”一词。

Dim PrevCell As Range

Private Sub Worksheet_Activate()
    Set PrevCell = ActiveCell               ' last previously selected cell
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim Cmt As Comment

    On Error GoTo NoPrevCell
    ' an error would occur if your code crashes for some
    ' unrelated reason and the sheet isn't activated
    ' before resuming work on the same sheet.
    Set Cmt = PrevCell.Comment
    If Not Cmt Is Nothing Then
        With Cmt
            .Text Replace(.Text, "today", Format(Date, "dd-mm-yy"), _
                           1, -1, vbTextCompare)
        End With
    End If

    Set PrevCell = ActiveCell
    Exit Sub

NoPrevCell:
    Worksheet_Activate
    Resume 0
End Sub

我认为让此应用程序的替换功能能够识别“ Today”的大小写,这一点很重要。这是通过在函数本身中指定不区分大小写来实现的。我也更喜欢在函数中在此处设置日期格式,而不是依赖Windows设置中确定的“短日期”格式。