2017-02-28 40 views
3

我花了最后几个星期编码用户窗体。我的问题很简单,我应该在哪里放置加载和卸载frm1(用户名称为frm1),我应该在哪里放置Me.Show和Me.Hide。问题是,用户窗体内的(x)按钮不起作用。 现在我的加载和卸载是Active-X命令按钮的代码我已经写在Sheet1中发现:如何正确加载和卸载用户窗体(VBA)

Private Sub cmdb1_Click() 
    Load frm1 
    Unload frm1 
End Sub 

这样,我的用户窗体被初始化,我可以运行代码

Private Sub Userform_Initialize() 
    'Some other code that Works... 
    frm1.Show 
End Sub 

显示我的Userform。现在,我有我的用户窗体具有代码

Private Sub cmdbClose_Click() 
    Me.Hide 
End Sub 

,我用它来隐藏子,在其内cmdb1_Click最后一行()被执行并且用户窗体被卸载命令按钮。这工作。

然而,当我按在我的用户窗体(X)按钮,出现如下错误出现Run-time error '91'

调试说错误在于内cmdb1_Click()。我已经尝试添加一个名为UserForm_QueryClose()的子,但错误仍然存​​在。如果我不得不猜测,我会说错误是由我处理加载和卸载的方式造成的,因此通过cmdb1_Click()。

编辑:

这是未来的读者。我的问题解决了,代码如下。 ShowUserform和cmdbClos​​e_Click包含CallumDA建议的代码。我的命令按钮现在有:

Private Sub cmdb1_Click() 
    Load frm1 
    Call ShowUserform 
End Sub 

回答

4

将这个标准模块中,并将其链接到按钮,用来显示用户窗体

Sub ShowUserform 
    frm1.Show 
End Sub 

然后在用户窗体

Private Sub cmdbClose_Click() 
    Unload Me 
End Sub 
+0

这工作,谢谢! – SAFD

5

我建议您创建一个用户表单实例:

Dim MyDialog As frm1 

Set MyDialog = New frm1 'This fires Userform_Initialize 

此后可以轻松地检查表单是否正在试图卸载之前加载:

If Not MyDialog Is Nothing Then 
    Unload MyDialog 
End If 

我也建议你不要从窗体的初始化事件显示方法。把你的用户表单看作Excel中的另一个对象,并从你的主代码体中进行管理。

另外,我不会像CallumDA所建议的那样,在cmdbClos​​e_Click事件中卸载它(尽管这对解决当前问题很有效)。通常情况下,您需要能够从您的主代码体中引用表单中的值,并且如果卸载它,它们将不可用。相反,保持它就像你在第一个地方有它:

Private Sub cmdbClose_Click() 
    Me.Hide 
End Sub 

所以,你的主代码体(在您的ActiveX按钮)将是这个样子:

Dim MyDialog as frm1 

Set MyDialog = New frm1  'This fires Userform_Initialize 
'Place any code you want to execute between the Initialize and Activate events of the form here 
MyDialog.Show   'This fires Userform_Activate 
'When the close button is clicked, execution will resume on the next line: 
SomeVariable = MyDialog.SomeControl.Value 
'etc. 

If Not MyDialog Is Nothing Then 
    Unload MyDialog 
End If 

您还可以赶上事件火灾是在用户单击窗体上的“X”,并防止形式从被卸载:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    Cancel = True 
    Me.Hide 
End Sub