【发布时间】:2012-03-14 09:03:27
【问题描述】:
我编写了一个宏方法来在打开工作表时自动调整 Excel 工作表中的列大小。但是,此方案在用户未在 Excel 中启用宏的情况下不起作用。
有没有办法检查用户是否在 Excel 中禁用了 VBA 宏,然后使用 Excel VBA 代码启用宏?
【问题讨论】:
我编写了一个宏方法来在打开工作表时自动调整 Excel 工作表中的列大小。但是,此方案在用户未在 Excel 中启用宏的情况下不起作用。
有没有办法检查用户是否在 Excel 中禁用了 VBA 宏,然后使用 Excel VBA 代码启用宏?
【问题讨论】:
有一种方法可以自动启用宏,但您至少需要完全控制客户端计算机一次。使用数字证书并用它签署您的宏,当您第一次运行已签名的宏时,Excel 将为您提供始终信任由该证书签名的宏的选项。当您信任它时,所有使用您的证书签名的宏都将自动启用。
这是在公司网络上开发和管理宏的最佳选择。
【讨论】:
这是一项安全功能。如果您可以在 vba 中的 Excel 中禁用它,它将无法达到目的。 恐怕答案是否定的,用户需要调整他的安全设置...
话虽如此,您可以通过修改注册表来更改其他应用程序的设置。在最新版本的 Office 中,这是定义行为的键:HKEY_CURRENT_USER\Software\Microsoft\Office\XXXX\Excel\Security,您需要在其中修改(或创建)名为 vbawarnings 的 DWORD。它可以取的值如下(source):
【讨论】:
这是检查 VBA 是否已启用而无需隐藏/显示工作表的另一种方法。隐藏/取消隐藏工作表的问题是工作表可以保存为“启用”状态,关闭而不保存,然后重新打开而不显示警告。
在模块(不是工作表或工作簿宏)中创建以下函数:
Public Function MacrosEnabled()
MacrosEnabled = True
End Function
现在,在您想要显示有关是否启用宏的通知的任何单元格中,输入以下等式:
=IF(ISERROR(MacrosEnabled()&NOW()),"Macros are disabled","Macros are enabled")
如果您只使用ISERROR(MacrosEnabled()),则不会在每次打开电子表格时重新计算该值。通过连接NOW(),每次打开电子表格时都会读取当前时间,从而重新计算单元格的值。我对这种方法进行了广泛的测试,它似乎非常可靠地表明宏是否启用。
如果宏被禁用,您可以应用条件格式来做很多事情:
以明亮的颜色突出显示检查单元格,并可能更改“宏已禁用”文本以包含有关如何启用宏的说明。
“隐藏”值取决于宏的单元格,通过将其文本颜色和背景颜色设置为相同来启用宏。
【讨论】:
执行此操作的标准方法是通过使用启动屏幕强制用户启用宏。
下面列出了包含此技术完整代码的两个链接
【讨论】: