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

问题描述 投票:0回答:2

我有几种形式,有几行代码用于调用和放置每一种形式。我没有为每个表单复制这些代码行,而只想使用子程序来加载和放置表单。此代码有效:

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

这里发生了什么?为什么第二个版本工作但是抛出错误?

vba forms word-vba
2个回答
1
投票

在定位命令之后放置Show方法。

如果您考虑一下,这是有道理的,因为当显示模式UserForm时代码执行暂停。在Show逻辑上执行的代码不应该有任何影响。

根据UserForm“消失”的方式,将显示错误。如果卸载它的UserForm的代码“后面”,则“callee”(UserForm)不再可用。如果代码仅隐藏UserForm,则可能不会发生错误(因为对象仍在内存中加载)。

调用另一个过程时它也有所不同:在问题的第一个代码示例中,过程可能只是静默地结束,即使它没有执行表单的定位。在第二个代码示例中,执行必须将控制权返回给调用过程,但它不能,因为它调用的过程无法正确完成。


0
投票

我相信你的问题是你传递的形式ByVal,它应该是ByRef。 Public Sub LoadAndShowForms(ByRef formName as Object)。我也会将Object改为UserForm。你的子签名将成为Public Sub LoadAndShowForms(ByRef formName as UserForm)

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