在形状/button单击事件中触发具有激活的编辑单元格的工作表的更改事件

我有一个可点击形状的工作表和一个监听该表的更改事件的类:

工作表Sheet1:

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 

我想触发形状macros中的更改事件,以便在打印“单击”之前发生更改事件。 DoEvents,来自kernel32的睡眠以及来自Shape_click的一些其他单元的激活对我来说都不起作用。

我find了两个“黑客”,第一个非常有限,但第二个做这个工作:

  1. Selection.Cut

     Public Sub Shape_click() Selection.Cut Selection Debug.Print "click" End Sub 

    它使Change事件触发3次(在“click”之前是2倍,在之后是1倍),每次使用正确(更改)的值。

    当然,你需要检查Selection (如果它被设置,如果是Rangetypes等)

    该解决scheme是相当有限的,因为你不能在select合并的单元格中使用它(会问你是否想取消它们)。

  2. Selection.Value = Selection.Value

     Public Sub Shape_click() Selection.Value = Selection.Value Debug.Print "click" End Sub 

    甚至与合并的单元格一起工作。 如果确实包含范围,还需要检查Selection