Поскольку мне хотелось экспериментировать, это должно помочь вам в этом:
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")
Просто убедитесь, что вы сохраняете лист, где вы храните свои пароли, скрытыми при переходе ко второму маршруту. И подумайте, как вы хотите обрабатывать неправильные пароли.