按用户保护单个工作表(Microsoft Excel)
正如您在_ExcelTips的其他问题中了解到的那样,Excel允许您保护单个工作表。(您选择“工具” |“保护” |“保护表”。)您可以使用此方法使用不同的http:// username-password独立保护单个工作表。 .com / 14 / what-makes-a-good-password [密码]。
这意味着一个用户可以使用一个密码对一个工作表进行更改,而另一个用户可以使用不同的密码对另一工作表进行更改。
但是,如果您想完全限制对工作表的访问,该怎么办?
如果您甚至不希望未经授权的用户查看其他工作表怎么办?满足这个需求有些棘手,但是可以做到。基本方法如下:
。设置一个包含三个工作表的工作簿:一个将始终打开,一个用于用户1,第三个用于用户2。 。隐藏用户1和用户2的工作表。 。创建一个表单,该表单在每次打开工作簿时都会出现,要求输入用户名和密码。
。创建可解锁的宏代码,并根据用户名和密码显示正确的工作表。
。保护整个工作簿(“工具” |“保护” |“保护工作簿”)。
步骤1、2和5都很容易完成,并且在_ExcelTips_的其他问题中已经介绍了。但是,此方法的关键是步骤3和4。您可以按照以下步骤创建用户表单:
。按Alt + F11以显示VBA编辑器。
。在VBA编辑器中,从“插入”菜单中选择“用户表单”。将显示一个新的空白用户表单以及表单工具箱。
。使用表单工具箱中的控件,添加一个TextBox控件,用户将在其中输入其用户名。
。更改TextBox控件的属性,使其名称为txtUser。
。使用表单工具箱中的控件,添加一个TextBox控件,用户将在其中输入密码。
。更改TextBox控件的属性,使其名称为txtPass。
。在TextBox控件下,添加一个CommandButton控件。
。更改CommandButton控件的属性,使其名称为btnOK且其标题为OK。
创建用户表单后,您就可以将宏代码与刚放置的控件相关联了。确保选择了用户窗体,然后按F7键显示该窗体的“代码”窗口。该窗口可能包含一行或两行自动生成的代码。将其替换为以下代码:
上面的代码做了几件事。请注意,有两个过程:一个较长的过程在用户单击表单中的“确定”按钮时运行,另一个过程在终止表单时运行。当用户单击“确定”按钮时,该过程将检查以确保用户名和密码的组合正确无误。如果不是,则通知用户。如果是这样,那么授权的工作表名称将存储在文档变量中,并且相应的工作表将显示出来且不受保护。
Dim bOK2Use As Boolean Private Sub btnOK_Click() Dim bError As Boolean Dim sSName As String Dim p As DocumentProperty Dim bSetIt As Boolean bOK2Use = False bError = True If Len(txtUser.Text) > 0 And Len(txtPass.Text) > 0 Then bError = False Select Case txtUser.Text Case "user1" sSName = "u1sheet" If txtPass.Text <> "u1pass" Then bError = True Case "user2" sSName = "u2sheet" If txtPass.Text <> "u2pass" Then bError = True Case Else bError = True End Select End If If bError Then MsgBox "Invalid User Name or Password" Else 'Set document property bSetIt = False For Each p In ActiveWorkbook.CustomDocumentProperties If p.Name = "auth" Then p.Value = sSName bSetIt = True Exit For End If Next p If Not bSetIt Then ActiveWorkbook.CustomDocumentProperties.Add _ Name:="auth", LinkToContent:=False, _ Type:=msoPropertyTypeString, Value:=sSName End If Sheets(sSName).Visible = True Sheets(sSName).Unprotect (txtPass.Text) Sheets(sSName).Activate bOK2Use = True Unload UserForm1 End If End Sub Private Sub UserForm_Terminate() If Not bOK2Use Then ActiveWorkbook.Close (False) End If End Sub
如果要更改可接受的用户名,工作表名称和密码,可以通过在此宏代码顶部附近的“选择大小写”结构中进行所需的更改来进行。
如果用户试图在不输入用户名和密码的情况下简单地关闭您的表单,则此代码中的第二个宏(UserForm_Terminate)起作用。在这种情况下,如果授权过程先前未完成,则仅关闭工作簿。
除了上面的代码,您还需要向工作簿本身添加以下宏。这些在打开工作簿时打开用户窗体,并在关闭工作簿时保护工作表。
当用户选择关闭工作簿时(工作已完成),适用的工作表再次受到保护和隐藏。 (如果更改用户工作表名称和密码,则也需要在“选择案例”结构中进行更改。)然后,宏将删除相应的文档属性并保存工作簿。
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim w As Worksheet Dim bSaveIt As Boolean bSaveIt = False For Each w In Worksheets If w.Visible Then Select Case w.Name Case "u1sheet" w.Protect ("u1pass") w.Visible = False bSaveIt = True Case "u2sheet" w.Protect ("u2pass") w.Visible = False bSaveIt = True End Select End If Next w If bSaveIt Then ActiveWorkbook.CustomDocumentProperties("auth").Delete ActiveWorkbook.Save End If End Sub Private Sub Workbook_Open() UserForm1.Show End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object) If Sh.Name <> "Main" Then If Sh.Name <> ActiveWorkbook.CustomDocumentProperties("auth").Value Then Sh.Visible = False MsgBox "You don't have authorization to view that sheet!" End If End If End Sub
另一个有趣的宏是Workbook_SheetActivate过程。
如果一个用户尝试使用“格式|工作表取消隐藏即可取消隐藏其他用户的工作表。在这种情况下,将用户的授权图纸名称(最初授权用户时存储在文档变量中)与正在显示的图纸进行比较。如果不匹配,则不允许用户查看工作表。还要注意,此过程引用了一个名为“ Main”的工作表。该工作表是本文开头提到的第三个工作表。
该工作表也是打开工作簿时首先显示的工作表。
注意:
如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。
链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(1952)适用于Microsoft Excel 97、2000、2002和2003。