如何在不关闭其他所有内容的情况下卸载用户表单?

时间:2016-02-01 19:46:08

标签: excel vba excel-vba

我有两个用户表单(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)

1 个答案:

答案 0 :(得分:2)

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

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

没有必要真正Unload任何东西 - 当执行退出parentForm并且对象超出范围时,对象引用DoSomething将会死亡。

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-out”表单时丢弃该对象。