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



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

表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的其他一些细胞的激活对我不起作用。

我发现了两个"黑客",第一个非常有限,但第二个可以完成这项工作:

  1. Selection.Cut

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

    它使 Change 事件触发 3 次("单击"之前 2 次,之后 1 次(,每次使用正确的(更改的(值。

    当然,您需要检查Selection(如果已设置,是否为Range类型等(

    该解决方案非常有限,因为您无法将其与选择中的合并单元格一起使用(会询问您是否要取消合并它们(。

  2. Selection.Value = Selection.Value

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

    甚至可以与合并的单元格一起使用。还需要检查Selection它是否真的包含范围。

最新更新