Vba 如何在不关闭其他所有内容的情况下卸载userform?

Vba 如何在不关闭其他所有内容的情况下卸载userform?,vba,excel,Vba,Excel,我有两个用户表单(frmDatastation1和frmDatastation2)。当用户单击frmDatastation1上的cmd按钮时,第一个窗体变为隐藏(frmDatastation.hide),第二个窗体出现(frmDatastation.show)。那很好。当用户使用完frmDatastation2后,我想返回frmDatastation1并卸载frmDatastation2(删除所有内容,稍后从frmDatastation1再次使用)。但是当我卸载frmDatastation2时,

我有两个用户表单(
frmDatastation1
frmDatastation2
)。当用户单击
frmDatastation1
上的cmd按钮时,第一个窗体变为隐藏(
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)

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

Sub DoSomething()
    Dim parentForm As frmDatastation1
    Set parentForm = New frmDatastation1
    parentForm.Show vbModal
End Sub
无需真正卸载任何内容-当执行退出且对象超出范围时,对象引用
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 DoSomething()
    Me.Caption = Parent.textbox1.Text
End Sub
然后父窗体可以执行以下操作:

Sub ShowChildForm()

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

    textbox1.Text = childForm.textbox12.Text

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 DoSomething()
    Me.Caption = Parent.textbox1.Text
End Sub

如果您希望能够访问已关闭但尚未卸载/丢弃的表单的属性,请不要关闭它,而是将其隐藏(您需要在
QueryClose
中实现该行为,以防止在用户“X-out”访问表单时丢弃该对象).

继续使用
。隐藏
,而不是卸载用户表单。然后,如果在每次打开表单时都需要一个空白表单,请使用Userform event
Userform\u Activate()
清空字段,以便重复使用。每次显示表单(
userform.show
)时,它都会执行
Activate
事件。为什么要使用此
Unload frmDatastation1
?@EganWolf:我使用Unload frmDatastation1从中“重置”。不过我不确定这是不是个好主意。@tigeravatar:谢谢,我喜欢你的主意。但是,如果我这样做,我就不能“重置”我的组合框(在frmDatastation中)显示的内容(它的文本或值),因为它的样式设置为下拉列表(我不希望人们修改它的内容)。任何我可以重置combobox值的方法(用户看到的,例如:选择您喜欢的果汁…)
combobox.listindex=-1
谢谢您的快速回复。这个选项有点复杂,我的VBA知识不是很好。。。我会花一些时间来考虑,我会很快给你我的意见。谢谢你的帮助@马特:我想我理解这个想法。你执行你必须做的事情,最后形成“消失”。它想对此进行测试,所以我在frmDatastation1中创建了一个名为ShowChilForm的新按钮(我在frmDatastation1中复制了ShowChilForm子按钮)。然而,当我尝试它时,我得到了一个错误“1004”(在这一行:Set childForm=New frmDatastation2)。我想有些东西我不明白…我可能缺少一些上下文-是
frmDatastation2
一个用户表单吗?是的,马特,frmDatastation2是一个用户表单。马特:我的用户表单中可能有一些不同(和错误)的东西。我用UserForm1和UserFrom2创建了一个新工作簿,您的代码工作正常:当我单击cmdbutton时,它会创建一个新的userfom。但是,它不会隐藏(或卸载)以前的表单,每次我来回切换时,它都会创建一个新表单(UserForm1上的按钮创建UserForm2,UserForm2上的按钮创建UserFrom1)。