【问题标题】:Using Application.Run to open a workbook with protected worksheets and protected VBAProject使用 Application.Run 打开具有受保护工作表和受保护 VBAProject 的工作簿
【发布时间】:2015-05-16 05:07:07
【问题描述】:

我公司当地办事处的一名员工正在处理工作簿 Sheet1 中的宏,该宏将使用 Application.Run 在另一个工作簿中运行宏:

Private Sub CommandButton1_Click()
Wfile = Range("B2").Value
Wpath = Range("B3").Value

Workbooks.Open Wpath + "/" + Wfile
Application.Run Wfile & "!copy_rates_macro"

End Sub

他试图打开/使用的工作簿受到各种可能的保护(它的所有工作表都受到保护,它的 VBAProject 也受到保护。

运行宏时,会弹出 1004 运行时错误消息窗口,提示“无法运行宏 'Name.xlsm!copy_rates_macro'。此工作簿中可能没有该宏,或者所有宏都可能被禁用。”

我做了很多研究,我认为将以下内容放入受保护的文件中会起作用:

Private Sub Workbook_Open()
'    Dim wSheet As Worksheet
'    For Each wSheet In Worksheets
'        wSheet.Protect Password:="pw", UserInterFaceOnly:=True
'    Next wSheet
    Application.EnableEvents = False
End Sub

请注意,上面注释掉的部分是我对已经存在并且必须保留在那里的代码的补充。此外,“pw”是每个工作表和 VBAProject 的密码。

这段代码没有什么不同(我运行它时没有注释掉它),我想它与受保护的 VBAProject 有关。

这个请求是否可能,或者它是一个失败的原因?我的老板不希望公开受保护工作簿的密码,但我找不到解决办法。

感谢您的帮助。

【问题讨论】:

  • 我认为不取消对 VBAProject 的保护就无法做到。

标签: vba excel


【解决方案1】:

您不必解除对项目的保护以在其中运行代码(这会使它变得毫无价值),但我可以在您的代码中看到几个可能的问题。首先,在路径末尾使用“/”而不是“\”,其次,如果工作簿名称包含空格,则需要将其括在单引号中:

Workbooks.Open Wpath + "\" + Wfile
Application.Run "'" & Wfile & "'!copy_rates_macro"

如果仍然无法运行,则可能存在一些陷阱: 1. 宏在同名模块中,或者在对象模块中,如工作表或ThisWorkbook,此时需要在宏名前加上对象的代号。 2. Automation Security 可能正在禁用打开的工作簿中的宏。要解决此问题,请尝试添加:

Application.AutomationSecurity = msoAutomationSecurityLow

在打开工作簿之前。理想情况下,您应该存储当前值并在最后重置它。

【讨论】:

  • 非常感谢!我什至没有想过要查看他的原始代码来查找错误。我只是马上去更复杂的解决方案。
  • 实际上,错误消息现在显示:您尝试更改的单元格或图表受到保护,因此是只读的。要修改受保护的单元格或图表,首先使用未受保护的工作表命令(查看选项卡,更改组)删除保护。系统可能会提示您输入密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2018-03-11
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
相关资源
最近更新 更多