Как вставить код VBA в Excel .xlsm без использования Interop?

Моя цель – добавить macros в рабочую книгу excel, не включив «Trust Access to VBA Project Object Module» в Центр доверия Excel. (Включение доступа кажется угрозой безопасности).

Найденные кусочки головоломки в моем первоначальном поиске фактов: -Я вижу, что скрипт VBA хранится в zipped-файле xlsm как vbaProject.bin. -Есть несколько свободных / коммерческих ресурсов, которые могут работать с файлами excel: Создать excel без взаимодействия и шаблона с или без строк и столбцов

Было бы неплохо просто иметь файл сценария VBA в проекте C #, который код C # извлекает и вводит в документ Excel без взаимодействия VBA. Любой быстрый / быстрый / простой / простой способ сделать это или я должен играть со свободными / коммерческими ресурсами, связанными с выше?

Использование OpenXML SDK 2.0 :

  1. Создайте свой макрокоманд и сохраните его в формате .xlsm, скажем, snorehorse.xlsm.
  2. Откройте snorehorse.xlsm в наборе инструментов производительности OpenXML и сделайте код отражения в корне дерева.
  3. Найдите двоичный код макроса. Он находится в строчном формате и выглядит как случайные символы.
  4. В вашей среде IDE добавьте ссылку на OpenXML SDK и программно создайте или откройте файл excel, в который вы хотите ввести код макроса.
  5. Скопируйте макрокоманду, найденную на шаге №3, в свой код.
  6. Добавьте новую часть vba в пункт назначения.
  7. Подайте строковые данные в новую часть vba.
  8. Сохраните и запустите и радуйтесь, что вы обошли Центр доверия.

Пример кода:

using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; private string partData = "..."; public void vbaInjector{ [code to create / open spreadsheet using OpenXML omitted] VbaProjectPart vbaProjectPart1 = snoreSpreadsheetDoc.WorkbookPart.AddNewPart("rId8"); System.IO.Stream data = GetBinaryDataStream(partData); vbaProjectPart1.FeedData(data); data.Close(); [code to close spreadsheet and cleanup omitted] } private System.IO.Stream GetBinaryDataStream(string base64String) { return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String)); } 

Я решил добавить DLL OpenXML SDK в локальную сборку проекта, чтобы конечным пользователям не пришлось самостоятельно устанавливать SDK.

Я думаю, что это можно сделать на более низком уровне, работая с XML, не используя OpenXML SDK, но я не пытался научиться этому. Если кто-нибудь сможет опубликовать код, я соглашусь на этот ответ.

Кроме того, если у вас был программный способ конвертировать скрипт VBA во встроенный файл ресурсов в двоичную строку формата Excel, можно обойтись без необходимости копировать и вставлять новую строку двоичных данных каждый раз, когда вы хотите изменить макрокод. Это было бы превосходным ответом моему.

Благодарю.

Если вы используете EPPlus, теперь вы можете включить VBA программно. Посмотреть здесь:

Запись и выполнение макросов VBA в Excel без использования Excel.Interop