更改.Caption时VBA UserForm运行两次

Chr*_*Day 1 vba caption solidworks userform

我正在从SolidWorks运行VBA宏.该表单兼作两种文档的输入.在UserForm.Initialize子例程中,我正在Caption根据打开的文档类型更改UserForm的名称.每当我这样做时,程序会重新运行UserForm.Initialize,当它完成后,它会从它离开的地方继续运行,有效地运行两次.

有没有人知道解决这种奇怪行为的方法?我尝试将命令放入自己的Sub中,但结果是一样的.FormName.Caption

非常感谢.

Dic*_*ika 5

我无法复制问题而且我不知道SolidWorks是什么,因此可能与它有关.也许您可以发布一个示例,显示Initialize被调用两次.

我的猜测是它与自动实例化变量有关.当您使用UserForm1时,您实例化一个名为UserForm1的对象变量,该变量指向一个对象,也称为UserForm1.它类似于在Dim语句中使用New关键字.你从来没有定义过UserForm1(变量),但VBA做了,第一次使用它时,它会自动实例化.

在userforms类模块中工作时应该尝试使用Me关键字(userforms类似于其他对象,除了它们具有用户界面元素).在Initialize事件中,比方说

Me.Caption = "blah"
Run Code Online (Sandbox Code Playgroud)

代替

UserForm1.Caption = "blah"
Run Code Online (Sandbox Code Playgroud)

它可能(只是一个我无法证明的理论)被设置为"我指向一个真实实例"的标志不是在你更改Caption属性时设置的,而是由使用自动实例化变量UserForm1,您正在强制另一个实例化.

更好的是,不要使用自动实例化变量,尽管它们很方便(并且不要在Dim语句中使用New关键字).您可以控制何时创建和销毁变量,这是最佳实践.在标准模块中有类似的东西

Sub uftst()

    Dim uf As UserForm1

    Set uf = New UserForm1 'you control instantiation here

    'Now you can change properties before you show it
    uf.Caption = "blech"
    uf.Show

    Set uf = Nothing 'overkill, but you control destruction here

End Sub
Run Code Online (Sandbox Code Playgroud)

请注意,如果将ShowModal属性设置为False,则代码将继续执行,因此如果运行无模式,请不要销毁该变量.