我有几种形式,有几行代码用于调用和放置每行代码。我不想为每个表单复制这些代码行,而是想简单地使用子例程来加载和放置表单。这段代码有效:
Sub LoadForm_BulletBeginningEmphasis()
Load formBulletBeginningEmphasis
formBulletBeginningEmphasis.Show
formBulletBeginningEmphasis.StartUpPosition = 0
formBulletBeginningEmphasis.Left = Application.Left + (0.5 * Application.Width) - (0.5 * formBulletBeginningEmphasis.Width)
formBulletBeginningEmphasis.Top = Application.Top + (0.5 * Application.Height) - (0.5 * formBulletBeginningEmphasis.Height)
End Sub
不过,我想要的是让此代码起作用,而不是:
Public Sub LoadAndShowForms(ByVal formName As Object)
Load formName
formName.Show
formName.StartUpPosition = 0
formName.Left = Application.Left + (0.5 * Application.Width) - (0.5 * formName.Width)
formName.Top = Application.Top + (0.5 * Application.Height) - (0.5 * formName.Height)
End Sub
Sub LoadForm_BulletBeginningEmphasis()
Call LoadAndShowForms(formBulletBeginningEmphasis)
End Sub
问题在于,当我执行第二组代码行时,它们可以工作并且表单可以工作,但是当表单消失时,VBA会引发错误:
这是怎么回事?为什么第二个版本可以正常工作但抛出错误?
答案 0 :(得分:1)
在定位命令之后 放置Show
方法。
考虑一下,当显示 modal UserForm时,代码执行会暂停,这很有意义。在逻辑上在Show
之后执行的代码不起作用。
根据用户窗体“消失”的方式,将显示错误。如果有代码“隐藏”在要卸载它的用户窗体中,则“被调用者”(用户窗体)将不再可用。如果代码仅隐藏UserForm,则可能不会发生错误(因为该对象仍加载在内存中)。
从另一个过程中调用the时,也会有所不同:在问题的第一个代码示例中,该过程很可能只是默默地结束,即使它没有执行窗体的定位。在第二个代码示例中,执行必须将控制权返回给调用过程,但这不能执行,因为它所调用的过程无法正确完成。
答案 1 :(得分:0)
我相信您的问题是您正在传递ByVal形式,并且应该是ByRef。 Public Sub LoadAndShowForms(ByRef formName as Object)
。我还将Object
更改为UserForm
。您订阅者的签名将变为Public Sub LoadAndShowForms(ByRef formName as UserForm)