我有一个VBA宏与密码保护(防止未经授权访问宏)按预期运行。用户点击按钮,宏运行。内容或多或少:
Sub sample()
ActiveSheet.Unprotect Password:="xyz"
...VBA code....etc
ActiveSheet.Protect Password:="xyz", DrawingObjects:=True, Contents:=True, cenarios:=True
End Sub
现在我添加了一个Function,所以代码如下:
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代码,他们只需要运行宏。
期待一个简单的答案!
我没有说明这一点,但有两点:
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
因此,您的代码可以访问所有内容,但用户仍需要密码才能编辑工作表。
我不知道你是否需要它,我希望如此。如果没有,你可以考虑重新提出你的问题
不确定您要保护/取消保护代码以及所有这些目标。就个人而言,我认为你是以错误的方式看待它。
在我的公司,我们有一组广泛的VBA加载项(.xla和.xlam),这些加载项受密码保护(甚至为了安全性而进行数字签名并防止篡改)。他们中的很多人互相参考,试图将它们构造为“剪贴板插件”,“通用工具插件”等,以便将它们的大小和功能分开。在此示例中,通用utils加载项保留对剪贴板加载项的引用,以便从中调用“公共”函数(不能跨模块或从工作簿调用专用例程)。
只有我们知道加载项的密码,但客户端可以毫无问题地调用“公共”函数和子函数,就像我们在加载项中调用这些函数和子函数一样。我们在加载项模块中也有一大堆“私有”例程,但这没关系,因为它们仅在内部使用。
我们还提供了一组工作簿,这些工作簿通过引用许多加载项来使用这些加载项,这些加载项也受到保护。但是,所有功能都可供用户使用,我们甚至还有一个不受保护的VBA加载项,用于托管我们的VBA API - 一个映射到受保护代码的公共例程的薄层。
客户端不需要知道加载项内部发生了什么。他们唯一需要知道的是我们提供的公共API加载项,他们可以使用它来自动化各种各样的东西。
我知道这可能不是你想要的答案。我只是提供一种你希望考虑的替代方法。