Excel 当在其他模块中访问表单变量时,将自动调用UserForm_Initialize()

Excel 当在其他模块中访问表单变量时,将自动调用UserForm_Initialize(),excel,vba,userform,Excel,Vba,Userform,我试图将一些公开声明的userform变量的值放入其他表单中编写的其他模块中 第一个myform.show函数初始化表单并设置i=0。但是当我使用x按钮关闭表单并使用queryclosed函数更新I的值并控制返回Myform.val=10行时,再次调用userform\u initialize()函数,条件变为false,因为它再次将I设置为0。我不知道为什么会这样。请帮忙 我的工作表模块代码如下: Sub myModule() Myform.Show If Myform.val

我试图将一些公开声明的userform变量的值放入其他表单中编写的其他模块中

第一个myform.show函数初始化表单并设置
i=0
。但是当我使用x按钮关闭表单并使用queryclosed函数更新
I
的值并控制返回
Myform.val=10
行时,再次调用
userform\u initialize()
函数,条件变为
false
,因为它再次将
I
设置为
0
。我不知道为什么会这样。请帮忙

我的工作表模块代码如下:

Sub myModule()
    Myform.Show
    If Myform.val=10 then
        msg "Hi"
    End if
End sub
Public i as integer

Private Sub UserForm_Initialize()        
    i = 0
End sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then
        i = 10
    End If
End Sub
我的表格代码如下:

Sub myModule()
    Myform.Show
    If Myform.val=10 then
        msg "Hi"
    End if
End sub
Public i as integer

Private Sub UserForm_Initialize()        
    i = 0
End sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then
        i = 10
    End If
End Sub
Public i作为整数
私有子用户表单_初始化()
i=0
端接头
私有子用户表单_QueryClose(取消为整数,关闭模式为整数)
如果关闭模式1,则
i=10
如果结束
端接头

如果使用x按钮关闭表单,我希望上述if条件为true;如果使用commandbutton关闭表单,则希望上述if条件为false。

我想建议一些更改。这些都不是必需的,但它将帮助您保持代码整洁。
首先,使用表单的实例,而不是表单。第二,使用属性而不是全局变量。第三,如果卸载表单,则无法再访问其值

模块

Sub myModule()
    Dim MyFormInstance As MyForm

    Set MyFormInstance = New MyForm
    MyFormInstance.Show
    If MyFormInstance.Val = 10 Then
        MsgBox "Hi"
    End If
    Unload MyFormInstance
End Sub
形式呢

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then
        Cancel = 1
        Me.Hide
        i = 10
    End If
End Sub

Property Get Val() As Integer
    Val = i
End Property

Private Sub btnClose_Click()
    i = 20
    Me.Hide
End Sub
Private Sub-UserForm\u QueryClose(取消为整数,关闭模式为整数)
如果关闭模式1,则
取消=1
我,藏起来
i=10
如果结束
端接头
属性Get Val()为整数
Val=i
端属性
专用子btnClose_Click()
i=20
我,藏起来
端接头

我想提出一些修改建议。这些都不是必需的,但它将帮助您保持代码整洁。
首先,使用表单的实例,而不是表单。第二,使用属性而不是全局变量。第三,如果卸载表单,则无法再访问其值

模块

Sub myModule()
    Dim MyFormInstance As MyForm

    Set MyFormInstance = New MyForm
    MyFormInstance.Show
    If MyFormInstance.Val = 10 Then
        MsgBox "Hi"
    End If
    Unload MyFormInstance
End Sub
形式呢

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then
        Cancel = 1
        Me.Hide
        i = 10
    End If
End Sub

Property Get Val() As Integer
    Val = i
End Property

Private Sub btnClose_Click()
    i = 20
    Me.Hide
End Sub
Private Sub-UserForm\u QueryClose(取消为整数,关闭模式为整数)
如果关闭模式1,则
取消=1
我,藏起来
i=10
如果结束
端接头
属性Get Val()为整数
Val=i
端属性
专用子btnClose_Click()
i=20
我,藏起来
端接头

将MyFormInstance设置为MyForm
?这对我来说是新的,请将我链接到这方面的文档。我很好奇。@JvdV,表单在许多方面都与类模块相同,但仍然useful@JvdV…UserForm只是一个类,您可以/应该这样使用它(而不是引用默认实例);你可能会在@Hi sam得到一些推荐信。首先,非常感谢,你的答案解决了问题。我并没有做太多的更改,只是在查询响应函数中添加了cancel=1和me.hide行,就像你们的一样,它可以正常工作。第二,我只是检查给定问题中的if语句是否错误。在if条件中,而不是myform.val,它是myform.i…但无论如何,你解决了它..谢谢..但我仍然不知道为什么myform.i在我的原始代码中调用userform\u initialize函数…如果你能指出原因,它会很有帮助..当你关闭表单时,保存它的变量被重置。由于您使用了隐式实例化,所以它是从头开始创建的。当您更改为
.Hide
时,所有这些都发生了更改。变量永远不会重置,并且您可以使用所有变量。
Dim MyFormInstance As MyForm
?这对我来说是新的,请将我链接到这方面的文档。我很好奇。@JvdV,表单在许多方面都与类模块相同,但仍然useful@JvdV…UserForm只是一个类,您可以/应该这样使用它(而不是引用默认实例);你可能会在@Hi sam得到一些推荐信。首先,非常感谢,你的答案解决了问题。我并没有做太多的更改,只是在查询响应函数中添加了cancel=1和me.hide行,就像你们的一样,它可以正常工作。第二,我只是检查给定问题中的if语句是否错误。在if条件中,而不是myform.val,它是myform.i…但无论如何,你解决了它..谢谢..但我仍然不知道为什么myform.i在我的原始代码中调用userform\u initialize函数…如果你能指出原因,它会很有帮助..当你关闭表单时,保存它的变量被重置。由于您使用了隐式实例化,所以它是从头开始创建的。当您更改为
.Hide
时,所有这些都发生了更改。变量永远不会重置,并且您可以使用所有变量。