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