Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA/Word:将表单名称作为参数传递会起作用,但会导致错误_Vba_Forms_Ms Word - Fatal编程技术网

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

VBA/Word:将表单名称作为参数传递会起作用,但会导致错误,vba,forms,ms-word,Vba,Forms,Ms Word,我有几个表单,有几行代码用于调用和放置每个表单。我不想为每个表单复制这些代码行,我只想使用一个子例程来加载和放置表单。此代码适用于: Sub LoadForm_BulletBeginningEmphasis() Load formBulletBeginningEmphasis formBulletBeginningEmphasis.Show formBulletBeginningEmphasis.StartUpPosition = 0 formBulletBeginningEmphasis.Le

我有几个表单,有几行代码用于调用和放置每个表单。我不想为每个表单复制这些代码行,我只想使用一个子例程来加载和放置表单。此代码适用于:

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会抛出一个错误:


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

我认为您的问题在于您正在通过ByVal表单,它应该是ByRef。公共子加载并显示FormsByRef formName作为对象。我还将对象更改为UserForm。您的sub的签名将成为公共sub Load,ShowFormsByRef formName作为UserForm

将Show方法置于定位命令之后

如果您仔细想想,这是有意义的,因为当显示模式用户表单时,代码执行会暂停。逻辑上在Show之后执行的代码不应该有任何效果

根据用户窗体消失的方式,将显示错误。如果UserForm后面有卸载它的代码,那么UserForm的被调用方将不再可用。如果代码仅隐藏UserForm,则可能不会发生错误,因为对象仍加载在内存中


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

您是否尝试过将Show方法放在定位命令之后?@Cindymister,这就解决了问题。谢谢您能解释一下为什么第一种方法执行时Show方法可以位于所有代码之前,但第二种方法执行时必须遵循所有代码吗?感谢您提供的解决方案和信息。不幸的是,这些信息目前在我头上。你能指出一篇文章给我一些背景信息,以便我能更好地理解你的答案吗?对不起,我不知道任何一篇——我的答案基于逻辑和25年的经验,而不是任何文档。VBA代码可以以静默方式结束,子代码中不会显示错误,就像第一个示例中可能发生的那样。但在第二个示例中,LoadForm_BulletBeginingEmphasis期望代码执行返回。如果LoadAndShowForms无法完成并且必须返回代码执行,则这将强制显示错误,而不是以静默方式结束。谢谢。我认为LoadAndShowForms是导致错误的原因,因为调试器会立即在该过程中突出显示formName.Show。@JoshG是导致错误的原因之一。只是如果不是从另一个过程调用它,它就不会被显示。