繁体   English   中英

限制对单个工作表的查看和编辑访问

[英]Restricting viewing and editing access to a single worksheet

我有许多人可以访问的 Excel 文档。

数据不是私有的,但人们会感到困惑,因为不同的人需要查看工作簿中的不同工作表。

我希望每张工作表都有不同的密码,因此当您输入该密码时,它会将您重定向到特定的工作表。

我会向相应的人或类似的人提供不同的密码。

我无法将这些工作表保存为单个文档,因为它们相互用于计算。

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”

如果它们不被隐藏,那么一切正常。

由于我想尝试一下,这应该可以帮助您顺利进行:

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")

只需确保在进行第二条路线时始终隐藏存储密码的工作表。 想想你想如何处理错误的密码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM