防止Modal表单在退出时关闭所有无模式打开表单

时间:2016-05-23 22:11:20

标签: forms vba excel-vba excel

在Excel中使用VBA表单时遇到了一些奇怪的行为。我有一个调用无模式表单的模块,它用作调用其他表单的中心。其他形式作为Modal调用。问题是,只要隐藏或卸载子窗体,父模式窗口也会关闭。

我试图找到答案,但即使这些问题存在问题,但没有一个问题提供了有效的答案。

经过一些测试,我确定任何数量的开放式无模式表格都会以同样的方式关闭。此外,我无法使用新工作簿中的最小模型重现该问题。之后,我继续逐步添加原始工作簿的所有组件(有几个模块,10-20个类和几个表单)以查看问题何时出现。

当我发现问题没有重新出现时,即使我完全输入了所有东西,我也同时松了一口气。我的结论是,这是一种不再让我烦恼的侥幸。但是,不久之后,当我添加另一个这样的子表单时,使用相同的调用代码,同样的新表单再次发生,但不是旧表单。

然后我继续导出行为不端的表单,将其从工作簿中删除,然后导入它。瞧,它又恢复了。

之前是否有人遇到此类行为?难道我做错了什么?或者我应该将此视为烦人但可以绕过的错误?

请在下面找到问题的最低模型,不包括所有内容:

模块调用主窗体:

Sub testA()

 Dim main1 As MainForm1

 Set main1 = New MainForm1

 main1.Show (vbModeless)

End Sub

主要形式:

Option Explicit

Dim formobject As frmPickInjection

Private Sub CommandButton1_Click()

 Set formobject = New frmPickInjection


 With formobject
     .Show (vbModal)
     Label1.Caption = CStr(.SelectedInjection)
 End With

End Sub

儿童表格:

Option Explicit

Public passvar As Boolean

Private Sub CheckBox1_Click()
 passvar = CheckBox1.Value
End Sub

系统:Microsoft Windows 7 Enterprise 6.1.7601(Service Pack 1 Build 7601)

Excel版:Office365 Excel 2016(16.0.6729.1014),64位

VBA版本:7.1

2 个答案:

答案 0 :(得分:0)

之前我遇到过这个问题。 不确定这是否已经解决,但是对于希望解决此问题的未来用户:

我找到修复这个烦人且间歇性问题的唯一方法是显示用户窗体,然后隐藏并以无模式方式重新显示用户窗体。

Unload MyChildUserform
MyParentUserform.Show vbModal
MyParentUserform.Hide
MyParentUserform.Show vbModeless

它很笨拙而烦人,但它似乎起作用并且至少是一致的。

修改

恕我直言更好的解决方案是自己控制表格的形式。

声明:

Public Declare Function EnableWindow lib "user32.dll" (ByVal hWnd as Long, ByVal fEnable as Long) as Long
Public Declare Function FindWindow lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName as String, ByVal lpWindowName as String) as Long

Public Enum MakeAsModal
    Modal = 0
    Modeless = 1
End Enum

Public ghWndParent as Long

Public Sub(s):

Public Sub ChangeModality(ByRef hWnd as Long, ByVal isModal as MakeAsModal)
    On Error Resume Next
    Dim RetVal as Long
    RetVal = EnableWindow(hWnd,isModal)
End Sub

父母表格:

Private Sub Userform_Initialize()
'Parent Form
    ghWndParent = FindWindow(vbNullString, Me.Caption)
End Sub

Private Sub CallChild()
'Parent Form
    ChildUserform.Show vbModeless
    ChangeModality ghWndParent, Modal
End Sub

儿童表格:

Private Sub Userform_QueryClose(Cancel As Integer, CloseMode as Integer)
'Child Form
    ChangeModality ghWndParent, Modeless
End Sub

答案 1 :(得分:0)

今天我为这个问题所困扰,我发现有一个工作可以在模态表单的关闭事件停止非模态表单的关闭。

只需将UserForm属性“ ShowModal”设置为True

UserForm ShowModal Property to True

然后;显示表单时,只需使用UserForm.Show(即不指定 vbModalvbModeless)。在解决方法中,我将此.Show调用包含在各个模式UserForm的UserForm_Initialize事件内。现在,当您关闭此模式形式时,它不会删除所有父级非模式形式。

这个问题对我来说很重要,因为我的模式用户窗体必须包含模式,因为它包含RefEdit控件,因此对我来说至关重要。经过一些进一步的调查和故障排除后,我无法确切得出导致莫代尔表格出现此问题的原因。我希望有一个在VBA中拥有更多知识的人来看看,但恐怕他们可能都已经转向绿色的牧场了。...