【问题标题】:Run Excel Macro from external VBScript Error从外部 VBScript 错误运行 Excel 宏
【发布时间】:2015-01-12 03:48:24
【问题描述】:

我有两个文件。

  1. example.wsf:自动化脚本
  2. example.xlsm:带有宏的 excel 模板,宏包含对外部服务器的 API 调用以检索数据。

我正在尝试调用 example.wsf 中的宏。

example.wsf 代码:

<package>

  <job id="example">
    <script language="vbscript">

        Set objApp = CreateObject("Excel.Application")

        Set objExcel = objApp.Workbooks.Open("example.xlsm",0,FALSE)    
        objApp.Visible = True
        objApp.DisplayAlerts = False

        objApp.Run("RefreshData")   

        msgbox "closing"

        objExcel.Close
        objApp.Quit

        Set objExcel = Nothing
        Set objApp = Nothing

        set objShell = Nothing

    </script>
  </job>

</package>

example.xlsm 中的 Excel 宏代码:

Public Sub RefreshData()
  Dim API As New EXTERNAL_API
  Dim varResult As Variant
  Dim vSheet As String
  Dim LastRow, LastCol, vResult
  vSheet = "D"

  ActiveWorkbook.Sheets(vSheet).Select
  Range("A6").Select
  Selection.Copy
  Range(Selection, Selection.End(xlDown)).Select
  LastRow = ActiveWorkbook.Sheets(vSheet).Cells(8, 1).End(xlDown).Row
  LastCol = 18

  API.ActivateAPI
  varResult = API.RunApplication("OfficeAPI", "application=excel,method=RefreshAll")
  MsgBox (varResult)

End Sub

如果宏在 Excel 工作簿中触发,则它本身运行良好。

但是当从 VBScript 调用宏时,EXTERNAL_API 无法执行,即以下行没有执行:

varResult = API.RunApplication("OfficeAPI", "application=excel,method=RefreshAll")

我怀疑这可能与早期绑定有关,但基本上不知道出了什么问题。

【问题讨论】:

  • 如果宏需要加载 Excel 加载项,您需要在代码中明确执行此操作。当您像这样自动化 Excel 时,默认情况下不会加载任何加载项。
  • @Rory Hi Rory,如果我通过 excel 选项添加了加载项,是否需要在代码中显式加载加载项?
  • 是的 - 如果它是 .xla/.xlam,最简单的方法是在打开工作簿后切换 AddIn 对象的 .Installed 属性。
  • @Rory 谢谢!加载项实际上是一个 dll 文件。我已经搜索了一段时间。如何在 vba 中显式加载它?
  • @Rory 我认为问题不是由于加载项,因为我发现当宏由 VBScript 自动执行时加载项是相同的。

标签: vba excel vbscript


【解决方案1】:

看起来你快到了。只是一些格式问题。请参阅下面的 sn-p。请注意我的 cmets 关于文件路径以及宏在 excel 文件中的位置。让我知道它是否适合你。

Set objApp = CreateObject("Excel.Application")
Set objExcel = objApp.Workbooks.Open("example.xlsm", 0, False) ''make sure you have valid path, such as a full UNC path
objApp.Visible = True
objApp.DisplayAlerts = False
objApp.Run "example.xlsm!RefreshData" ' this is if the Macro is in a Module.  Use "example.xlsm!sheet1.RefreshData" if it's on 
                                      '  sheet1, for example

【讨论】:

  • 谢谢爱德华。上面的代码能够调用宏,所以我不认为这是路径的问题。问题是调用宏时,'varResult = API.RunApplication("OfficeAPI", "application=excel,method=RefreshAll")' 不执行。你以前遇到过这种情况吗?
  • 啊,当您说外部应用程序时,我以为您是指 RefreshData。抱歉,我不明白为什么从脚本调用该行时不起作用。我想我需要更多地了解该应用程序。是否在同一个工作簿中?
  • EXTRENAL_API 是我 PC 上的数据馈送应用程序提供的 api。如果我在 Excel 中运行宏,该行工作正常,但如果 example.wsf 中的 vbscript 调用宏,它将无法检索任何数据。这种行为很奇怪,我在想它是否与早期绑定有关。
猜你喜欢
  • 2012-05-01
  • 1970-01-01
  • 2017-08-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多