VBA Excel用户名是否授予访问后续问题?

时间:2020-04-16 09:31:21

标签: excel vba

我正在搜索通过用户名授予访问权限的代码,发现user5836742发布的问题和PeterT给出的答案。使用了无效的代码,我删除了测试宏并且有效。我已经复制了下面使用的代码。我有这种方法的问题,它将只显示分配的工作表。但是用户可以右键单击并取消隐藏其他工作表。我们该怎么办?

=== CODE ===

Public Sub ViewAuthorizedSheets(uname As String)
    Dim authSheets As String
    Dim sh As Worksheet
    uname = Environ("UserName")
    authSheets = GetAuthorizedSheets(uname)
    For Each sh In ThisWorkbook.Sheets
        If sh.Name <> "AuthUsers" Then
            If InStr(1, authSheets, sh.Name, vbTextCompare) > 0 Then
                sh.Visible = xlSheetVisible
            Else
                sh.Visible = xlSheetHidden
            End If
        End If
    Next sh
End Sub

Function IsUserAuthorized(uname As String) As Boolean
    Dim ws As Worksheet
    Dim userTbl As ListObject
    Dim userList As Range
    Dim allowedUser As Variant
    Dim allowed As Boolean

    Set ws = ThisWorkbook.Sheets("AuthUsers")
    Set userTbl = ws.ListObjects("UserTable")
    Set userList = userTbl.ListColumns("Users").DataBodyRange
    allowed = False
    For Each allowedUser In userList
        If LCase(allowedUser) = LCase(uname) Then
            allowed = True
            Exit For
        End If
    Next allowedUser
    Set userList = Nothing
    Set userTbl = Nothing
    Set ws = Nothing
    IsUserAuthorized = allowed
End Function

Function GetAuthorizedSheets(uname As String) As String
    Dim ws As Worksheet
    Dim userTbl As ListObject
    Dim userList As Range
    Dim allowedUser As Variant
    Dim allowed As String

    Set ws = ThisWorkbook.Sheets("AuthUsers")
    Set userTbl = ws.ListObjects("UserTable")
    Set userList = userTbl.DataBodyRange
    allowed = False
    For Each allowedUser In userList.Columns(1).Cells
        If LCase(allowedUser) = LCase(uname) Then
            allowed = allowedUser.Offset(0, 1).value
            Exit For
        End If
    Next allowedUser
    Set userList = Nothing
    Set userTbl = Nothing
    Set ws = Nothing
    GetAuthorizedSheets = allowed
End Function

1 个答案:

答案 0 :(得分:0)

如果要防止用户能够取消隐藏他们,则必须使用xlSheetVeryHidden而不是xlSheetHidden

或者,您可以使用Workbook.Protect method保护工作簿。但是请注意,那么更改可见性sh.Visible = xlSheetVisible之前,您需要每次都对其进行保护。

在这两种情况下,都会总是变通办法,如果用户知道如何使用VBA,则始终可以使隐藏的工作表可见。隐藏工作表并不是对您数据的安全保护。