使用Application.Run打开带有受保护工作表和受保护VBAProject的工作簿

时间:2015-03-13 16:08:10

标签: excel vba excel-vba

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

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有关。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您不应该取消保护项目以在其中运行代码(这会使其毫无价值),但我可以在您的代码中看到一些可能的问题。首先你使用" /"在路径的尽头而不是" \"第二,如果工作簿名称包含空格,则需要将其用单引号括起来:

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

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

Application.AutomationSecurity = msoAutomationSecurityLow

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

相关问题