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

问题描述 投票:-1回答:1

场景

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

Sheet1.ToggleButton1.Caption = "foo bar"

问题

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

原因

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

问题

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

我尝试过的事情

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

保存并重新打开工作簿后,每次尝试都似乎起作用,只是在随后的保存和打开中失败。

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

excel vba activex delay execution
1个回答
0
投票

根据需要访问的属性,您可以尝试通过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

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

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.