一、同标题,比如mdi窗体下有mdi子窗体mdi1,mdi2,mdi3
   现在如果mdi1打开的话,那么就不能让mdi2,mdi3打开,如何做呢?二、如果要关闭所有的mdi子窗体,除了下面写得方法,还有别的吗?
Public Sub UnloadAllForms(Optional sFormName As String = "") 
    Dim Form As Form
    For Each Form In Forms
    If Form.Name <> sFormName Then
    Unload Form
    Set Form = Nothing
End If
Next Form
End Sub

解决方案 »

  1.   


    Option Explicit
    Private Sub mnuTAdd_Click()
            Dim newfrm As New Form1
            
            Call Only_One_Child(newfrm)
            
            Set newfrm = Nothing
    End Sub
    '调用方法,定义一个要显示的窗体传过去,Dim newfrm As New Form1
    Private Sub Only_One_Child(ByVal byfrm As Form)
            Dim newfrm As Form
            Dim i As Long
            
            For Each newfrm In Forms
                i = i + 1
            Next
            
            If i <= 1 Then
                Set newfrm = byfrm
                newfrm.Show
            End If
            Set newfrm = Nothing
    End Sub
    '关闭子窗体后提示是否退出
    Private Sub MDIForm_Unload(Cancel As Integer)
            Dim frm As Form
            Dim i As Long        If MsgBox("确定要退出系统吗?", vbYesNo, App.Title) = vbYes Then
                For Each frm In Forms
                    If Not frm Is Nothing Then
                        Unload frm
                    End If
                Next
            End If        Set frm = Nothing
    End Sub
    '关闭子窗体前询问是否退出
    Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
            Dim frm As Form
            Dim i As Long        If MsgBox("确定要退出系统吗?", vbYesNo, App.Title) = vbYes Then
                For Each frm In Forms
                    i = i + 1
                    Debug.Print i
                    If Not frm Is Nothing Then
                        Unload frm
                    End If
                Next
            End If        Set frm = Nothing
    End Sub
      

  2.   

    用 MDI 主窗体的 ActiveForm 判断可以解决你的两个问题。
    假定都是通过 MDI 主窗体的菜单来进行操作的。
    'MDI 主窗体
    Option ExplicitPrivate Sub mnuCloseAll_Click()
        While Not Me.ActiveForm Is Nothing
            Unload Me.ActiveForm
        Wend
    End SubPrivate Sub mnuMDI1_Click()
        If Me.ActiveForm Is Nothing Then
            mdi1.Show
        End If
    End SubPrivate Sub mnuMDI2_Click()
        If Me.ActiveForm Is Nothing Then
            mdi2.Show
        End If
    End SubPrivate Sub mnuMDI3_Click()
        If Me.ActiveForm Is Nothing Then
            mdi3.Show
        End If
    End Sub