VBA / Word:将表单名称作为参数传递有效,但会导致错误

时间:2018-09-07 19:07:14

标签: vba forms word-vba

我有几种形式,有几行代码用于调用和放置每行代码。我不想为每个表单复制这些代码行,而是想简单地使用子例程来加载和放置表单。这段代码有效:

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会引发错误: enter image description here

这是怎么回事?为什么第二个版本可以正常工作但抛出错误?

2 个答案:

答案 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)