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 eventUserform\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)。