【问题标题】:How to run a macro from a different workbook in a shared network?如何从共享网络中的不同工作簿运行宏?
【发布时间】:2017-10-05 01:30:39
【问题描述】:

因此,我对此进行了大量研究,但我的代码仍然无法正常工作。根据标题,问题是这样的:

我从网站上提取了一份数据报告,该报告以 .xlsx 文件的形式下载。我在功能区上创建了一个宏,所以当我单击它时,它将打开另一个工作簿并运行该宏。我使用的代码如下:

    Option Explicit
    Sub NotHardAtAll()

    Dim ws As Worksheet,
    Dim wb As Workbook

    Set wb = ActiveWorkbook

    Set ws = ActiveSheet


    Workbooks.Open Filename:="C:\Users\a0c27n\Desktop\Projects\incident_extended_report1.xlsm"

    'With Sheets("Sheet4").Activate  '*Not sure if this is enter code here 
     necessary...at all*

    Application.Run "!ADDHMKRFID"
    'End With

End Sub

我尝试将路径放在宏之前(即Application.Run"'incident_extended_report1.xlsm!ADDHMKRFID"),但它也不起作用*

我知道,至少从我所做的研究来看,我应该能够只使用“Application.Run”方法,但是我无法访问它正确的工作表。

当我运行宏时,它会拉出一个运行时错误“1004”错误,一个“400”,或者它拉得最多的是:“无法运行宏'!ADDHMKRFID'。宏可能不可用在此工作簿中或所有宏都可能被禁用。”

我试图从中提取宏的文件如下:

工作簿名称:incident_extended_report1.xlsm

工作表名称:Sheet4(测试宏)

宏名称: 子 ADDHMKRFID() 结束子

我知道 C:\ 不是一个共享网络,我将使用 S:\,但是由于机密性,我不确定我可以发布多少信息。 请询问您可能有的任何澄清或问题。我被卡住了一段时间,不确定我做错了什么。提前致谢!

【问题讨论】:

  • 这似乎是一个将其保存为附加组件(XLAM 格式)的好机会 - 然后您可以在任何打开的工作簿上使用它。
  • 我尝试将原始代码另存为 .xlam,但还是不行
  • 宏在哪个代码模块中?它是在普通代码模块中还是在工作表的代码模块中? “Sheet4”是工作表的CodeName,而“TEST MACRO”是工作表的Name,还是“Sheet4(TEST MACRO)”是工作表的Name?如果“Sheet4 (TEST MACRO)”是Name,并且宏在该工作表的代码模块中,那么该工作表的CodeName 是什么?
  • 还要去掉Dim ws As Worksheet, 中的逗号(我知道你原来的问题是Dim ws As Worksheet, Dim wb As Workbook 一行,但这也是无效的语法。)
  • IF 宏在工作表的代码模块中,并且工作表的CodeNameSheet4,那么Application.Run "'incident_extended_report1.xlsm'!Sheet4.ADDHMKRFID" 将起作用。如果宏在标准代码模块中,Application.Run "'incident_extended_report1.xlsm'!ADDHMKRFID" 将起作用。 (在所有情况下,确保宏声明为Public,即Public Sub ADDHMKRFID()

标签: vba excel


【解决方案1】:

您需要传递给 Application.Run 的字符串取决于包含宏的工作簿是否处于活动状态,如果不是,则取决于包含宏的工作簿的文件名(即:workbook.Name 属性中的内容) .

如果宏应该在数据报告工作簿处于活动状态时运行,您需要:

dim wb_data as Workbook: set wb_data = ActiveWorkbook
dim ws_data as Worksheet: set ws_data = ActiveSheet
dim wb_macro as Workbook
set wb_macro = Workbooks.Open(Filename:="C:\Users\a0c27n\Desktop\Projects\incident_extended_report1.xlsm")
ws_data.Activate
Application.Run wb_macro.Name & "!ADDHMKRFID"

这将保证提供正确的字符串,即使您更改了宏文件的名称。

否则,如果宏工作簿应该处于活动状态,请跳过激活数据工作表,因为默认情况下最后打开的工作簿将处于活动状态,然后使用“ADDHMKRFID”作为字符串。注意“!”不见了。仅当您在另一个工作簿中指定宏时才需要它。它与引用其他工作表中的数据时使用的表示法相同。

【讨论】:

  • 所以,它仍然无法正常工作。和以前一样,它成功提取文件,但是它不会运行宏并弹出错误消息:“无法运行宏'incident_extended_report.xlsm!ADDHMKRFID'。此工作簿或所有宏中可能没有宏可能被禁用。”
  • 可能是您的代码无法编译。它需要先编译,然后才能调用宏而不会出现错误 1004。出于某种原因,VBA 不会给您编译错误,它只是说“错误 1004,代码可能不存在或宏被禁用”。要编译您的项目,请单击“调试”>“编译 VBA 项目”
【解决方案2】:

首先,我解决了我自己的问题。但是,如果有人能向我解释为什么它会以这种方式工作,我将不胜感激。

我将原始宏保存在共享网络上,但我必须将其保存为模块(在本例中为 Module1)。我还将第二个宏(用于运行原始宏)保存在不同的工作簿中(尽管它不重要,只要它不是 .xlsx 文件)。

我写的代码是:

Sub Test()  'Name doesn't matter
Application.Run "'S:\xxxx\xxxx\xxxx\incident_extended_report.xlsm'!module1.ADDHMKRFID"
End Sub

然后我将此宏保存到功能区,以便在我必须下载的数据 report.xlsx 文件上运行它。现在,每当我想运行原始宏时,只需单击测试宏,它就会运行另一个宏!

我猜如果你想关闭你打开的另一个工作簿,你可以添加一个

 Workbooks (“S:\xxxx\xxxx\xxxx\incident_extended_report.xlsm").Close Savechanges:=False 

祝你好运!

【讨论】:

  • 那不应该的。您的代码应该在macro1 代码模块中寻找@​​987654323@ 过程,但您说您将它放在Module1 代码模块中。
猜你喜欢
  • 2018-10-08
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多