添加注释后如何触发VBA代码?

添加注释后如何触发VBA代码?,vba,excel,Vba,Excel,假设您向包含单词“today”的单元格添加注释,则我们希望VBA代码被tiggered,以将注释中的“today”替换为今天的日期。但这里的问题是,我找不到一个事件(或任何其他方式)来知道何时添加了注释,或者在哪个单元格(范围对象)中添加了注释。有什么想法吗 我目前愚蠢的解决方案是在工作表\u SelectionChange事件中添加VBA代码(遗憾的是,我无法在选择更改之前获得旧位置),然后对每个循环执行,检查工作表中的每个注释,然后执行替换。解决方法可能是使用“助手”单元格来存储最后一个选定

假设您向包含单词“today”的单元格添加注释,则我们希望VBA代码被tiggered,以将注释中的“today”替换为今天的日期。但这里的问题是,我找不到一个事件(或任何其他方式)来知道何时添加了注释,或者在哪个单元格(范围对象)中添加了注释。有什么想法吗


我目前愚蠢的解决方案是在
工作表\u SelectionChange
事件中添加VBA代码(遗憾的是,我无法在选择更改之前获得旧位置),然后对每个
循环执行
,检查工作表中的每个注释,然后执行替换。

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

如下所示(我使用单元格“A1”作为“助手”)

Private子工作表\u selection更改(ByVal目标作为范围)
Dim cmt作为评论
有目标
如果。地址单元格(1,1),则
设置cmt=范围(单元格(1,1))。注释
如果不是,那么cmt什么都不是
使用cmt
.Text(替换(.Text,“今天”,日期))
以
如果结束
如果结束
以
单元格(1,1)=目标地址
端接头

上一次单击单元格的地址可以方便地存储在变量中。下面的代码应安装在预期操作的选项卡的代码表中。当工作表被激活时,它将记录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

我认为对于这个应用程序来说,让Replace函数识别小写和大写“Today”是很重要的。这是通过在函数本身中指定大小写不敏感来实现的。我还希望在函数中在此设置日期格式,而不是依赖Windows设置中确定的短日期格式。

为什么不在保存之前的
事件中只执行一次?您的问题充满了拼写错误。请对你的读者保持礼貌,并纠正这一点。。。当我抱怨打字错误的时候,你能原谅我吗?很好的评论,罗杰。好主意,我从没想过这样做。。。谢谢!很高兴这有帮助。只有一个警告:如果您需要在同一工作表模块中添加“工作表更改”事件处理程序,或者在ThisWorkbook模块中添加“工作簿更改”事件处理程序,那么您需要在单元格(1,1)前面添加
Application.EnableEvents=False
语句=Target.Address
Application.EnableEvents=True
实物备忘的右后感谢。明白了:)
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