VBA 表格没有显示第二次

VBA Form doesn't shows second time

我的 VBA 登录表单出现问题,该表单本应保护我的图书。 我已经创建了 LoginPage 和 2 个登录表单:一个学生和一个老师。它们在使用上相似,但不能正常工作。

如果我选择了 "Log as a Teacher" 按钮,但随后决定关闭这个 window 以供学生记录,QueryClose 方法应该可以工作。但这一次有效。 在 LoginPage 中,当我按下 CommandButton TeacherForm 时也只显示一次。因此,正如您已经了解的那样,我需要在这些形式之间轻松切换。

我的代码(登录页面)是:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
Cancel = True
ActiveWorkbook.Saved = True
Application.Quit
End If
End Sub

Private Sub TeacherLogin_Click()
Unload Me
Load TeacherForm
TeacherForm.Show
End Sub

教师表:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then
    Cancel = True
    Me.Hide
    Unload Me
    Load LoginPage
    LoginPage.Show
End If
End Sub
Private Sub PTTB_Change()
PTTB.PasswordChar = "*"
End Sub
Private Sub SubmitTeacher_Click()
If LTTB.Value = "User" Then
    If PTTB.Value = "SuperUser" Then
        MsgBox ("Access granted!")
    Else
        MsgBox ("Access denied!")
    End If
Else
    MsgBox ("Access denied!")
End If
End Sub

如果我做错了什么,请帮助我。谢谢

问题是您正在卸载表单的默认实例。您应该实例化用户窗体的新实例并隐藏它们而不是卸载它们。这篇文章解释得最好Rubberduck VBA: UserForm1.Show

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = True
        ActiveWorkbook.Saved = True
        Application.Quit
    End If
End Sub

Private Sub TeacherLogin_Click()
    Dim Form As TeacherForm
    Set Form = New TeacherForm
    Form.Show
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        Cancel = True
        Me.Hide
        Dim Form As LoginPage
        Set Form = New LoginPage
        Form.Show
    End If
End Sub

Private Sub PTTB_Change()
    PTTB.PasswordChar = "*"
End Sub

Private Sub SubmitTeacher_Click()
    If LTTB.Value = "User" Then
        If PTTB.Value = "SuperUser" Then
            MsgBox ("Access granted!")
        Else
            MsgBox ("Access denied!")
        End If
    Else
        MsgBox ("Access denied!")
    End If
End Sub

您应该考虑下载 Rubberduck VBA,它的免费代码格式化功能将为您节省大量时间。

@TinMan 是正确的——您绝对应该创建用户窗体的新实例并直接使用它们。

此外,我不建议显示 UserForm_QueryClose 事件的下一个表格。

使用多个用户窗体时,使用 "presenter" class 来保存实例并控制不同窗体的显示/隐藏会很有用。 这是一个简单的例子,与您的要求相似:


使用以下代码和一个名为 "ShowUF2" 的按钮创建一个简单的用户窗体 (UserForm1),该按钮将打开第二个用户窗体。这是您的主窗体。

Public Event ShowUF2ButtonClicked()

Private Sub ShowUF2_Click()
    RaiseEvent ShowUF2ButtonClicked
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    Me.Hide
End Sub

仅使用 QueryClose 代码创建另一个用户窗体 (UserForm2):

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    Me.Hide
End Sub

现在创建您的 Presenter Class (Presenter) 来保存实例并控制显示和隐藏

Private WithEvents UF1 As UserForm1
Private UF2 As UserForm2

Private Sub Class_Initialize()
    Set UF1 = New UserForm1
End Sub

Public Sub Present()
    UF1.Show vbModal
End Sub

Private Sub UF1_ShowUF2ButtonClicked()
    UF1.Hide
    Set UF2 = New UserForm2
    UF2.Show vbModal
    UF1.Show vbModal 'when UF2 is closed, show UF1 again
End Sub

然后,最后,您只需要创建一个演示者并点击 "Present" 子。这需要在标准模块中

Public Sub ShowUF1()
    With New Presenter
        .Present
    End With
End Sub