我的目标是根据当前使用 excel 文件的用户名限制对不同工作表的访问。
我将至少有 14 个用户(1 个管理员和 13 个部门负责人),每个人都有不同的访问权限来处理多个存在的工作表。管理员将有权访问所有工作表,而部门负责人将有权访问仅与其部门相关的工作表和至少 2 或 3 个其他工作表。
目前,我可以授予对一个工作表的访问权限,但正如我之前所说,我希望他们访问多个工作表。
我尝试以多种方式使用数组,但到目前为止它们都没有奏效。
Select Case Application.UserName
Case "User 2"
Set GetAllowedSheet = Sheets(Array("Sheet2", "Sheet3", "Sheet4"))
Run Code Online (Sandbox Code Playgroud)
Dim ArrayOne as Variant
ArrayOne = Array("Sheet2", "Sheet3", "Sheet4")
Select Case Application.UserName
Case "User 2"
Set GetAllowedSheet = Sheets(ArrayOne)
Run Code Online (Sandbox Code Playgroud)
我在谷歌上做了一些研究,但似乎没有什么与我正在寻找的相符。
Private Sub Workbook_Open()
Showorksheets
End Sub
Run Code Online (Sandbox Code Playgroud)
Sub Showorksheets()
Dim ws As Worksheet
Dim wsAllowed As Worksheet
If Application.UserName = "User 0" Then
For Each ws In Worksheets
ws.Visible = xlSheetVisible
Next
Exit Sub
End If
Set wsAllowed = GetAllowedSheet
wsAllowed.Visible = xlSheetVisible
For Each ws In Worksheets
If ws.Name <> wsAllowed.Name Then
ws.Visible = xlSheetHidden
End If
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
Function GetAllowedSheet() As Worksheet
Select Case Application.UserName
Case "User 1"
Set GetAllowedSheet = Sheets("Sheet1")
Case "User 2"
Set GetAllowedSheet = Sheets("Sheet2")
Case "User 3"
Set GetAllowedSheet = Sheets("Sheet3")
'...
Case Else
'...
End Select
End Function
Run Code Online (Sandbox Code Playgroud)
正如@BigBen 所建议的,隐藏/取消隐藏不是最好的方法,因为它很容易被绕过。
另外,我不知道该工作簿中是否有任何其他宏会影响工作表,但是在编码时处理隐藏的工作表可能会让人头疼。
但无论如何,这样的事情可能会有所帮助。
Private Sub Workbook_Open()
'A workbook must have always at least 1 visible worksheet
Application.ScreenUpdating = False
Dim DictWK As Object
Dim UserLevel As Byte
Dim wk As Worksheet
Set DictWK = CreateObject("Scripting.Dictionary")
With ThisWorkbook
DictWK.Add .Worksheets("ONLY ADMIN").Name, 0 '0 because only admin can have it
DictWK.Add .Worksheets("ADMIN AND HEADERS").Name, 1
DictWK.Add .Worksheets("ASSISTANTS").Name, 2
DictWK.Add .Worksheets("EVERYBODY").Name, 99 'A workbook must have at least 1 visible worksheet, so make sure there is 1 always visible to everybody
End With
UserLevel = LVL_ACCESS("User 1") 'change this to however you detect the username
For Each wk In ThisWorkbook.Worksheets
If UserLevel <= DictWK(wk.Name) Then
wk.Visible = xlSheetVisible
Else
wk.Visible = xlSheetHidden
End If
Next wk
DictWK.RemoveAll
Set DictWK = Nothing
Application.ScreenUpdating = True
End Sub
Run Code Online (Sandbox Code Playgroud)
用户级别:
Function LVL_ACCESS(ByVal vUsername As String) As Byte
Select Case vUsername
Case "User 1"
LVL_ACCESS = 0
Case "User 2"
LVL_ACCESS = 1
Case "User 3"
LVL_ACCESS = 2
Case Else
'not recognized, no access
LVL_ACCESS = 99
End Select
End Function
Run Code Online (Sandbox Code Playgroud)
已将示例上传到 Gdrive:https://drive.google.com/open? id=1mI3LQd8QxLDlMl1bzz5hCFIwdOFCS2Nc