我有一个带密码保护(防止未经授权访问宏)的VBA宏,它可以按预期运行。用户单击按钮,宏将运行。内容或多或少如下:
Sub sample()
ActiveSheet.Unprotect Password:="xyz"
...VBA code....etc
ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=True, cenarios:=True
End Sub现在我已经添加了一个函数,因此代码如下所示:
Function
......etc
End Function
Sub sample()
ActiveSheet.Unprotect Password:="xyz"
...VBA code....etc
code referencing the function
ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=True, Scenarios:=True
End sub如果打开工作簿并打开VBA窗口并输入VBA密码,则宏每次都可以正常运行。工作表密码访问工作正常。
但是,如果我以无权访问VBA代码的用户身份重新打开工作簿,则在输入VBA密码之前,宏不会运行。我猜原因是函数在子例程的“外部”,但是放在子例程内不允许宏运行。我不希望用户访问VBA代码,他们只需要运行宏即可。
期待一个简单的答案!
发布于 2014-07-18 17:16:48
我没有很好地理解这一点,但有两点:
1./如果您想要使用密码保护所有代码(如果还没有这样做):
在vba编辑器中:
工具> VBAProject属性>保护
2./然后,当您使用以下命令时,sample()会为用户(没有密码)和代码锁定工作表:
ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=True, Scenarios:=True如果你想让你的代码不受限制地访问工作表,但你又想让工作表受到密码的保护(防止用户访问),你可以使用:
UserInterFaceOnly:=True就像这样:
ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, _
Contents:=True, Scenarios:=True, UserInterFaceOnly:=True因此,您的代码可以访问所有内容,但用户仍需要密码才能编辑工作表。
我不知道这是不是你需要的,我希望如此。如果不是,你可以考虑稍微修改一下你的问题
发布于 2014-07-19 07:40:52
不确定你想通过保护/取消保护你的代码来达到什么目的。就我个人而言,我认为你看错了。
在我的公司,我们有一套广泛的VBA插件(.xla和.xlam),它们是受密码保护的(为了安全和防止篡改,甚至还进行了数字签名)。它们中的许多都相互引用,试图将它们构建为“剪贴板插件”、“通用工具插件”等,以保持其大小和功能的分离。在本例中,通用utils外接程序保持对剪贴板外接程序的引用,以便从剪贴板外接程序调用"Public“函数(您不能跨模块或从工作簿调用Private例程)。
只有我们知道插件的密码,但是客户端可以毫无问题地调用"Public“函数和subs,就像我们在插件之间调用这些函数和subs一样。我们在插件模块中也有一组庞大的“私有”例程,但这没问题,因为它们只在内部使用。
我们还提供了一组工作簿,这些工作簿通过引用多个也受保护的外接程序来利用这些外接程序。但是,用户可以使用所有功能,我们甚至有一个不受保护的VBA外接程序来托管我们的VBA API --映射到受保护代码中的一层薄薄的公共例程。
客户端不需要知道插件内部发生了什么。他们唯一需要知道的就是我们提供的公开可用的API外接程序,他们可以使用它来自动化各种事情。
我知道这可能不是你想要的答案。我只是提供了一个希望有用的替代方法,你可能会考虑。
https://stackoverflow.com/questions/24820902
复制相似问题