2015-10-19 26 views
2

Я знаком с OLE Automation и управлением другими приложениями из данной VBA IDE/VBE (в частности, VBE от Excel). Хотя я знаю, что метод SendKeys можно использовать для того, чтобы по существу выполнить то, что я пытаюсь сделать, я чувствую, что он может быть ненадежным в определенных ситуациях (не говоря уже о небольшой небрежности).OLE Автоматизация и взаимодействие с другой VBE/VBA IDE

Вкратце, я пытаюсь написать модуль VBA в текстовый файл из Excel (уже вычислен этот вариант), а затем импортировать модуль VBA IDE целевого приложения и выполнить код.

Мои основные причины этого в том, что справочные библиотеки, доступные для Excel в отношении указанного целевого приложения, имеют ограничения (в то время как, как и следовало ожидать, VBA IDE целевого приложения имеет гораздо больше свойств и методов для работы в качестве ссылки библиотеки являются специфическими для самого приложения по понятным причинам).

Любые мысли о том, как наилучшим образом достичь этого?

Было бы лучше просто создать настраиваемую ссылку или настройку COM или существующую (я бы предположил, что это довольно сложно, поскольку я не знаком с C# или Visual Studio)?

(Примечание: в случае, если вам было интересно, я работаю с сеансами отражения (IBM, для Windows) и довольно активно подвергаюсь первичному COM, с которым я работаю (EXTRACOM). В рамках VBE Reflection Sessions есть методы, такие как .GetFieldText (который вернет полное имя поля независимо от того, где курсор приложения помещен в заданное поле.Это может быть намного более полезным, чем .GetString EXTRACOM, который требует от программиста указания длины поля сначала и положения курсора). метод: .GetFieldColor (который вернет числовой код для цвета поля, свойство/метод, который отсутствует в EXTRACOM (файл ссылки Excel для Reflection).

+0

Удачи с этим ... Только так я мог программно получить VBA кода для выполнения из VBE надстройки была на инстанцировании хоста приложения и вызов 'Application.Run' ... [который ISN» t поддерживается на всех хостах VBE] (http://stackoverflow.com/q/31954364/1188513). Если вы достигнете этого, проект [Rubberduck] (http://www.rubberduck-vba.com), безусловно, будет рад услышать ваш вход! (заметьте, я являюсь совладельцем и поддерживаю этот проект) –

+1

Все еще запутано - вы хотите написать содержимое модуля в текстовый файл (или просто экспортировать .bas-файл?), а затем импортировать его в другое приложение Office? или приложение, отличное от Office? –

+0

Какую версию отражения вы используете? Это 2011 или после или что-то еще до этого? Я не уверен, что полностью понимаю, что вы пытаетесь сделать, но мне очень повезло с C#, который взаимодействует с Excel и Reflection (2011). – Hambone

ответ

0

Мне непонятно, что такое OP в скором времени пытаюсь сделать это.

Это кажется, что библиотеки Reflection типа не надежны при вызове из внешней рефлексии, поэтому решение, казалось бы, связаны с использованием Application.Run или автоматизации VBE.

Есть 2 способов достижения этой цели:

  1. Наличие отражение вызова VBA функция в экземпляре Excel (на примере я показал здесь), но если вы можете получить ссылку на отражение VBE , вы можете инвертировать это и вызвать Reflection VBA из Excel.

  2. Have Reflection экспортирует модули из vbProject (ов) Excel, а затем импортирует их в проекты (ы) Refelction vbProject.

К счастью, VBA делает оба подхода возможным. Для обоих подходов, вам необходимо добавить ссылки на Excel и Visual Basic for Applications Extensibility

Использование Application.Run для вызова функции в другом узле VBA

Использование Application.Run, мы можем вызывать функции в проектах Excel (и мы можем даже шаг от одного VBE к другому во время отладки. Мы можем передавать аргументы, и мы можем получить возвращаемые значения.

Sub CallExcelUDFFromNonExcelHost() 

    'Get an existing instance of Excel 
    Dim appXL As Excel.Application 
    Set appXL = GetObject(, "Excel.Application") 

    'Get the already opened Excel workbook 
    Dim wbk As Excel.Workbook 
    Set wbk = appXL.Workbooks("MyExcelFunctions.xlsm") 

    'Call the function in the Excel workbook 
    Dim result 
    result = appXL.Run(wbk.VBProject.Name & ".MyFunction", "Some Argument") 

End Sub 

Автоматизация VBE внешнего хоста VBA у меня нет отражения, так вот мой код работает в Access, и импортировать модуль из Excel.

Sub ImportVBAModuleFromOtherIDE() 

    'Get an existing instance of Excel 
    Dim appXL As Excel.Application 
    Set appXL = GetObject(, "Excel.Application") 

    'Get the already opened Excel workbook 
    Dim wbk As Excel.Workbook 
    Set wbk = appXL.Workbooks("MyExcelFunctions.xlsm") 

    'Export a module from Excel 
    wbk.VBProject.VBComponents("Module1").Export "C:\Temp\Module1.bas" 

    'Import the module into the Access project 
    Application.VBE.VBProjects("Database11").VBComponents.Import "C:\Temp\Module1.bas" 

End Sub