如何在VBA中延迟或推迟代码执行

场景

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

Sheet1.ToggleButton1.Caption = "foo bar"

问题

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

原因

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

问题

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

我尝试过的事情

  • 停止调试器,重新编译VBA项目并保存 之后
  • 在上面的行之前添加DoEvents
  • 尝试将切换按钮的AutoLoad属性设置为True 在墨水图片之前创建切换按钮

在保存并重新打开工作簿后,每次尝试似乎都能奏效,但随后的保存和打开失败。

注意:我对我的帖子进行了编辑,使其更加简洁易读,因此请不要过分热心并否决一个合法的问题...

etreg 回答:如何在VBA中延迟或推迟代码执行

根据需要访问的属性,可以尝试通过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,Bottom As Long)
    Dim tb As MSForms.ToggleButton

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

    tb.Caption = "foo"
End Sub

但是,这似乎在工作簿启动时导致错误。我相信这是安全的事情。但是,至少此错误是您可以捕获并处理的运行时,与您现在看到的难以解决的 Method或数据成员未找到编译器错误相反。

希望这会有所帮助!

本文链接:https://www.f2er.com/3000447.html

大家都在问