Excel VBA以无模式启动用户表单,然后进入模态

问题描述 投票:0回答:1

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
excel modal-dialog userform mix modeless
1个回答
0
投票

好吧,我终于设法解决了这一问题。

剩下的问题是,在同一用户窗体上连续单击两次,除了“模式”窗体外,还会成功并允许用户中断。

我什至尝试了在另一个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形式,并且可以按照我想要的方式工作;-)

© www.soinside.com 2019 - 2024. All rights reserved.