Excel - 将工作表的视图限制为certian用户

时间:2017-12-13 19:55:00

标签: excel excel-vba vba

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

我想要做的是拥有一个类似用户表单的机制,或者用户可以向几个可能用户之一进行身份验证的机制。

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

有没有人在Excel中做过这样的事情?

任何想法都表示赞赏 肖恩

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:2)

我真的很喜欢打字这个的任务。请记住,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在您的工作簿模块中。