Shay与一个志愿者组织合作,他们专门为他们的志愿者开发了一个Excel工作簿。他们不希望它被复制或与外部人员共享,因此Shay想知道是否存在一种保护工作簿的方法,以便该工作簿仅适用于特定计算机而不适用于其他计算机。

有多种方法可以增强工作簿的安全性,但是在确定最佳方法之前,需要考虑一些因素。

了解几乎所有方法都会给用户带来某种程度的不便。同样,您采用的方法可能取决于用户是仅在您的内部网络上还是他们是未连接到您的网络的志愿者。

一个简单的开始方法是简单地对工作簿进行密码保护,然后让您的志愿者知道密码。这样做有两个缺点,那就是您传递给志愿者的任何密码在他们不再是志愿者之后,对于那些可能将其传递给工作簿的人,都将继续起作用。即使您为每个志愿者都设置了一个单独的密码,也是如此。

任何其他方法都将依赖于在工作簿中添加宏。

宏检查宏的一种好方法是检查在其上打开工作簿的计算机的名称。这是此类宏的示例:

Private Sub Workbook_Open()

Dim sComputerName As String     Dim sPossible As String     Dim sTemp As String

sPossible = "[NEWDELL][Computer1][Order Entry][Dan's System]"

sPossible = sPossible & "[Computer2][Computer3]"



sComputerName = Environ("computername")

sTemp = "[" & sComputerName & "]"



If InStr(sPossible, sTemp) Then         MsgBox "Welcome to the workbook."

Else         MsgBox "You are not authorized to open this workbook."

Workbooks(ActiveWorkbook.Name).Close SaveChanges:=False     End If End Sub

宏背后的想法是,您将在sPossible字符串中定义允许打开工作簿的每台计算机的名称。您需要做的就是确保正确拼写了机器名称,并将它们括在sPossible字符串的方括号内。 Environ函数返回实际的计算机名称,将其放在方括号内的sTemp变量中,然后使用InStr函数查看它是否在可能的计算机列表中。

如果是,则显示一个消息框。如果不是,则会显示一个消息框,并关闭工作簿而不保存任何更改。

如果您更喜欢安全的东西,也可以使用Environ函数返回“ username

值,这将为您提供计算机上正在使用的帐户的用户名。

这种宏方法相对简单,但确实需要知道计算机名称(和/或用户名),然后才能正常工作。它还假定用户对Excel的了解不足,无法通过在程序启动时按住Shift键来绕过宏。如果您怀疑用户可能了解很多,则需要采取更多步骤,例如:

  • 确保在工作簿中可见一个工作表。所有其他工作表应“非常隐藏”,以使用户无法使用正常步骤显示它们。

  • 如果宏确定允许该用户,则隐藏单个可见的工作表,并使所有“非常隐藏”的工作表可见。

  • 当关闭工作簿时,请反向进行该过程并隐藏所有工作表(将每个工作表的Visible属性设置为xlSheetVeryHidden),并使单个工作表再次可见。

使用这种方法可以确保即使用户禁用了宏(通过在启动过程中按住Shift键),他或她也无法进入工作表,因为需要使用宏才能使其可见。

您可以在上述方法上利用一种变体,这样,您就不必依赖Environ功能,而是可以通过宏检查系统中特定位置是否存在预定文件。

当然,这意味着您需要一种方法来提前使用系统,以将适当的文件放置在适当的位置。

最后,无论选择哪种基于宏的方法,都应确保使用密码保护工作簿的VBA项目。这将阻止某人继续查看您的宏代码,以了解保护措施的状态。

尝试保护工作簿时,您还需要牢记其他事项:始终可以通过足够的知识和耐心来规避无论您采用什么保护措施。如果您的用户在技术上不那么熟练,那么您应该没有问题。但是,如果他们对Excel和宏有很多了解,那么所有赌注都没有了。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(13666)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。