Ограничение просмотра и редактирования доступа к одному листу в Excel - PullRequest
0 голосов
/ 08 октября 2019

Таким образом, название в основном обобщает это. Мой случай таков: у меня есть документ Excel, к которому обычно обращаются многие люди. Данные в нем на самом деле не являются частными или что-то, кроме людей, которые путаются, потому что разные люди должны просматривать разные листы в рабочей книге. Я хочу, чтобы на каждом листе был свой пароль, поэтому, когда вы вводите этот пароль, он перенаправляет вас на конкретный лист. Затем я бы выдал разные пароли соответствующим лицам или что-то в этом роде. Я довольно новичок в Visual Basic, поэтому понятия не имею, что я делаю ...

Я не могу сохранить эти листы как отдельные документы, потому что они используют друг друга для расчетов. Был бы очень рад, если бы кто-то мог помочь мне здесь:)

Редактировать

    Private Sub Workbook_Open()

Pwevaluation

End Sub

Public Function Pwevaluation()
Dim sh As Worksheet
Dim pw As String

pw = InputBox("Please enter your name", "Access Required", "")
Select Case pw
    Case Is = "hoesl"
        For Each sh In Worksheets
            If sh.Name = "Hinweis" Then
                sh.Visible = xlSheetVisible
            Else
            If sh.Name = "Blatt 1" Then
                sh.Visible = xlSheetVisible
            Else
                sh.Visible = xlSheetHidden
            End If

            End If
        Next sh
    Case Is = ""
    Case Else
        For Each sh In Worksheets
            If sh.Name = "Deckblatt" Then
                sh.Visible = xlSheetVisible
            Else
                sh.Visible = xlSheetHidden
            End If
        Next sh
        pw = InputBox("Wrong name, please try again", "Access Required", "")
        Pwevaluation
End Select
End Function

Прямо сейчас, насколько я далеко, я понял большинство из того, чтоЯ должен сделать, чтобы это работало, но я сталкиваюсь со странной проблемой: когда листы, которые я пытаюсь вызвать, уже спрятаны, я получаю ошибку времени выполнения "1004". Если они не спрятаны, все работает. Есть идеи, почему это так?

1 Ответ

1 голос
/ 08 октября 2019

Поскольку мне хотелось экспериментировать, это должно помочь вам в этом:

Private Sub Workbook_Open()
Dim sh As Worksheet
Sheets(Sheets.Count).Visible = xlSheetVisible
Select Case Environ("Username")
    Case Is = "Plutian"
        For Each sh In Worksheets
            If sh.Name = "Naughty Stuff" Then
                sh.Visible = xlSheetVisible
            Else
                sh.Visible = xlSheetHidden
            End If
        Next sh
    Case Else
        MsgBox "Insufficient access, see Hoesl for more info"
End Select
End Sub

Обратите внимание, что в этом случае важна строка Sheets(Sheets.Count).Visible = xlSheetVisible. Если скрытый лист находится после видимого в данный момент листа, может случиться так, что этот подпункт пытается скрыть последний видимый лист (чтобы позже показать другой лист). Это невозможно и выдает ошибку, поэтому в любом случае эта строка будет отображать последний лист, поэтому он всегда будет активным и будет скрыт последним после выполнения всех других действий. Это предотвращает одновременное скрытие всех листов.

РЕДАКТИРОВАТЬ Я предложил другой способ ниже, добавив список пользователей и ограничения доступа на скрытом листе. Поскольку мне было интересно, чтобы это работало, я также изучил этот метод:

Private Sub workbk_Open()
Dim user As Integer, sh As Worksheet

Sheets(Sheets.Count).Visible = xlSheetVisible 'unhide last sheet to prevent all sheets being hidden at once

user = Application.IfError(Application.Match(Environ("username"), ThisWorkbook.Sheets("Sheet3").Range("A2:A5"), 0), "0") 'check if user is present in access list

If user > 0 Then
    For Each sh In Worksheets 'loop through sheets
        If Application.IfError(Application.Match(sh.Name, ThisWorkbook.Sheets("Sheet3").Range(Cells(user + 1, 2), Cells(user + 1, 4)), 0), "0") > 0 Then 'check if sheet is in access list for user
            sh.Visible = xlSheetVisible 'if true, set sheet to visible
            Else
            sh.Visible = xlSheetHidden 'if false, hide sheet
        End If
    Next sh
    Else
    Workbook.Protect 'If user not found, protect workbook to prevent altering
    MsgBox "user not found, see admin for access" 'display error message
End If
End Sub

Список доступа будет выглядеть так, где значения представляют имена листов. В моем коде это будет находиться в sheet3, и будет работать только со строки 2 до 5 для пользователей и от столбца B до D для листов, но это может быть расширено почти бесконечно.

A             B             C
Username:     Access:
Plutian       Data sheet    Maintenance sheet
Hoesl         Sheet2        Maintenance sheet
Randomguy     Randomsheet   Sheet3
etc...

Я надеюсь, что комментарии объясняютдостаточно, если нет, дайте мне знать.

РЕДАКТИРОВАТЬ, РЕДАКТИРОВАТЬ Чтобы обновить любой из этих ответов с помощью окна приглашения с паролем (или просто введя имя пользователя или уникальное имя). клавиша) вы можете использовать поле ввода следующим образом:

Dim pw as string
pw = InputBox("Please enter your name", "Access Required", "")

И иметь код для поиска пароля / ввода в поле ввода в любом случае:

Select Case pw

или

user = Application.IfError(Application.Match(pw, ThisWorkbook.Sheets("Sheet3").Range("A2:A5"), 0), "0")

Просто убедитесь, что вы сохраняете лист, где вы храните свои пароли, скрытыми при переходе ко второму маршруту. И подумайте, как вы хотите обрабатывать неправильные пароли.

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