我有一个工作表,有一个可点击的形状和一个侦听该工作表的更改事件的类:
表1:
Public Sub Shape_click()
Debug.Print "click"
End Sub
第1类:
Private WithEvents sh As Worksheet
Private Sub Class_Initialize()
Set sh = Sheet1
End Sub
Private Sub sh_Change(ByVal Target As Range)
Debug.Print "change: " & Target.Address
End Sub
当我在 Sheet1 中编辑单元格并直接单击形状时,输出为
click
change: $B$1
我想在形状宏中触发更改事件,以便在打印"单击"之前发生更改事件。DoEvents,来自kernel32的睡眠和来自Shape_click的其他一些细胞的激活对我不起作用。
我发现了两个"黑客",第一个非常有限,但第二个可以完成这项工作:
-
Selection.Cut
:Public Sub Shape_click() Selection.Cut Selection Debug.Print "click" End Sub
它使 Change 事件触发 3 次("单击"之前 2 次,之后 1 次(,每次使用正确的(更改的(值。
当然,您需要检查
Selection
(如果已设置,是否为Range
类型等(该解决方案非常有限,因为您无法将其与选择中的合并单元格一起使用(会询问您是否要取消合并它们(。
-
Selection.Value = Selection.Value
Public Sub Shape_click() Selection.Value = Selection.Value Debug.Print "click" End Sub
甚至可以与合并的单元格一起使用。还需要检查
Selection
它是否真的包含范围。