【问题标题】:Excel VBA: Enabling Macro SettingsExcel VBA:启用宏设置
【发布时间】:2012-03-14 09:03:27
【问题描述】:

我编写了一个宏方法来在打开工作表时自动调整 Excel 工作表中的列大小。但是,此方案在用户未在 Excel 中启用宏的情况下不起作用。

有没有办法检查用户是否在 Excel 中禁用了 VBA 宏,然后使用 Excel VBA 代码启用宏?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    有一种方法可以自动启用宏,但您至少需要完全控制客户端计算机一次。使用数字证书并用它签署您的宏,当您第一次运行已签名的宏时,Excel 将为您提供始终信任由该证书签名的宏的选项。当您信任它时,所有使用您的证书签名的宏都将自动启用。

    这是在公司网络上开发和管理宏的最佳选择。

    【讨论】:

      【解决方案2】:

      这是一项安全功能。如果您可以在 vba 中的 Excel 中禁用它,它将无法达到目的。 恐怕答案是否定的,用户需要调整他的安全设置...

      话虽如此,您可以通过修改注册表来更改其他应用程序的设置。在最新版本的 Office 中,这是定义行为的键:HKEY_CURRENT_USER\Software\Microsoft\Office\XXXX\Excel\Security,您需要在其中修改(或创建)名为 vbawarnings 的 DWORD。它可以取的值如下(source):

      • 1:启用所有宏(不推荐)
      • 2:禁用所有通知
      • 3:禁用除数字签名宏以外的所有宏
      • 4:禁用所有而不通知

      【讨论】:

      • +1 用于注册表方法。我以前用vbs 试过这个,它在本地机器上运行良好,这可能也可以通过连接到其他机器在本地网络上实现。但是远程用户需要自己运行代码来设置宏设置,所以需要得到批准,我才走启动画面路线。
      • @SiddharthRout 是的,不知道那里有什么 - 我应该在我的答案中提供更多细节......我已经更新了答案,谢谢。
      【解决方案3】:

      这是检查 VBA 是否已启用而无需隐藏/显示工作表的另一种方法。隐藏/取消隐藏工作表的问题是工作表可以保存为“启用”状态,关闭而不保存,然后重新打开而不显示警告。

      在模块(不是工作表或工作簿宏)中创建以下函数:

      Public Function MacrosEnabled()
          MacrosEnabled = True
      End Function
      

      现在,在您想要显示有关是否启用宏的通知的任何单元格中,输入以下等式:

      =IF(ISERROR(MacrosEnabled()&NOW()),"Macros are disabled","Macros are enabled")
      

      如果您只使用ISERROR(MacrosEnabled()),则不会在每次打开电子表格时重新计算该值。通过连接NOW(),每次打开电子表格时都会读取当前时间,从而重新计算单元格的值。我对这种方法进行了广泛的测试,它似乎非常可靠地表明宏是否启用。

      如果宏被禁用,您可以应用条件格式来做很多事情:

      • 以明亮的颜色突出显示检查单元格,并可能更改“宏已禁用”文本以包含有关如何启用宏的说明。

      • “隐藏”值取决于宏的单元格,通过将其文本颜色和背景颜色设置为相同来启用宏。

      Here is a spreadsheet that demonstrates this method.

      【讨论】:

        【解决方案4】:

        执行此操作的标准方法是通过使用启动屏幕强制用户启用宏。

        • 工作簿中除启动屏幕外的所有工作表均已制作 非常隐藏(只能通过 VBA 或 VBA 编辑器更改)
        • 如果启用了宏:
          1) 当工作簿打开时,代码会取消隐藏所有这些非常隐藏的工作表
          2) 当工作簿关闭时,所有这些工作表都会再次非常隐藏
        • 如果未启用宏,则用户只能看到启动画面“请启用宏,关闭然后重新打开此文件”

        下面列出了包含此技术完整代码的两个链接

        1. Brad Yundt 报道了这个here at TekTips
        2. 琼斯克at VBAeXpress

        【讨论】:

        • 我会选择类似于上面第一个链接的内容,因为它使用了 BeforeSave。使用 BeforeClose 的问题在于,用户可能进行了他们不想保存的更改,通过在 BeforeClose 事件中保存工作簿来覆盖该选择,如第二个链接中所示。另一件事是您需要处理任何应该隐藏的工作表,或者如果它们可能这样做,则被用户隐藏。
        • Brad Yundt 的代码(上面的链接 #1,页面底部)几乎可以正常工作,但并不完全正常。它没有通过以下所有 6 个测试用例。对于每个测试:打开文件,启用宏,然后进行测试。 PASS = 没有奇怪的行为并且文件安静地关闭。测试: (1) ...什么都不做,关闭。 (2) ... 在单元格中输入,关闭,在保存提示时说 NO。 (3) ... 在单元格中输入,关闭,在保存提示时说“是”。 (4) ... 输入单元格,保存,关闭。 (5) ... 在单元格中输入,关闭,在保存提示时说 CANCEL,保存,关闭。 (6) ... 输入单元格,关闭,提示时取消,保存,输入另一个单元格,关闭,提示时是。
        • 我终于得到了通过所有 6 个测试用例的代码。该代码结合了@brettdj 上面的想法Brad Yundt's codes,以及John Walkenbach #1#2 的两个帖子。由于这篇文章现在已经有 2 年历史了,给未来的读者留个便条。如果这仍然感兴趣,请随时与我们联系。
        • @AssadEbrahim 您介意发布您的代码作为答案吗?我很想看看你是怎么做到的。
        • @ZX9 当然,我已经发布了on my site here. 点击源代码清单。项目 #6 启用宏(VBA 源代码)在 Excel 2007 上测试和工作。欢迎反馈。电子邮件在代码标题中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多