使用CreateObject启动excel后加载Capital IQ插件

时间:2018-12-11 19:01:12

标签: excel vbscript

我正在尝试自动化执行以下操作:

  • 打开文件
  • 根据另一个文件更改一些值
  • 执行宏
  • 关闭文件

问题在于所讨论的宏依赖于Capital IQ插件。当我自己打开Excel时,宏工作正常,但通过VBScript打开excel时出错。我从各种Google搜索结果中知道,CreateObject无法正确加载Addins。但是,当Addin包含.xll文件和.dll文件时,结果未指定要做什么,并且我对VB不够熟悉,无法推断出如何做。当我打开已安装的Excel加载项列表(自己打开Excel之后)时,相关的列表似乎是C:\Program Files\Capital IQ\Office Plug-in\CIQAddin.dllC:\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

也对提高代码的性能/整洁度的一般评论表示赞赏。

1 个答案:

答案 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自动使用案例。这与我最初的问题无关,但这是我一路走来的最佳实践。