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
我的 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