【问题标题】:Excel - Limit view of worksheets to certian usersExcel - 将工作表的视图限制为某些用户
【发布时间】:2017-12-13 19:54:59
【问题描述】:

我有一个包含多个工作表的 Excel 工作簿。

我想要做的是有一种机制,比如用户表单或用户可以向几个可能的用户之一进行身份验证的东西。

根据提供的用户名,我想显示某些工作表并隐藏其他工作表,并阻止用户访问他们不应查看的工作表。

有人在 Excel 中做过类似的事情吗?

感谢任何想法 肖恩

【问题讨论】:

  • ".. 用户将在哪里进行身份验证..." - 身份验证,如何?活动目录?针对某处的硬编码列表?
  • 1.加载工作簿时按住 Shift 可禁用宏。 2. Excel设置中可以禁用宏。
  • 是的,抱歉,身份验证意味着仅针对一组 4 或 5 个硬编码用户
  • 这需要有多安全?您是在保护社会安全号码,还是只是为了方便? Excel 并不以强大的安全性着称,但它有一些很好的工具可以防止善意的人不小心搞砸了。
  • 解决方案只需要方便,它不会保护像 SSN 或类似的东西这样安全的东西,并且将保留在我们部门内部。

标签: excel vba


【解决方案1】:

我真的很享受打字这个任务。请记住,VBE 在此代码中不受保护,因此您可能需要添加一些保护,但这应该可以满足您的需要。

您还应该创建一个通用的Login 工作表。这将是在输入密码之前打开的唯一工作表。这是必不可少的,因为您无法在不引发错误的情况下隐藏每张工作表。 (您需要有 1 张可见的工作表)。

警告:此代码经过轻度测试。您应对使用以下代码造成的任何数据丢失负责,例如(但不限于)忘记密码。你被警告了!!!!

1。打开工作簿,然后调用 GetLogin

Option Explicit

Private Sub Workbook_Open()

    GetLogin 1

End Sub

2。登录代码

Private Sub GetLogin(ByVal AttemptNumber As Integer)

    Dim Sheet As Worksheet

    With ThisWorkbook.Worksheets("Login")
        .Visible = xlSheetVisible
        .Activate
    End With

    For Each Sheet In ThisWorkbook.Sheets
        If Not Sheet.Name = "Login" Then
            Sheet.Visible = xlSheetVeryHidden
        End If
    Next Sheet

    Dim Password As String
    Password = Application.InputBox("Please enter your password")

    Select Case Password
        Case "Ma$terPas$"
            For Each Sheet In ThisWorkbook.Sheets
                Sheet.Visible = xlSheetVisible
            Next Sheet
            ThisWorkbook.Worksheets(1).Activate 'For when you hide login sheet
        Case "Oth3Rpa$$"
            With ThisWorkbook
                .Worksheets(1).Visible = xlSheetVisible
            End With
            ThisWorkbook.Worksheets(1).Activate 'For when you hide login sheet
        Case Else
            If AttemptNumber <= 3 Then
                If MsgBox("You entered an incorrect password", vbRetryCancel, "Attempt # " & AttemptNumber) = vbRetry Then
                    AttemptNumber = AttemptNumber + 1
                    GetLogin AttemptNumber
                Else
                    ThisWorkbook.Saved = True
                    ThisWorkbook.Close
                End If
            Else
                ThisWorkbook.Saved = True
                ThisWorkbook.Close
            End If
    End Select

    ThisWorkbook.Worksheets("Login").Visible = xlSheetHidden

End Sub

3。关闭工作簿

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    If ThisWorkbook.Saved = False Then
        If MsgBox("Would you like to save?", vbYesNo) = vbYes Then
            ThisWorkbook.Save
        End If
    End If

    Dim Sheet As Worksheet
    With ThisWorkbook.Worksheets("Login")
        .Visible = xlSheetVisible
        .Activate
    End With

    For Each Sheet In ThisWorkbook.Sheets
        If Not Sheet.Name = "Login" Then
            Sheet.Visible = xlSheetVeryHidden
        End If
    Next Sheet

    'Prevent from being asked to save the fact you just hid the sheets
    ThisWorkbook.Saved = True

End Sub

确保Workbook_OpenWorkbook_Close 在您的工作簿模块中。

【讨论】:

  • 感谢@K.Davis 正是我所需要的。非常感谢并很高兴在周三晚上给你一些愉快的事情:-)
【解决方案2】:

您可能可以通过使用 Auto_Open 事件来实现此目的

Function Auto_Open()
    Select Case True
    Case InStr(Application.UserName, "Dan Smith") > 0
        ActiveWorkbook.Sheets(1).Visible = xlSheetVeryHidden
    Case InStr(Application.UserName, "Jon Doe") > 0
        ActiveWorkbook.Sheets(1).Visible = True
    End Select
End Function

当然,考虑到你必须找出每个人的用户名,然后你想对他们隐藏的工作表,这需要很多工作,但这就是我的想法

【讨论】:

  • 谢谢,我采用了另一种解决方案,但感谢您花费的时间。
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
  • 2012-10-21
  • 1970-01-01
相关资源
最近更新 更多