没有输入VBA密码,宏/ VBA无法运行

时间:2014-07-18 08:50:47

标签: vba passwords

我有一个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代码,他们只需要运行宏。

期待一个简单的答案!

2 个答案:

答案 0 :(得分:0)

我没有说明这一点,但有两点:

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

因此,您的代码可以访问所有内容,但用户仍需要密码才能编辑工作表。

我不知道你是否需要它,我希望如此。如果没有,你可以考虑重新制定你的问题

答案 1 :(得分:0)

不确定您要保护/取消保护代码以及所有这些目标。就个人而言,我认为你看错的方式。

在我的公司,我们有一组广泛的VBA加载项(.xla和.xlam),这些加载项受密码保护(甚至为了安全性而进行数字签名并防止篡改)。他们中的很多人互相参考,试图将它们构造为“剪贴板插件”,“通用工具插件”等,以便将它们的大小和功能分开。在此示例中,通用utils加载项保留对剪贴板加载项的引用,以便从中调用“公共”函数(不能跨模块或从工作簿调用专用例程)。

只有我们知道加载项的密码,但客户端可以毫无问题地调用“公共”函数和子函数,就像我们在加载项中调用这些函数和子函数一样。我们在加载项模块中也有一大堆“私有”例程,但这没关系,因为它们只在内部使用。

我们还提供了一组工作簿,这些工作簿通过引用许多加载项来使用这些加载项,这些加载项也受到保护。但是,所有功能都可供用户使用,我们甚至还有一个不受保护的VBA加载项,用于托管我们的VBA API - 一个映射到受保护代码的公共例程的薄层。

客户端不需要知道加载项内部发生了什么。他们唯一需要知道的是我们提供的公共API插件,他们可以使用它来自动化各种各样的东西。

我知道这可能不是你想要的答案。我只是提供一种有希望有用的替代方法,您可能需要考虑。