在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
答案 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
(即不指定 vbModal
或vbModeless
)。在解决方法中,我将此.Show
调用包含在各个模式UserForm的UserForm_Initialize
事件内。现在,当您关闭此模式形式时,它不会删除所有父级非模式形式。
这个问题对我来说很重要,因为我的模式用户窗体必须包含模式,因为它包含RefEdit控件,因此对我来说至关重要。经过一些进一步的调查和故障排除后,我无法确切得出导致莫代尔表格出现此问题的原因。我希望有一个在VBA中拥有更多知识的人来看看,但恐怕他们可能都已经转向绿色的牧场了。...