Есть ли тактическое (читай "взломать") решение, позволяющее избежать использования кода VBA и листа Excel в виде одного двоичного файла? - PullRequest
6 голосов
/ 12 февраля 2009

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

Есть ли способ обойти это без переключения на VSTO, COM-надстройки и т. Д.? Например. для загрузки листа все VBA во время выполнения от веб-службы, общего диска и т. д.? Любые идеи приветствуются.

Спасибо.

Ответы [ 6 ]

12 голосов
/ 12 февраля 2009

Я написал своего рода систему сборки для Excel, которая импортирует код VBA из исходных файлов (которые затем могут быть импортированы в систему управления исходным кодом, в diffd и т. Д.). Он работает путем создания нового файла Excel, который содержит импортированный код, поэтому он может не работать в вашем случае.

Макрос сборки выглядит следующим образом, я сохраняю его в файле с именем Build.xls:

Sub Build()
    Dim path As String
    path = "excelfiles"

    Dim vbaProject As VBIDE.VBProject
    Set vbaProject = ThisWorkbook.VBProject

    ChDir "C:\Excel"
    ' Below are the files that are imported
    vbaProject.VBComponents.Import (path & "\something.frm")
    vbaProject.VBComponents.Import (path & "\somethingelse.frm")

    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs "Output.xls"
    Application.DisplayAlerts = True

    Application.Quit
End Sub

Теперь, материал VBIDE означает, что вы должны импортировать ссылку под названием «Microsoft Visual Basic для расширений приложений 5.3», я думаю.

Конечно, у вас все еще есть проблема с запуском Excel для сборки. Это можно исправить с помощью небольшого VB-скрипта:

currentPath = CreateObject("Scripting.FileSystemObject") _
    .GetAbsolutePathName(".")
filePath = currentPath & "\" & "Build.xls"

Dim objXL
Set objXL = CreateObject("Excel.Application")
With objXL
    .Workbooks.Open(filePath)
    .Application.Run "Build.Build"
End With
Set objXL = Nothing

Запуск вышеуказанного скрипта должен запустить файл Excel сборки, который выводит полученный лист. Вероятно, вам придется изменить некоторые вещи, чтобы сделать его подвижным в файловой системе. Надеюсь, это поможет!

3 голосов
/ 12 февраля 2009

Я настоятельно рекомендую не пытаться загрузить VBA во время выполнения. Автоматизация VBIDE в лучшем случае ненадежна, и я думаю, что вы столкнетесь с большим количеством проблем при обслуживании и поддержке.

Мое решение для этого было экспортировать код перидокально для контроля исходного кода в виде текстовых файлов. Я также удалил бы весь код из xls (полное удаление форм, модулей и модулей классов и удаление кода в модулях Worksheet и Workbook) и поместил только этот «заглушку» xls в систему контроля версий.

Таким образом, восстановление из системы контроля версий будет состоять из взятия «заглушки» xls, импорта всех форм, модулей классов и модулей, а также копирования и вставки всего кода в модули рабочего листа и рабочей книги.

Несмотря на то, что это был болезненный процесс, он позволял должным образом контролировать исходный код со всеми обычными возможностями разграничения, ветвления и т. Д. К сожалению, большая часть этого была ручной. Я написал надстройку, которая автоматизировала кое-что из этого, но это было быстро взломанное вместе решение, то есть довольно глючное и требующее ручного вмешательства. Если я когда-нибудь вернусь к его повторному рассмотрению и получу его с нуля, я дам вам знать; -)

1 голос
/ 16 февраля 2011

Кратчайший путь вперед использует надстройку SourceTools.xla из http://www.codeproject.com/KB/office/SourceTools.aspx

Другой подход - написать аналогичный инструмент, используя привязки COM к вашему любимому языку программирования. Мой опытный коллега создал в Python такую ​​программу, которая могла бы экспортировать все, включая код VBA, содержимое листа и формулы и даже ссылки на VBA, в текстовые файлы и собирать из них рабочую книгу. Это было до формата XLSX тоже.

1 голос
/ 12 февраля 2009

Интересный вопрос ... у нас также есть проблема с контролем исходного кода VBA, но мы так и не смогли ее решить.

Соответствует ли статья Microsoft KB вашим критериям? Код помещается в файл .BAS, который может находиться в произвольном месте (и отдельно от .xls).

Как я уже сказал, я никогда не пытался сделать это, но похоже, что это может быть один подход.

0 голосов
/ 12 февраля 2009

Я думаю, что по сравнению с альтернативами (т. Е. Постоянным пересозданием файлов книг Excel) было бы гораздо меньше проблем с переходом на VSTO или COM Addins с использованием VBA для легкой работы по созданию прототипов. Вы также получаете дополнительное преимущество, заключающееся в отсутствии «легко взломанного» исходного кода (т.е. вам нужно больше, чем угадывать пароль проекта VBA)

0 голосов
/ 12 февраля 2009

Я бы также советовал не загружать во время выполнения и искать утилиту в стиле make . В конце концов, если ваш код находится под контролем исходного кода, вам нужно будет обновлять свои книги только после коммита.

К сожалению, нет такой утилиты, или, по крайней мере, такой, которую я не смог бы найти.

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