Напишите код в VBA IDE из .NET

Я ищу способ написать код из надстройки VB.NET в проект VBA

Итак, скажем, напишите «Msgbox («Hello world!»)» в модуль .bas как часть проекта Excel из .NET, чтобы код, написанный из .NET, был бы предварительно написанным VBA, сохраненным в виде строки и введенным в проект VBA.

У меня есть устаревший код, который я использую для выполнения подобных вещей в VBA, используя свойства VBE, чтобы создать панель команд для VBA IDE и написать код в другие модули или создать новые модули, но я хотел бы иметь возможность делать это либо из того, что я сказал в теме из VB.NET [предпочтительно из созданной надстройки для отображения на ленте Excel], либо из автономного приложения winform, которое можно свернуть в трей.

Две вещи, которые я хочу сделать, это:

  1. Чтобы контролировать производительность кода VBA, устаревший код, о котором я упоминал, в основном вставляет вызов другой подпрограммы в начале и в конце каждой процедуры в проекте и записывает в .csv, чтобы вы знали, сколько времени потребовалось для запуска каждой подпрограммы и функции.
  2. Чтобы разбить проект VBA на составные части, чтобы их можно было добавить в TFS, в основном переберите все компоненты проекта VBA и экспортируйте их в папку, чтобы их можно было добавить в TFS, что позволяет лучше отслеживать изменения исходного кода.

Может ли кто-нибудь указать мне на примеры [если таковые имеются] написания кода для модуля VBA с vb.net или дать рекомендации о том, как этого можно достичь.

Я использую .net framework 4.5 и Visual Studio 2012 с vb, но меня также устраивают примеры C#

Большое спасибо.


person spences10    schedule 12.09.2013    source источник
comment
Извините, я неправильно понял ваш вопрос (комментарий удален). Я думал, что вы имели в виду некий конвертор VB.NET-VBA. Не уверен насчет стороны VBE, но что касается VBA (что говорит первая строка вашего вопроса), вы можете общаться с Excel в различных формах непосредственно из VB.NET (как сказано, Office Interop VB.NET - это своего рода реплика VBA) и, следовательно, не нуждается в доступе к VBA (хотя это возможно, его надежность мне не слишком ясна). Не могли бы вы назвать конкретную ситуацию, с которой вы хотели бы справиться? Возможно, есть другой вариант.   -  person varocarbas    schedule 12.09.2013
comment
Да, я добавлю свои конкретные примеры того, чего я пытаюсь достичь в вопросе, спасибо.   -  person spences10    schedule 12.09.2013
comment
Как уже говорилось, вы можете запускать код VBA из VB.NET (здесь у вас есть ссылка с некоторыми подсказками: stackoverflow.com/questions/4133094/); хотя я всегда предпочитаю/рекомендую не смешивать платформы (либо VBA, либо VB.NET, взаимодействующие с Excel). Ваш второй пункт, похоже, поддерживает мое вышеупомянутое предложение: возможно, вам следует перенести все на VB.NET, поскольку TFS предназначена для VS (VB.NET), и нет настоящей совместимости VB.NET-VBA, позволяющей использовать этот фреймворк. Может у кого есть другая идея...   -  person varocarbas    schedule 12.09.2013
comment
Я бы не хотел ничего больше, чем управлять всеми книгами и приложениями из Visual Studio, увы, есть некоторые проекты, которые отказываются переноситься в 21 век, но нам нужно иметь возможность отслеживать любые изменения, внесенные в кодовую базу, поэтому TFS хороший способ сделать это вместо сравнения старой версии с текстовым сравнением или чем-то еще. Спасибо за комментарий, я посмотрю ссылку, которую вы разместили.   -  person spences10    schedule 12.09.2013
comment
Без проблем. Но я не думаю, что нет ничего, что вы не могли бы перенести из VBA в VB.NET (то же самое из VB.NET в VBA для любого материала, связанного с MS-Office); по логике, это требует времени... но звучит так, как будто вам все равно когда-нибудь придется это сделать.   -  person varocarbas    schedule 12.09.2013


Ответы (1)


Я предполагаю, что вы уже поняли это, но на всякий случай:

Дерево объектов VBE отображается посредством автоматизации — просто получите объект приложения для любого файла Office, с которым вы имеете дело, с помощью вызова CreateObject, а затем выполните то же самое, что и в VBA (с соответствующими изменениями от VB6 до .net, очевидно).

exl = CreateObject("Excel.Sheet")
exl.Application.Workbooks.Open("whatever.xlsx")
'exl.Application.VBE.ActiveVBProject etc etc
person DoraTrix    schedule 04.04.2014