我正在搜索通过用户名授予访问权限的代码,发现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
答案 0 :(得分:0)
如果要防止用户能够取消隐藏他们,则必须使用xlSheetVeryHidden
而不是xlSheetHidden
。
或者,您可以使用Workbook.Protect method保护工作簿。但是请注意,那么更改可见性sh.Visible = xlSheetVisible
之前,您需要每次都对其进行保护。
在这两种情况下,都会总是变通办法,如果用户知道如何使用VBA,则始终可以使隐藏的工作表可见。隐藏工作表并不是对您数据的安全保护。