我公司当地办事处的一名员工正在使用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有关。
这个请求是否可能,或者它是否是一个失败的原因?我的老板不希望发布受保护工作簿的密码,但我找不到解决方法。
感谢您的帮助。
答案 0 :(得分:0)
您不应该取消保护项目以在其中运行代码(这会使其毫无价值),但我可以在您的代码中看到一些可能的问题。首先你使用" /"在路径的尽头而不是" \"第二,如果工作簿名称包含空格,则需要将其用单引号括起来:
Workbooks.Open Wpath + "\" + Wfile
Application.Run "'" & Wfile & "'!copy_rates_macro"
如果仍然无法运行,可能存在一些陷阱: 1.宏位于同名模块中,或者位于对象模块中,例如工作表或ThisWorkbook,在这种情况下,您需要在宏名称前加上对象的代码名称。 2. Automation Security可能正在禁用打开的工作簿中的宏。要解决此问题,请尝试添加:
Application.AutomationSecurity = msoAutomationSecurityLow
打开工作簿之前。理想情况下,您应该存储当前值并在结束时重置该值。