Имя пользователя VBA Excel предоставляет доступ к дополнительному вопросу? - PullRequest
0 голосов
/ 16 апреля 2020

Я искал код для предоставления доступа по имени пользователя и нашел вопрос, опубликованный пользователем 5836742, и ответ, полученный от PeterT. Использовал код, который не работал, и я удалил тестовый макрос, и он сработал. Я скопировал код, который использовал ниже. Вопрос, который у меня есть, с этим методом он покажет только назначенный лист. Но пользователь может щелкнуть правой кнопкой мыши и показать другие листы. Что мы можем сделать для этого?

=== КОД ===

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 голосов
/ 16 апреля 2020

Если вы хотите, чтобы пользователь не мог отобразить их, вы должны использовать xlSheetVeryHidden вместо xlSheetHidden.

В качестве альтернативы вы можете защитить свою книгу, используя Workbook.Protect метод . Но учтите, что вам необходимо снимать защиту каждый раз перед изменением visibilty sh.Visible = xlSheetVisible.

. В обоих случаях обратите внимание, что всегда будет обходным путем, и скрытые листы всегда могут быть видны пользователь, если он знает, как использовать VBA. Скрытие листов не является надежной защитой ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...