Загрузка Capital IQ Plugin после запуска Excel с помощью CreateObject - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь автоматизировать процесс, в котором я:

  • Открыть файл
  • Изменить некоторые значения на основе другого файла
  • Выполнить макрос
  • Закрыть файл

Проблема в том, что данный макрос использует плагин Capital IQ.Макрос работает просто отлично, когда я сам открываю Excel, но выдает ошибки, когда я открываю Excel через VBScript.Я знаю из различных результатов Google, что CreateObject не загружает надстройки должным образом.Однако в результатах не указано, что делать, если надстройка состоит из файла .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

Общие замечания по улучшению производительности / аккуратности кода также приветствуются.

1 Ответ

0 голосов
/ 15 января 2019

Отправка ответа на мой вопрос на случай, если кто-то еще столкнется с подобной проблемой.Основываясь на обширном тестировании, проблема не в том, что плагин Capital IQ не загружается при открытии Excel.Это несмотря на сообщение Application.ComAddIns о том, что плагин S & P Capital IQ имеет атрибут Connect, равный True.Проблема заключается в том, что для полной загрузки COM AddIn для CapitalIQ требуется примерно 20 секунд (точное время варьируется).Это вызвало проблемы, когда я вызываю метод FindControl для Application.CommandBars.Я интерпретировал это как свидетельство того, что плагин не загружался, хотя на самом деле он загружался дольше.Я заметил это, когда FindControl не работал, когда я находился в режиме отладки, но работал, как только я выходил из режима отладки.

Отчасти проблема в диагностике проблемы заключается в том, что FindControl имеет странное поведение, выдавая ошибкукогда никакие объекты Control не соответствуют критериям, а не возвращают None, как предполагает документация.Таким образом, мне пришлось написать цикл while, чтобы в итоге обнаружить Control.В этот момент макрос работал бы так, как я хотел.

Наконец, я обнаружил, что модуль win32com для Python лучше подходит для моего случая автоматизации Excel.Это не связано с моим первоначальным вопросом, но это лучшая практика, которую я подобрал по пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...