我正在尝试自动化执行以下操作:
问题在于所讨论的宏依赖于Capital IQ插件。当我自己打开Excel时,宏工作正常,但通过VBScript打开excel时出错。我从各种Google搜索结果中知道,CreateObject无法正确加载Addins。但是,当Addin包含.xll文件和.dll文件时,结果未指定要做什么,并且我对VB不够熟悉,无法推断出如何做。当我打开已安装的Excel加载项列表(自己打开Excel之后)时,相关的列表似乎是C:\Program Files\Capital IQ\Office Plug-in\CIQAddin.dll
和C:\Program Files\Capital IQ\Office Plug-in\ciqfunctions.xll
。
一种流行的在线解决方案似乎正在添加一个功能,可以切换每个插件
Function ReloadXLAddins(TheXLApp As Excel.Application) As Boolean
Dim CurrAddin As Excel.AddIn
For Each CurrAddin In TheXLApp.AddIns
If CurrAddin.Installed Then
CurrAddin.Installed = False
CurrAddin.Installed = True
End If
Next CurrAddin
End Function
但是当我尝试添加它时,它仍然给我一个错误。
下面是我的VBScript外观的示例。
sFolder = "C:\SomeFolderPath\"
sMacro = "C:\SomeFilePath.xlsm"
Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each oFile in objFSO.GetFolder(sFolder).Files
If UCase(objFSO.GetExtensionName(oFile.Name)) = "XLS" Then
src_file = objFSO.GetAbsolutePathName(oFile)
macro_file = objFSO.GetAbsolutePathName(sMacro)
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)
Dim mBook
Set mBook = oExcel.Workbooks.Open(macro_file)
mBook.Sheets("input").Range("A1:A500").Value = oBook.Sheets(1).Range("A1:A500").Value
oBook.Close False
oExcel.Run mBook.name & "!Module1.myMacro"
mBook.Close False
oExcel.DisplayAlerts = False
oExcel.Quit
MsgBox("Done with file " & oFile.Name & "!")
End if
Next
也对提高代码的性能/整洁度的一般评论表示赞赏。
答案 0 :(得分:0)
在其他人遇到类似挑战的情况下,发布我自己问题的答案。根据广泛的测试,问题不在于Excel打开时没有加载Capital IQ插件。尽管Application.ComAddIns报告说S&P Capital IQ插件的Connect属性为True。问题在于,CapitalIQ的COM加载项大约需要20秒钟以上才能完全加载(确切时间会有所不同)。当我调用Application.CommandBars的“ FindControl”方法时,这会导致问题。我将其解释为该插件没有加载的证据,而实际上它只是需要更长的加载时间。当我在调试模式下无法使用FindControl时,但在退出调试模式后就可以使用时,我注意到了这一点。
诊断问题的部分困难在于,当没有Control对象符合条件时,FindControl具有抛出错误的奇怪行为,而不是像文档所建议的那样返回None。因此,我不得不编写一个while循环以最终检测到Control。到那时,宏将按照我的期望工作。
最后,我发现Python的win32com模块更适合我的Excel自动使用案例。这与我最初的问题无关,但这是我一路走来的最佳实践。