正如您在_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。