gpt4 book ai didi

excel - 如何加载和卸载用户表单

转载 作者:行者123 更新时间:2023-12-01 18:26:17 25 4
gpt4 key购买 nike

我应该在哪里放置Load和Unload frm1(用户表单名称是frm1)以及我应该在哪里放置Me.Show和Me.Hide?

用户窗体中的 (x) 按钮不起作用。

我的加载和卸载位于 Sheet1 上的 Active-X 命令按钮代码中:

 Private Sub cmdb1_Click()
Load frm1
Unload frm1
End Sub

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

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

显示我的用户表单。现在我的用户表单中有一个命令按钮,其中包含代码

Private Sub cmdbClose_Click()
Me.Hide
End Sub

我用它来隐藏子程序,在该子程序上执行cmdb1_Click() 中的最后一行并卸载UserForm。这有效。

但是,当我按用户窗体中的 (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

最佳答案

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

Dim MyDialog As frm1

Set MyDialog = New frm1 'This fires Userform_Initialize

然后,您可以在尝试卸载表单之前轻松检查表单是否已加载:

If Not MyDialog Is Nothing Then
Unload MyDialog
End If

我还建议您不要从表单的 Initialize 事件中调用 Show 方法。将您的用户表单视为 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)
If CloseMode = VbQueryClose.vbFormControlMenu Then
Cancel = True
Me.Hide
End If
End Sub

最后,您通常需要表单上有一个“取消”按钮。我处理这个问题的方法是在表单的代码隐藏中创建一个“Cancelled”属性:

Public Cancelled as Boolean
'(Note You can create additional properties to store other values from the form.)

在“取消”按钮的单击事件中:

Private Sub cmdbCancel_Click()
Me.Cancelled = True
Me.Hide
End Sub

在主代码主体中:

Dim MyDialog as frm1

Set MyDialog = New frm1
MyDialog.Show

If Not MyDialog.Cancelled Then
SomeVariable = MyDialog.SomeControl.Value
SomeOtherVariable = MyDialog.SomeOtherProperty
'etc.
End If

If Not MyDialog Is Nothing Then
Unload MyDialog
End If

(我知道上面的方法严格来说并不是声明属性的正确方法,但这可以很好地工作。如果您愿意,可以按照通常的方式将其设置为只读。)

关于excel - 如何加载和卸载用户表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42507367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com