使用 CreateObject 启动 excel 后加载 Capital IQ 插件
Loading Capital IQ Plugin after starting excel with CreateObject
我正在尝试使我的流程自动化:
- 打开文件
- 根据另一个文件更改一些值
- 执行宏
- 关闭文件
问题是有问题的宏依赖于 Capital IQ 插件。当我自己打开 Excel 时宏工作正常,但当我通过 VBScript 打开 excel 时出错。我从各种 google 结果中得知 CreateObject 无法正确加载加载项。但是,当 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
但是当我尝试添加它时,它仍然给我一个错误。
下面是我的 VB脚本的示例。
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
也欢迎对提高代码性能/整洁度的一般评论。
发布我自己的问题的答案以防其他人遇到类似的挑战。根据大量测试,问题不在于 Excel 打开时未加载 Capital IQ 插件。尽管 Application.ComAddIns 报告说 S&P Capital IQ 插件的 Connect 属性为 True。问题是 CapitalIQ 的 COM 加载项需要大约 20 多秒才能完全加载(具体时间会有所不同)。当我调用 Application.CommandBars 的 "FindControl" 方法时,这导致了问题。我将此解释为插件未加载的证据,而实际上它只是加载时间更长。当我在调试模式下 FindControl 不工作时,我注意到了这一点,但我一退出调试模式就工作了。
诊断问题的部分困难在于 FindControl 有奇怪的行为,当没有 Control 对象符合条件时会抛出错误,而不是像文档建议的那样返回 None。因此,我不得不编写一个 while 循环来最终检测到控件。到那时,宏就会像我想要的那样工作。
最后,我发现 Python 的 win32com 模块更适合我的自动化用例 Excel。这与我原来的问题无关,但这是我一路走来的最佳实践。
我正在尝试使我的流程自动化:
- 打开文件
- 根据另一个文件更改一些值
- 执行宏
- 关闭文件
问题是有问题的宏依赖于 Capital IQ 插件。当我自己打开 Excel 时宏工作正常,但当我通过 VBScript 打开 excel 时出错。我从各种 google 结果中得知 CreateObject 无法正确加载加载项。但是,当 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
但是当我尝试添加它时,它仍然给我一个错误。
下面是我的 VB脚本的示例。
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
也欢迎对提高代码性能/整洁度的一般评论。
发布我自己的问题的答案以防其他人遇到类似的挑战。根据大量测试,问题不在于 Excel 打开时未加载 Capital IQ 插件。尽管 Application.ComAddIns 报告说 S&P Capital IQ 插件的 Connect 属性为 True。问题是 CapitalIQ 的 COM 加载项需要大约 20 多秒才能完全加载(具体时间会有所不同)。当我调用 Application.CommandBars 的 "FindControl" 方法时,这导致了问题。我将此解释为插件未加载的证据,而实际上它只是加载时间更长。当我在调试模式下 FindControl 不工作时,我注意到了这一点,但我一退出调试模式就工作了。
诊断问题的部分困难在于 FindControl 有奇怪的行为,当没有 Control 对象符合条件时会抛出错误,而不是像文档建议的那样返回 None。因此,我不得不编写一个 while 循环来最终检测到控件。到那时,宏就会像我想要的那样工作。
最后,我发现 Python 的 win32com 模块更适合我的自动化用例 Excel。这与我原来的问题无关,但这是我一路走来的最佳实践。