如何在不关闭其他内容的情况下卸载用户窗体?

3
我有两个用户窗体(frmDatastation1frmDatastation2)。当用户单击frmDatastation1上的cmdbutton时,第一个窗体变为隐藏状态(frmDatastation.hide),第二个窗体出现(frmDatastation.show)。这很好用。当用户完成frmDatastation2后,我想回到frmDatastation1并卸载frmdatastation2(以擦除所有内容以便稍后从frmDatastation1再次使用它)。但是,当我卸载frmDatastation2时,一切都关闭(甚至frmDatastation1)。

以下是我在frmDatastation2中的代码:

frmDatastation1.TextBox1.Text = ""  'this is to reset my textbox not sure it's needed
Me.Hide 'hiding frmDatastation2
Unload frmDatastation1
frmDatastation1.Show vbModeless ' to be able to continue with the next step
frmDatastation1.TextBox1.SetFocus
Unload frmDatastation2 'when this line is executed, it closes everything (even frmDatastation1)

2
保持使用.Hide而不是卸载用户窗体。然后,如果您想在每次打开时都使用空白表单,请使用Userform事件Userform_Activate()来清除字段,以便可以重复使用它。它会在每次显示表单(userform.show)时执行Activate事件。 - tigeravatar
为什么你要使用 Unload frmDatastation1 - Egan Wolf
@tigeravatar:谢谢,我喜欢你的想法。但是如果我这样做,我就无法“重置”我的组合框(在frmDatastation中显示的文本或值),因为它的样式设置为下拉列表(我不希望人们修改它的内容)。有什么办法可以重置组合框的值(用户看到的内容,例如:选择您喜欢的果汁..)? - sims
combobox.listindex = -1 - tigeravatar
好的,-1会将combobox设为空白。为了显示一个值(也许你的“选择你喜欢的果汁”是第一项?),你需要将它设置为要显示的文本的ListIndex。0是combobox中的第一行,所以你需要使用 combobox.listindex = 0 - tigeravatar
显示剩余2条评论
1个回答

2

使用对象而不是使用全局/默认实例。

Sub DoSomething()
    Dim parentForm As frmDatastation1
    Set parentForm = New frmDatastation1
    parentForm.Show vbModal
End Sub

因此,实际上没有必要真正地 卸载 任何东西 - 当执行退出 DoSomething 并且对象超出范围时,对象引用 parentForm 将消失。

Sub ShowChildForm()
    Dim childForm As frmDatastation2
    Set childForm = New frmDatastation2
    childForm.Show vbModal
End Sub

为了让你的两个对象“交流”,你需要传递对象引用。例如,假设子窗体需要父窗体的引用,可以使用以下属性:
Private parentForm As frmDatastation1

Public Property Get Parent() As frmDatastation1
    Set Parent = parentForm
End Property

Public Property Set Parent(ByVal value As frmDatastation1)
    Set parentForm = value
End Property

然后,父表单可以这样做:

Sub ShowChildForm()

    Dim childForm As frmDatastation2
    Set childForm = New frmDatastation2
    Set childForm.Parent = Me
    childForm.Show vbModal

    textbox1.Text = childForm.textbox12.Text

End Sub

当子窗体需要访问其父窗体时,可以采用以下方法:

Sub DoSomething()
    Me.Caption = Parent.textbox1.Text
End Sub

如果您想要访问一个已关闭但尚未卸载/丢弃的表单的属性,不要“关闭”它 - 只需将其隐藏即可(您需要在“QueryClose”中实现该行为,以防止用户在表单上点击“X”时丢弃对象)。

感谢您的快速回复。这个选项有点复杂,而我的VBA知识并不是很好...我需要一些时间来考虑一下,很快会给您我的评论。感谢您的帮助! - sims
@Matt:我想我理解这个想法了。你执行你要做的事情,最后表格就“消失”了。我想测试一下,所以我在我的frmDatastation1中创建了一个新按钮,调用ShowChilForm(我复制了frmDatastation1中的ShowChildForm子程序)。然而,当我尝试时,我得到了一个错误'1004'(在这一行:Set childForm = New frmDatastation2)。我想有些地方我不理解... - sims
我可能缺少一些上下文 - frmDatastation2 是一个用户窗体吗? - Mathieu Guindon
是的,Matt,frmDatastation2是一个用户窗体。 - sims
马特:我的用户窗体可能有些不同(也有问题)。我创建了一个新的工作簿,其中包含UserForm1和UserFrom2,您的代码可以正常工作:当我单击cmdbutton时,它会创建一个新的用户窗体。但是,它没有隐藏(或卸载)以前的窗体,并且每次我来回切换时都会创建一个新的窗体(UserForm1上的按钮创建UserForm2,而UserForm2上的按钮创建UserFrom1)。 - sims
我不确定你想要实现什么。 - Mathieu Guindon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接