【问题标题】:Macro / VBA fails to run without entering the VBA password宏/VBA 未输入 VBA 密码无法运行
【发布时间】:2014-09-09 08:23:28
【问题描述】:

我有一个按预期运行的带有密码保护(防止未经授权访问宏)的 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 代码,他们只需要运行宏。

期待一个简单的答案!

【问题讨论】:

  • 有些东西我不明白:您说的是访问 VBA 代码的密码(我们可以使用一个密码来锁定所有代码),但这里似乎 (ActiveSheet.Protect) 您只是在保护带有密码的工作表。所以:你的意思是你用密码保护工作表,而 vba 代码在工作表中,而不是一个单独的模块?还是我完全错了?

标签: vba passwords


【解决方案1】:

我没搞清楚重点,但有两点:

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

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

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

【讨论】:

    【解决方案2】:

    不确定您要通过保护/取消保护代码以及所有这些来达到什么目的。就我个人而言,我认为你看错了。

    在我的公司,我们有大量受密码保护的 VBA 加载项(.xla 和 .xlam)(为了安全和防止篡改,甚至还进行了数字签名)。它们中的许多相互引用,试图将它们构造为“剪贴板插件”、“通用实用程序插件”等,以保持它们的大小和功能分开。在此示例中,通用 utils 加载项保留对剪贴板加载项的引用,以便从中调用“公共”函数(您不能跨模块或从工作簿调用私有例程)。

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

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

    客户不需要知道插件内部发生了什么。他们唯一需要知道的是我们提供的公开可用的 API 插件,他们可以使用它来自动化各种事情。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多