如何在case语句中引用多个工作表

byt*_* me 6 excel vba

目标和问题

我的目标是根据当前使用 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)

Fox*_*rns 2

正如@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