Какие системы контроля версий вы использовали с MS Excel (2003/2007)? Что бы вы порекомендовали и почему? Какие ограничения вы обнаружили у своей системы контроля версий с самым высоким рейтингом?
Чтобы представить это в перспективе, вот несколько вариантов использования:
@ Ричи Коттон. Если бы это был практический вариант (например, использование Matlab / python), то ВСЕ финансовые компании к настоящему времени изменились бы. Просить людей, которые анализируют финансовые модели, но не являются программистами, быть программистами, в целом чревато опасностями и на самом деле непрактично.
Те, кто обвиняет моделирование Excel в кредитном кризисе, скорее всего, являются мошенниками, намеренно продававшими барахло как AAA. Вам не нужна электронная таблица, чтобы сказать, что вложения - дерьмо. Как финансовый специалист, я могу сказать вам, что полная зависимость от любой модели - верный способ потерять свою задницу. Кроме того, любые модели настолько хороши, насколько хороши люди, которые их построили. Если вы наймете Мортса, чтобы тот выполнял работу Эйнштейна, у вас будут плохие времена.
Если вас больше всего интересует управление версиями макросов VBA, см. Мой ответ здесь: stackoverflow.com/a/38297505/2146688
Если вас просто интересует часть VBA VCS, то релевантен связанный с Chel поток, как и этот поток по управлению VBA через Git: stackoverflow.com/questions/36024342/…


Используйте любой из стандартных инструментов контроля версий, например SVN или CVS. Ограничения будут зависеть от цели. За исключением небольшого увеличения размера репозитория, проблем не возникало.
Это зависит от того, говорите ли вы о данных или о коде, содержащемся в электронной таблице. Хотя мне очень не нравится Visual Sourcesafe от Microsoft и я обычно не рекомендую его, он легко интегрируется как с Access, так и с Excel и обеспечивает контроль версий модулей.
[Фактически интеграция с Access включает запросы, отчеты и модули как отдельные объекты, для которых можно управлять версиями]
Ссылка MSDN - здесь.
Один из наиболее охраняемых секретов - я не знал, что VSS может это сделать. +1
Я этого тоже не знал. Но в любом случае, VSS - это куча дерьма, и я бы держался от него подальше.
Я был очень взволнован и потратил час на поиск этого в сети, но похоже, что MS перестала поддерживать его в Excel 2003. Возможно, вам повезет, если вы работаете с Access VBA, но я не смотрел.
вы могли бы использовать надстройку Office для разработчиков ?: brandon.fuller.name/archives/2003/11/07/10.26.30
Это зависит от того, какой уровень интеграции вы хотите, я использовал Subversion / TortoiseSVN, который кажется подходящим для простого использования. Я также добавил ключевые слова, но, похоже, есть риск повреждения файла. В Subversion есть возможность сделать замену ключевых слов фиксированной длиной, и, насколько я понимаю, она будет работать, если фиксированная длина будет четной, но не нечетной. В любом случае вы не получите какой-либо полезной функции сравнения, я думаю, что есть коммерческие продукты, которые будут выполнять эту функцию. Я нашел кое-что, что делало разницу, основанную на преобразовании материала в обычный текст и его сравнении, но это было не очень хорошо.
Он должен работать с большинством VCS (в зависимости от других критериев вы можете выбрать SVN, CVS, Darcs, TFS и т. д.), Однако на самом деле это будет полный файл (потому что это двоичный формат), а это означает, что вопрос «что изменилось?» не так-то просто ответить.
Вы по-прежнему можете полагаться на сообщения журнала, которые люди заполняют если, но вы также можете попробовать новые форматы на основе XML из Office 2007, чтобы получить больше наглядности (хотя все равно будет сложно отсеять тонны XML, плюс AFAIK XML-файл заархивирован на диске, поэтому вам понадобится обработчик pre-commit, чтобы распаковать его, чтобы текст diff работал правильно).
Если вы ищете офисную среду с обычными офисными нетехническими пользователями, то Sharepoint - жизнеспособная альтернатива. Вы можете настроить папки документов с включенным контролем версий, а также с проверками и проверками. Делает его более удобным для обычных офисных пользователей.
Одна вещь, которую вы могли бы сделать, - это иметь следующий фрагмент в своей Рабочей книге:
Sub SaveCodeModules()
'This code Exports all VBA modules
Dim i%, sName$
With ThisWorkbook.VBProject
For i% = 1 To .VBComponents.Count
If .VBComponents(i%).CodeModule.CountOfLines > 0 Then
sName$ = .VBComponents(i%).CodeModule.Name
.VBComponents(i%).Export "C:\Code\" & sName$ & ".vba"
End If
Next i
End With
End Sub
Я нашел этот фрагмент в Интернете.
Впоследствии вы можете использовать Subversion для управления версиями. Например, используя интерфейс командной строки Subversion с командой shell в VBA. Это сделало бы это. Я даже подумываю сделать это сам :)
Я считаю, что это отличный подход. Контроль исходного кода кода Excel возможен только при декомпозиции. Это также предполагает подход к сборке. Code Cleaner может сделать это, например (я считаю, бесплатная программа) appspro.com/Utilities/CodeCleaner.htm, но в равной степени ваш код эквивалентен.
Я попытался изменить это для работы с Microsoft® Excel® для Mac 2011 версии 14.4.1. Строка, которая вызывает метод Export, ничего не делает (независимо от того, какие правильно сформированные каталоги OS X я использовал).
Я не знаю инструмента, который бы справлялся с этим хорошо, но я видел множество самодельных решений. Общей чертой этого является минимизация двоичных данных при управлении версиями и максимизация текстовых данных для использования возможностей обычных систем scc. Сделать это:
Зачем повторять всю эту ерунду, когда все, что вам нужно, это система управления версиями, которая обрабатывает двоичные объекты? SVN может это сделать.
Потому что вы не можете объединять бинарные объекты
в ответ на ответ mattlant - sharepoint будет хорошо работать как средство контроля версий, только если функция контроля версий включена в библиотеке документов. Кроме того, имейте в виду, что любой код, который вызывает другие файлы по относительным путям, не будет работать. и, наконец, любые ссылки на внешние файлы будут разорваны, когда файл будет сохранен в sharepoint.
Я только что настроил электронную таблицу, в которой используется Bazaar, с ручной проверкой / выходом через TortiseBZR. Учитывая, что эта тема помогла мне с сохранением, я хотел опубликовать здесь свое решение.
Решением для меня было создание электронной таблицы, которая экспортирует все модули при сохранении и удаляет и повторно импортирует модули при открытии. Да, это может быть потенциально опасно для преобразования существующих таблиц.
Это позволяет мне редактировать макросы в модулях через Emacs (да, emacs) или непосредственно в Excel и фиксировать мой репозиторий BZR после серьезных изменений. Поскольку все модули являются текстовыми файлами, стандартные команды в стиле diff в BZR работают с моими источниками, за исключением самого файла Excel.
Я установил каталог для моего репозитория BZR, X: \ Data \ MySheet. В репо есть MySheet.xls и один файл .vba для каждого из моих модулей (например: Module1Macros). В свою электронную таблицу я добавил один модуль, который освобожден от цикла экспорта / импорта, под названием «VersionControl». Каждый модуль, который нужно экспортировать и повторно импортировать, должен оканчиваться на «Макросы».
Содержание модуля «Контроль версий»:
Sub SaveCodeModules()
'This code Exports all VBA modules
Dim i%, sName$
With ThisWorkbook.VBProject
For i% = 1 To .VBComponents.Count
If .VBComponents(i%).CodeModule.CountOfLines > 0 Then
sName$ = .VBComponents(i%).CodeModule.Name
.VBComponents(i%).Export "X:\Tools\MyExcelMacros\" & sName$ & ".vba"
End If
Next i
End With
End Sub
Sub ImportCodeModules()
With ThisWorkbook.VBProject
For i% = 1 To .VBComponents.Count
ModuleName = .VBComponents(i%).CodeModule.Name
If ModuleName <> "VersionControl" Then
If Right(ModuleName, 6) = "Macros" Then
.VBComponents.Remove .VBComponents(ModuleName)
.VBComponents.Import "X:\Data\MySheet\" & ModuleName & ".vba"
End If
End If
Next i
End With
End Sub
Затем мы должны настроить перехватчики событий для открытия / сохранения для запуска этих макросов. В средстве просмотра кода щелкните правой кнопкой мыши «ThisWorkbook» и выберите «Просмотреть код». Возможно, вам придется потянуть вниз поле выбора в верхней части окна кода, чтобы перейти от представления «(Общие)» к представлению «Рабочая книга».
Содержание представления «Рабочая тетрадь»:
Private Sub Workbook_Open()
ImportCodeModules
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveCodeModules
End Sub
Я освоюсь в этом рабочем процессе в течение следующих нескольких недель и опубликую, если у меня возникнут проблемы.
Спасибо, что поделились кодом VBComponent!
При повторном импорте вы также можете проверить тип модуля. ThisWorkbook.VBProject.VBComponents.Item (i) .Type: 1 для стандартного модуля, 2 для модуля класса, 3 для пользовательской формы и 100 для модуля документа (книги или листа).
Ошибка в коде импорта. Поскольку вы удаляете и импортируете модули, он меняет порядок модулей, поэтому каждый раз вам не хватает нескольких. Вам нужно изменить цикл For, чтобы перемещаться по массиву в обратном направлении. например Для i = .VBComponents.Count To 1 Step -1
Я вижу, что он может изменить порядок макросов, почему он потеряет один?
Допустим, у вас есть модули a, b и c: первый проход цикла удаляет a и воссоздает его, теперь порядок модулей - b, c, a. Второй проход цикла удаляет c и воссоздает его, теперь порядок b, a, c. Третий проход цикла снова удаляет c и воссоздает его, и цикл завершается. Он пропустил b.
Я попробовал этот макрос, и мой антивирус (Symantec 12.1) определил его как BloodHound.ExcelMacro. Чтобы этого избежать, мне пришлось изменить несколько строк кода.
В Excel 2013 необходимо включить «Доверять доступ к объектной модели проекта VBA» в Центре управления безопасностью, иначе вы получите очень бесполезную ошибку 1004, если попытаетесь запустить этот код.
Этот сценарий выше далек от совершенства. Подпрограмма importCodeModules () содержит ошибки и производит повторяющиеся модули. Более того, вам нужно будет отредактировать каждую книгу, чтобы добавить события open и before_save. Это неприемлемо. После долгого поиска в сети я наконец нашел что-то, что действительно работает (что относится к здесь). Он имеет импорт, экспорт кода, форматирование кода и многое другое. Экспорт происходит автоматически при сохранении, и нет необходимости редактировать существующие книги.
Отличная находка! Я бы предложил использовать это, а не мой сценарий выше. Я написал его один раз и какое-то время пользовался им, он удовлетворил мои потребности. Для тех, кто ежедневно использует Excel и VBA, гораздо более подходящей будет программа или проект, посвященный этому экспорту. Спасибо, что поделился!
TortoiseSVN - удивительно хороший клиент Windows для системы контроля версий Subversion. Одна особенность, которую я только что обнаружил, заключается в том, что когда вы нажимаете, чтобы получить разницу между версиями файла Excel, он открывает обе версии в Excel и выделяет (красным) ячейки, которые были изменены. Это делается с помощью волшебства сценария vbs, описанного здесь.
Вы можете найти это полезным, даже если НЕ используете TortoiseSVN.
Так удивительно знать, что TortoiseSVN можно сравнить как встроенную функцию ^^
То же самое и с файлом Word?
Я только что протестировал - это также доступно для файла Word. Круто ^^
Похоже, это не работает для кода VB. Любое решение для этого?
Я тоже занимаюсь этим. Оказывается, последняя версия Team Foundation Server 2010 может иметь надстройку Excel.
Вот подсказка:
http://team-foundation-server.blogspot.com/2009/07/tf84037-there-was-problem-initializing.html
TFS активно использует Excel в отчетах по рабочим элементам, к сожалению, это не связано с получением файлов Excel в системе управления версиями.
Также существует программа под названием Вне всякого сравнения, в которой есть довольно приятное сравнение файлов Excel. Я нашел скриншот на китайском языке, который вкратце показывает это:
На их страница есть 30-дневная пробная версия
Я написал электронную таблицу с контролем версий, используя VBA. Он больше ориентирован на инженерные отчеты, когда у вас есть несколько человек, работающих над спецификацией материалов или расписанием, а затем в какой-то момент вы хотите создать ревизию моментального снимка, которая показывает добавления, удаления и обновления из предыдущей версии.
Примечание: это книга с поддержкой макросов, которую вам необходимо войти в систему, чтобы загрузить с моего сайта (вы можете использовать OpenID)
Весь код разблокирован.
Возможно, вы пробовали использовать Microsoft Excel XML в zip-контейнере (.xlsx и .xslm) для контроля версий и обнаружили, что vba хранился в vbaProject.bin (что бесполезно для контроля версий).
Решение простое.
Когда вы повторите это со следующей версией электронной таблицы, вам нужно будет убедиться, что файлы папки точно соответствуют файлам в zip-контейнере (и не оставляют никаких удаленных файлов).
Однако такой подход сопряжен с риском. Если впоследствии вы будете использовать функцию в Excel, которая либо не реализована в Libre, либо не «отображается» на Libre и обратно правильно, этот подход не работает. Я уверен, что это сработает для простых таблиц, но нужно проявлять особую осторожность. PW
Работая над работой @Demosthenex, @Tmdean и @Jon Crowell оставляют бесценные комментарии! (+1 им)
Я сохраняю файлы модулей в git \ dir рядом с расположением книги. Измените это по своему вкусу.
Это НЕ будет отслеживать изменения кода книги. Так что синхронизировать их решать вам.
Sub SaveCodeModules()
'This code Exports all VBA modules
Dim i As Integer, name As String
With ThisWorkbook.VBProject
For i = .VBComponents.count To 1 Step -1
If .VBComponents(i).Type <> vbext_ct_Document Then
If .VBComponents(i).CodeModule.CountOfLines > 0 Then
name = .VBComponents(i).CodeModule.name
.VBComponents(i).Export Application.ThisWorkbook.Path & _
"\git\" & name & ".vba"
End If
End If
Next i
End With
End Sub
Sub ImportCodeModules()
Dim i As Integer
Dim ModuleName As String
With ThisWorkbook.VBProject
For i = .VBComponents.count To 1 Step -1
ModuleName = .VBComponents(i).CodeModule.name
If ModuleName <> "VersionControl" Then
If .VBComponents(i).Type <> vbext_ct_Document Then
.VBComponents.Remove .VBComponents(ModuleName)
.VBComponents.Import Application.ThisWorkbook.Path & _
"\git\" & ModuleName & ".vba"
End If
End If
Next i
End With
End Sub
А затем в модуле Workbook:
Private Sub Workbook_Open()
ImportCodeModules
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveCodeModules
End Sub
После долгих поисков и опробования множества различных инструментов я нашел здесь свой ответ на проблему контроля версий vba: https://stackoverflow.com/a/25984759/2780179
Это простая надстройка Excel, код которой можно найти здесь
После импорта не остается повторяющихся модулей. Он автоматически экспортирует ваш код, как только вы сохраните книгу без изменения существующих книг. Он поставляется вместе с программой форматирования кода vba.
Взяв ответ @Demosthenex еще дальше, если вы хотите также отслеживать код в своих объектах Microsoft Excel и пользовательских формах, вам придется немного усложнить задачу.
Сначала я изменил свою функцию SaveCodeModules(), чтобы учесть различные типы кода, которые я планирую экспортировать:
Sub SaveCodeModules(dir As String)
'This code Exports all VBA modules
Dim moduleName As String
Dim vbaType As Integer
With ThisWorkbook.VBProject
For i = 1 To .VBComponents.count
If .VBComponents(i).CodeModule.CountOfLines > 0 Then
moduleName = .VBComponents(i).CodeModule.Name
vbaType = .VBComponents(i).Type
If vbaType = 1 Then
.VBComponents(i).Export dir & moduleName & ".vba"
ElseIf vbaType = 3 Then
.VBComponents(i).Export dir & moduleName & ".frm"
ElseIf vbaType = 100 Then
.VBComponents(i).Export dir & moduleName & ".cls"
End If
End If
Next i
End With
End Sub
Пользовательские формы можно экспортировать и импортировать так же, как код VBA. Единственное отличие состоит в том, что при экспорте формы будут созданы два файла (вы получите файл .frm и файл .frx для каждой пользовательской формы). Один из них содержит написанное вами программное обеспечение, а другой - двоичный файл, который (я почти уверен) определяет макет формы.
Объекты Microsoft Excel (MEO) (то есть Sheet1, Sheet2, ThisWorkbook и т. д.) Можно экспортировать как файл .cls. Однако, если вы захотите вернуть этот код в свою книгу, если вы попытаетесь импортировать его так же, как и модуль VBA, вы получите сообщение об ошибке, если этот лист уже существует в книге.
Чтобы обойти эту проблему, я решил не пытаться импортировать файл .cls в Excel, а вместо этого прочитать файл .cls в excel как строку, а затем вставить эту строку в пустой MEO. Вот мои ImportCodeModules:
Sub ImportCodeModules(dir As String)
Dim modList(0 To 0) As String
Dim vbaType As Integer
' delete all forms, modules, and code in MEOs
With ThisWorkbook.VBProject
For Each comp In .VBComponents
moduleName = comp.CodeModule.Name
vbaType = .VBComponents(moduleName).Type
If moduleName <> "DevTools" Then
If vbaType = 1 Or _
vbaType = 3 Then
.VBComponents.Remove .VBComponents(moduleName)
ElseIf vbaType = 100 Then
' we can't simply delete these objects, so instead we empty them
.VBComponents(moduleName).CodeModule.DeleteLines 1, .VBComponents(moduleName).CodeModule.CountOfLines
End If
End If
Next comp
End With
' make a list of files in the target directory
Set FSO = CreateObject("Scripting.FileSystemObject")
Set dirContents = FSO.getfolder(dir) ' figure out what is in the directory we're importing
' import modules, forms, and MEO code back into workbook
With ThisWorkbook.VBProject
For Each moduleName In dirContents.Files
' I don't want to import the module this script is in
If moduleName.Name <> "DevTools.vba" Then
' if the current code is a module or form
If Right(moduleName.Name, 4) = ".vba" Or _
Right(moduleName.Name, 4) = ".frm" Then
' just import it normally
.VBComponents.Import dir & moduleName.Name
' if the current code is a microsoft excel object
ElseIf Right(moduleName.Name, 4) = ".cls" Then
Dim count As Integer
Dim fullmoduleString As String
Open moduleName.Path For Input As #1
count = 0 ' count which line we're on
fullmoduleString = "" ' build the string we want to put into the MEO
Do Until EOF(1) ' loop through all the lines in the file
Line Input #1, moduleString ' the current line is moduleString
If count > 8 Then ' skip the junk at the top of the file
' append the current line `to the string we'll insert into the MEO
fullmoduleString = fullmoduleString & moduleString & vbNewLine
End If
count = count + 1
Loop
' insert the lines into the MEO
.VBComponents(Replace(moduleName.Name, ".cls", "")).CodeModule.InsertLines .VBComponents(Replace(moduleName.Name, ".cls", "")).CodeModule.CountOfLines + 1, fullmoduleString
Close #1
End If
End If
Next moduleName
End With
End Sub
Если вас смущает ввод dir в обе эти функции, это всего лишь репозиторий вашего кода! Итак, вы бы назвали эти функции так:
SaveCodeModules "C:\...\YourDirectory\Project\source\"
ImportCodeModules "C:\...\YourDirectory\Project\source\"
Небольшое примечание: мне не повезло с истинным контролем версий с помощью UserForms из-за двоичных файлов. Если вы создаете несколько веток в репозитории git, возможно, у вас не получится объединить их, если вы работаете с UserForms.
Я использую мерзавец, и сегодня я портировал это (git-xlsx-textconv) на Python, поскольку мой проект основан на коде Python и взаимодействует с файлами Excel. Это работает как минимум для файлов .xlsx, но я думаю, что это сработает и для .xls. Вот ссылка на github. Я написал две версии, одну с каждой строкой на отдельной строке, а другую, где каждая ячейка находится на отдельной строке (последняя была написана потому, что git diff не любит переносить длинные строки по умолчанию, по крайней мере, здесь, в Windows).
Это мой файл .gitconfig (это позволяет другому скрипту находиться в репозитории моего проекта):
[diff "xlsx"]
binary = true
textconv = python `git rev-parse --show-toplevel`/src/util/git-xlsx-textconv.py
если вы хотите, чтобы сценарий был доступен для множества разных репозиториев, используйте что-то вроде этого:
[diff "xlsx"]
binary = true
textconv = python C:/Python27/Scripts/git-xlsx-textconv.py
мой файл .gitattributes:
*.xlsx diff=xlsx
Позвольте мне резюмировать, что вы хотели бы использовать для контроля версий и почему:
Какие:
Почему:
Как уже писали здесь другие, есть несколько решений поверх существующих систем контроля версий, таких как:
Если вас беспокоит только код VBA в ваших книгах, то подход, предложенный Demosthenex выше, или VbaGit (https://github.com/brucemcpherson/VbaGit) работают очень хорошо и относительно просты в реализации. Преимущества заключаются в том, что вы можете положиться на хорошо зарекомендовавшие себя системы контроля версий и выбрать одну из них в соответствии с вашими потребностями (взгляните на https://help.github.com/articles/what-are-the-differences-between-svn-and-git/ для краткого сравнения Git и Subversion).
Если вы беспокоитесь не только о коде, но и о данных в ваших таблицах («жестко запрограммированные» значения и результаты формул), вы можете использовать для этого аналогичную стратегию: сериализовать содержимое ваших листов в некоторый текстовый формат (через Range.Value) и использовать существующую систему контроля версий. Вот очень хорошая запись в блоге об этом: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+spreadsheet+models+-+part+1+of+3
Однако сравнение таблиц - нетривиальная алгоритмическая проблема. Есть несколько инструментов, таких как Microsoft Spreadsheet Compare (https://support.office.com/en-us/article/Overview-of-Spreadsheet-Compare-13fafa61-62aa-451b-8674-242ce5f2c986), Exceldiff (http://exceldiff.arstdesign.com/) и DiffEngineX (https://www.florencesoft.com/compare-excel-workbooks-differences.html). Но еще одна проблема - интегрировать это сравнение с системой контроля версий, такой как Git.
Наконец, вы должны выбрать рабочий процесс, который соответствует вашим потребностям. Для простого, адаптированного рабочего процесса Git для Excel взгляните на https://www.xltrail.com/blog/git-workflow-for-excel.
Обновление 2020: проголосовало за ваше предложение xltrail.com/git-xl, расширение git с открытым исходным кодом, производящее различие исходного кода vba между коммитами, хотя и ограниченное, спасает меня от подверженного ошибкам импорта и экспорта
На самом деле существует лишь несколько решений для отслеживания и сравнения изменений в коде макросов - большинство из них уже были названы здесь. Я просматривал Интернет и наткнулся на этот новый инструмент, о котором стоит упомянуть:
XLTools Version Control для макросов VBA
Я хотел бы порекомендовать отличный инструмент с открытым исходным кодом под названием Резиновая утка, в который встроен контроль версий кода VBA. Попробуйте!
Я нашел очень простое решение этого вопроса, которое отвечает моим потребностям. Я добавляю одну строку в конец всех своих макросов, которая экспортирует файл *.txt со всем кодом макроса при каждом его запуске. Код:
ActiveWorkbook.VBProject.VBComponents("moduleName").Export"C:\Path\To\Spreadsheet\moduleName.txt"
(Найдено на Учебники Тома, где также описаны некоторые настройки, которые могут вам понадобиться, чтобы это работало.)
Поскольку я всегда запускаю макрос всякий раз, когда работаю над кодом, я гарантирую, что git подберет изменения. Единственное, что раздражает, это то, что если мне нужно проверить более раннюю версию, мне придется вручную скопировать / вставить из *.txt в электронную таблицу.
В Google Apps / Docs отсутствуют все функции MS Excel, которые необходимы для выполнения более сложных задач, таких как моделирование.