Excel允许以无模式形式开始,然后显示模态(但反之则不行)
我有一个具有4个用户窗体的应用程序:UF1-选择合作伙伴,UF2-列出现有交易,UF21-显示现有交易,UF22-进行新交易。 UF21和UF22都来自UF2。
UF21必须为无模式才能显示多个交易并排比较,因此UF1,UF2和UF21均为无模式。但是我希望UF22成为Modal,以便一次发出一个新交易。
我的问题是,我关闭UF22之后,甚至是关闭表格中的ESCaping,所有以前的表格都将关闭。我应该能够回到UF2。如果我将UF22设为无模式,则一切正常。
我已经编写了一个遍历UserForms集合的函数,并且能够获得对要激活的Form对象的引用。因此,我能够返回(以调试方式)到列表框UF2,激活该列表框,但是在最后一个挂起的语句之后,UF2和UF1都关闭了。
由于模态和非模态形式的性质,我试图做的事情是不可能的,还是我应该继续争取正确的代码?
由于我最初的问题仍然悬而未决,并且@PeterT对所提出的解决方案进行的测试实现无法正常工作,因此我将根据@PeterT的建议,加入目前的代码。
'===============
' Form UF1
'===============
Private Sub UserForm_Activate()
If ActivateUF22(FormID) = True Then Exit Sub
'.... more commands
End Sub
'============
' Form UF2
'============
Private Sub UserForm_Activate()
If ActivateUF22(FormID) = True Then Exit Sub
'.... more commands
End Sub
'----------------
Private Sub Cbn_OpenUF22_Click()
If ActivateUF22() = True Then
Exit Sub
Else
With New UF22
.Show vbModeless
End With
End If
End Sub
'================
' In a Module...
'================
Public Function ActivateUF22() As Boolean
Dim frm As Object
Set frm = GetFormFromID("UF22*") ' Custom function to get a form Object based on
' some criterion (FormID in a hidden TextBox)
If Not frm Is Nothing Then
' the only way I know to *Activate* an already .Show(n) form and compensate
' for the fact that the Close CommandButton may already have Focus
frm.TBx_UF22_CODE.SetFocus
frm.CBn_UF22_CLOSE.SetFocus
ActivateUF22 = True
Else
ActivateUF22 = False
End If
End Function
好吧,我终于设法解决了这一问题。
剩下的问题是,在同一用户窗体上连续单击两次,除了“模式”窗体外,还会成功并允许用户中断。
我什至尝试了在另一个SO线程中找到的“ AppActivate Application.caption”方法,但是也没有用。
唯一有效且不会困扰我的解决方案是,插入一个MsgBox并向用户发出警告,例如:
Public Function ActivateUF22() As Boolean
Dim frm As Object
Set frm = GetFormFromID("UF22*") ' Custom function to get a form Object based on
' some criterion (FormID in a hidden TextBox)
If Not frm Is Nothing Then
' the only way I know to *Activate* an already .Show(n) form and compensate
' for the fact that the Close CommandButton may already have Focus
frm.TBx_UF22_CODE.SetFocus
frm.CBn_UF22_CLOSE.SetFocus
ActivateUF22 = True
MsgBox("You cannot move away from this form until it is either completed or cancelled")
Else
ActivateUF22 = False
End If
End Function
[显示MsgBox会在内部完成操作,将焦点切换到与单击不同的窗体,然后返回时,将正常触发UserForm.Activate事件,并且ActivateUF22函数可防止用户转义伪模态窗体。
感谢@PeterT向我指出一种解决方法。我设法完成了我打算要做的事情,尽管采用了不同的方式。
PS,我仍然相信,有一种方法可以从无模式形式转换为模态形式。毕竟,我使用的MsgBox显然是一种Modal形式,并且可以按照我想要的方式工作;-)