如何延迟或延迟 VBA 中的代码执行

How to delay or postpone code execution in VBA

场景

创建一个空白工作簿并添加一个ToggleButton 和一个InkPicture 控件(后者通过ActiveX 控件-> 更多控件插入)。在 InkPicture 控件的 SizeChanged 事件中,添加行:

Sheet1.ToggleButton1.Caption = "foo bar"

问题

上面一行中的“未找到方法或数据成员”错误突出显示了该行中 .ToggleButton1 的出现。

原因

墨迹图片的 SizeChanged 事件发生在创建切换按钮之前,在某些情况下,该事件发生在工作簿的 Open 事件之前!您可以 Debug.Print 立即 Window 中的相关消息来查看。

问题

如何post在创建切换按钮并可以作为工作表的 属性 访问之前,暂停墨迹图片的 SizeChanged 代码的执行?当然,我可以通过创建一个 Boolean 变量来解决此问题,以避免 InkPicture 的 SizeChanged 事件执行到工作簿的 Open 事件结束,但这只是解决问题的方法并没有解决实际问题。

我试过的

保存并重新打开工作簿后,每次尝试似乎都有效,但在后续保存和打开时都失败了。

注意:我已经编辑了我的 post 以使其更加简洁易读,所以请不要过分热心并对合理的问题投反对票...

根据您需要访问的属性,您可以尝试通过 Worksheet.OLEObjects 集合获取对您的控件的引用。

示例:

Private Sub InkPicture1_Resize(Left As Long, Top As Long, Right As Long, Bottom As Long)
    Dim oleObj As OLEObject

    Set oleObj = Sheet1.OLEObjects("ToggleButton1")
    oleObj.Left = 1
    oleObj.Top = 1
    '...
End Sub

这样,您就可以通过 OLEObject 接口与控件进行交互。因此,某些控件属性可能不可用。通常情况下,你可以通过抓取OLEObject.Object属性,通过其特定的控件界面(即ToggleButton界面)与控件进行交互。

Private Sub InkPicture1_Resize(Left As Long, Top As Long, Right As Long, Bottom As Long)
    Dim tb As MSForms.ToggleButton

    Set tb = Sheet1.OLEObjects("ToggleButton1").Object

    tb.Caption = "foo"
End Sub

但是,这似乎会导致工作簿启动时出错。我相信这是一个安全问题。但是,至少这个错误是一个你可以捕获和处理的运行时,而不是你现在看到的无法处理的 Method or data member not found 编译器错误。

希望对您有所帮助!