【发布时间】:2015-01-12 03:48:24
【问题描述】:
我有两个文件。
- example.wsf:自动化脚本
- 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 自动执行时加载项是相同的。