如何延迟或延迟 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
事件结束,但这只是解决问题的方法并没有解决实际问题。
我试过的
- 停止调试器,重新编译VBA项目并保存
之后
- 在上面的行前添加
DoEvents
- 将切换按钮的
AutoLoad
属性 设置为 True
,尝试
在墨迹图片 之前创建切换按钮
保存并重新打开工作簿后,每次尝试似乎都有效,但在后续保存和打开时都失败了。
注意:我已经编辑了我的 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 编译器错误。
希望对您有所帮助!
场景
创建一个空白工作簿并添加一个ToggleButton 和一个InkPicture 控件(后者通过ActiveX 控件-> 更多控件插入)。在 InkPicture 控件的 SizeChanged
事件中,添加行:
Sheet1.ToggleButton1.Caption = "foo bar"
问题
上面一行中的“未找到方法或数据成员”错误突出显示了该行中 .ToggleButton1
的出现。
原因
墨迹图片的 SizeChanged
事件发生在创建切换按钮之前,在某些情况下,该事件发生在工作簿的 Open
事件之前!您可以 Debug.Print
立即 Window 中的相关消息来查看。
问题
如何post在创建切换按钮并可以作为工作表的 属性 访问之前,暂停墨迹图片的 SizeChanged
代码的执行?当然,我可以通过创建一个 Boolean
变量来解决此问题,以避免 InkPicture 的 SizeChanged
事件执行到工作簿的 Open
事件结束,但这只是解决问题的方法并没有解决实际问题。
我试过的
- 停止调试器,重新编译VBA项目并保存 之后
- 在上面的行前添加
DoEvents
- 将切换按钮的
AutoLoad
属性 设置为True
,尝试 在墨迹图片 之前创建切换按钮
保存并重新打开工作簿后,每次尝试似乎都有效,但在后续保存和打开时都失败了。
注意:我已经编辑了我的 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 编译器错误。
希望对您有所帮助!