我正在建立一个使用VBA的系统,让学生在高中选择他们的课程。用户登录用户窗口“LoginForm”,用户可以登录。然而,由于他们的敏感信息存储在“学生信息”表中,其中包含他们的信息和“AMchoices”以供他们选择班级,我不希望学生能够看到这一点。
因此,我编写的代码从工作表“studentinformation”读取他们的用户ID和密码,如果正确则打开userform“AMForm”。我只希望管理员登录可以访问这些工作表,因此我希望从学生中隐藏所有工作表。我已将G列中的值设置为学生的“学生”或管理员的“admin”。我们的想法是,如果G列中的单元格值是“学生”,则两个电子表格将保持隐藏,但如果它是“admin”,则表单可见。
我输入了我当前的登录代码。谢谢您的帮助 :)
Option Explicit
Private Sub btnLogin_Click()
Dim RowNo As Long
Dim ID As String, PW As String
Dim WS As Worksheet
Dim aCell As Range
On Error GoTo ErrorHandler
If Len(Trim(txtUser)) = 0 Then
txtUser.SetFocus
MsgBox "Error. UserID cannot be empty."
Exit Sub
End If
If Len(Trim(txtPass)) = 0 Then
txtPass.SetFocus
MsgBox "Error. Password cannot be empty."
Exit Sub
End If
Application.ScreenUpdating = False
Set WS = Worksheets("StudentInformation")
ID = LCase(Me.txtUser)
Set aCell = WS.Columns(1).Find(What:=ID, LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
If Not aCell Is Nothing Then
RowNo = aCell.Row
If Me.txtPass = aCell.Offset(, 1) Then
MsgBox "Login Successful."
Unload Me
Else
MsgBox "Incorrect UserID or Password. Please try again.", vbOKOnly
End If
Else
MsgBox "Incorrect UserID or Password. Please try again.", vbOKOnly
End If
'Opening specific Userform
If aCell.Offset(, 4) = "SBUB10" Then AMForm.Show
If aCell.Offset(, 4) = "SBUB20" Then FMForm.Show
If aCell.Offset(, 4) = "SBUB30" Then HRMForm.Show
CleanExit:
Set WS = Nothing
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox Err.Description
Resume CleanExit
End Sub
首先是一个偏离主题的用户体验提示。在满足所有前提条件之前,请勿启用登录按钮。换句话说,你的代码中的其他地方
btnLogin.Enabled = Len(Trim(txtUser.Text)) > 0 And Len(Trim(txtPass.Text)) > 0
要解决您的问题,您需要设置WS.Hidden=xlVeryHidden
。与此同时,密码保护工作簿和密码保护VBA IDE。每个使用不同的密码。
您现在可以使用宏来请求正常管理的工作簿密码,但只能通过VBA取消隐藏敏感数据表。
另一方面是重新保护Workbook_Open
上的工作簿(当然使用密码)并设置标志UserInterfaceOnly:=True
。 Excel不会在关闭时保存此标志,因此每次打开工作簿时都必须重置它。此标志表示您的所有宏都可以在不必解锁工作表的情况下完成工作(在某些特殊情况下除外)。