更改.Caption时VBA UserForm运行两次

时间:2012-07-25 16:53:38

标签: vba caption userform solidworks

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

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

非常感谢。

2 个答案:

答案 0 :(得分:5)

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

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

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

Me.Caption = "blah"

而不是

UserForm1.Caption = "blah"

可能(只是一个我无法证明的理论)设置为“我指向真实实例”的标志不是在您更改标题属性时设置的,并且通过使用自动实例化变量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

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

答案 1 :(得分:1)

正如迪克建议的那样,你应该能够通过确保使用me.caption代替Userform1.caption来阻止这种行为。

这是一种可以为那些好奇的人复制问题的方法:

创建Userform(Userform1)确保将ShowModal设置为false,否则您将无法看到此内容。

在模块中添加以下内容:

Option Explicit
Sub ShowUserForm()
    Dim uf As UserForm1
    Set uf = New UserForm1
End Sub

在UserForm1中列出以下代码:

Option Explicit
Private Sub UserForm_Initialize()
    UserForm1.Caption = "I'm UserForm1!" 'This will call the Initialize method of Userform1 not Me.
    Me.Caption = "I'm Me!" 
    Me.Show
End Sub

运行ShowUserForm。您现在有两个具有不同标题的Userforms。

顺便提一下,如果你有像我这样的初始化方法,那么向ShowUserForm添加Set uf = Nothing实际上无法关闭任何一种形式。