[英]VBA Excel Username grants access followup question?
我正在搜索通过用户名授予访问权限的代码,并找到了 user5836742 发布的问题和 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
如果您想阻止用户取消隐藏它们,您必须使用xlSheetVeryHidden
而不是xlSheetHidden
。
或者,您可以使用Workbook.Protect 方法保护您的工作簿。 但请注意,每次更改可见sh.Visible = xlSheetVisible
之前,您都需要取消保护它。
请注意,在这两种情况下,如果用户知道如何使用 VBA,则总会有一种解决方法,并且用户始终可以看到隐藏的工作表。 隐藏工作表不是对您的数据的安全保护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.