Лучший способ сделать контроль версий для MS Excel

какие системы контроля версий вы использовали С MS Excel (2003/2007)? Что бы вы порекомендовали и почему? Какие ограничения вы нашли с вашей системой управления версиями с самым высоким рейтингом?

чтобы поставить это в перспективе, вот несколько вариантов использования:

  1. контроль версий для модулей VBA
  2. несколько человек работают над электронной таблицей Excel, и они могут вносить изменения в один и тот же рабочий лист, который они хотят объединить и интегрировать. Этот лист может иметь формулы, данные, графики и т. д.
  3. пользователи не слишком технические и чем меньше систем контроля версий используется, тем лучше
  4. ограничение пространства является соображением. В идеале сохраняются только инкрементные изменения, а не вся электронная таблица Excel.

23 ответов


Я только что настроил таблицу, которая использует Bazaar, с ручной проверкой / выходом через TortiseBZR. Учитывая, что тема помогла мне с частью сохранения, я хотел опубликовать свое решение здесь.

решением для меня было создать электронную таблицу, которая экспортирует все модули при сохранении, а также удаляет и повторно импортирует модули при открытии. Да, это может быть потенциально опасно для преобразования существующих таблиц.

Это позволяет мне редактировать макросы в модули через Emacs (да, emacs) или изначально в Excel и зафиксируйте мой репозиторий BZR после основных изменений. Поскольку все модули являются текстовыми файлами, стандартные команды в стиле diff в BZR работают для моих источников, кроме самого файла Excel.

Я настроил каталог для моего репозитория BZR, X:\Data\MySheet - ... В репо MySheet.XLS и один .файл vba для каждого из моих модулей (т. е. Module1Macros). В моей электронной таблице я добавил один модуль, который освобожден от цикла экспорта/импорта, называемого "VersionControl". Каждый модуль для экспорта и повторного импорта должен заканчиваться на "макросы".

содержимое модуля "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

затем мы должны настроить крючки событий для open / save для запуска этих макросов. В средстве просмотра кода щелкните правой кнопкой мыши " ThisWorkbook "и выберите"Просмотреть код". Возможно, вам придется потянуть вниз поле выбора в верхней части окна кода, чтобы перейти от представления" (Общие) "к представлению" книга".

содержание Вид "рабочая книга":

Private Sub Workbook_Open()

ImportCodeModules

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

SaveCodeModules

End Sub

Я буду устраиваться в этом рабочем процессе в течение следующих нескольких недель, и я опубликую, если у меня возникнут проблемы.

Спасибо, что поделились кодом VBComponent!


в TortoiseSVN является удивительно хорошим клиентом Windows для системы управления версиями Subversion. Одна из особенностей, которую я только что обнаружил, заключается в том, что когда вы нажимаете, чтобы получить разницу между версиями файла Excel, он откроет обе версии в Excel и выделит (красным цветом) ячейки, которые были изменены. Это делается с помощью магии скрипта vbs, описанного здесь.

вы можете найти это полезным, даже если не используете TortoiseSVN.


Это зависит от того, говорите ли вы о данных, или код, содержащийся в электронной таблице. Хотя я сильно не люблю Microsoft Visual Sourcesafe и обычно не рекомендовал бы его, он легко интегрируется как с Access, так и с Excel и обеспечивает управление версиями модулей.

[фактически интеграция с Access включает запросы, отчеты и модули как отдельные объекты, которые могут быть версионными]

ссылка MSDN является здесь.


Я не знаю инструмента, который делает это хорошо, но я видел множество доморощенных решений. Общий поток этих уменьшить бинарные данные под управлением версии и увеличить текстовые данные для того чтобы использовать силу обычных систем scc. Для этого:

  • рассматривайте книгу как любое другое приложение. Отдельная логика, конфигурация и данные.
  • отдельный код из книги.
  • создайте пользовательский интерфейс программно.
  • написать a построить сценарий для восстановления книги.

позвольте мне обобщить то, что вы хотели бы для контроля версий и почему:

  1. Что:

    • (VBA) код
    • Электронные Таблицы (Формулы)
    • Электронные Таблицы (Значения)
    • графика
    • ...
  2. Почему:

    • журнал аудита
    • сотрудничество
    • сравнение версий ("сравнения")
    • слияние

Как уже писали здесь, есть несколько решений поверх существующих систем контроля версий, таких как:

  • Git
  • ртутный
  • в Subversion
  • базар

Если ваша единственная забота-код VBA в ваших книгах, то подход Demosthenex выше предлагает или VbaGit (https://github.com/brucemcpherson/VbaGit) работа очень хорошо работает и относительно проста в реализации. Преимущества в том, что вы можете положиться на хорошо проверенные системы управления версиями и выбрать один в соответствии с вашими потребностями (посмотрите наhttps://help.github.com/articles/what-are-the-differences-between-svn-and-git/ для краткого сравнения между Git и Subversion).

Если вы не только беспокоитесь о коде, но и о данных в ваших листах ("жестко закодированные" значения и результаты формул), вы можете использовать аналогичный стратегия для этого: сериализовать содержимое ваших листов в некоторый текстовый формат(через диапазон.Value) и использовать существующую систему управления версиями. Вот очень хороший пост в блоге об этом: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+spreadsheet+models+-+part+1+of+3

однако сравнение электронных таблиц является нетривиальной алгоритмической проблемой. Существует несколько инструментов, таких как сравнение электронных таблиц Microsoft (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.


работа над @Demosthenex work, @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

а затем в модуле рабочей книги:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    SaveCodeModules

End Sub

принимая ответ @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

UserForms можно экспортировать и импортировать так же, как код VBA. Единственное отличие заключается в том, что при экспорте формы будут созданы два файла (вы получите .frm и .frx файл для каждой пользовательской формы). Одна из них содержит программное обеспечение, вы написали, а другой двоичный файл, который (я уверен) определяет структуру формы.

объекты Microsoft Excel (MEOs) (значение Sheet1, Sheet2, ThisWorkbook etc) можно экспортировать как . Однако, если вы хотите вернуть этот код в свою книгу, если вы попытаетесь импортировать его так же, как и модуль 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\"

одна вещь, которую вы могли бы сделать, это иметь следующий фрагмент в вашей книге:

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. Этого достаточно. Я даже думаю сделать это сам:)


Я использую git и сегодня я портировал это (git-xlsx-textconv) на Python, так как мой проект основан на коде Python и взаимодействует с файлами Excel. Это работает, по крайней мере .XLSX-файл файлы, но я думаю, что это будет работать для .в XLS тоже. здесь ссылка github. Я написал две версии, одну с каждой строкой на своей линии, а другую, где каждая ячейка находится на своей линии (последняя была написана потому, что git diff не любит переносить длинные строки по умолчанию, по крайней мере, на Windows).

Это мой .gitconfig хранит настройки файл (это позволяет сценарию differ находиться в репо моего проекта):

[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

Если вы ищете параметр office с обычными office нетехнических пользователей, чем Sharepoint является жизнеспособной альтернативой. Вы можете настроить папки документов с включенным управлением версиями и проверками и проверками. Делает его freindlier для обычных пользователей office.


используйте любой из стандартных инструментов контроля версий, таких как SVN или CVS. Ограничения будут зависеть от цели. Помимо небольшого увеличения размера репозитория, я не столкнулся с какими-либо проблемами


в ответ на ответ маттланта - sharepoint будет хорошо работать как контроль версий, только если функция контроля версий включена в библиотеке документов. кроме того, имейте в виду, что любой код, который вызывает другие файлы по относительным путям, не будет работать. и, наконец, любые ссылки на внешние файлы будут нарушены при сохранении файла в sharepoint.


вы должны попробовать DiffEngineX. Его можно вызвать программно, а также из командной строки, принимая аргументы командной строки. Он сравнивает не только ячейки электронных таблиц Excel, но и макросы Visual Basic, встроенные в книги. Также сравнивает определенные Excel имена и комментарии, которые многие бесплатные инструменты пропускают. Его можно скачать с

http://www.florencesoft.com/excel-differences-download.html

Я уверен, что Ваш контроль версий система имеет опцию или поле, чтобы вы могли автоматически вызывать DiffEngineX с оригинальными и измененными книгами Excel.


Я тоже этим занимался. Это обезьяна, что последняя Team Foundation Server 2010 может иметь надстройку Excel.

подсказка:

http://team-foundation-server.blogspot.com/2009/07/tf84037-there-was-problem-initializing.html


после поиска возрастов и опробования многих различных инструментов я нашел ответ на проблему управления версиями vba здесь:https://stackoverflow.com/a/25984759/2780179

Это простой Excel addin, для которого код можно найти здесь

после импорта дубликатов модулей нет. Он автоматически экспортирует ваш код, как только вы сохраните свою книгу,без изменения существующих книг. Речь идет вместе с форматером кода vba.


на самом деле есть только несколько решений, чтобы отслеживать и сравнивать изменения в код макроса - большинство из них были уже здесь. Я просматривал интернет и наткнулся на этот новый инструмент, который стоит упомянуть:

управление версиями XLTools для макросов VBA

  • контроль версий для листов Excel и модулей VBA
  • предварительный просмотр и diff изменения перед фиксацией версии
  • отлично подходит для совместной работы нескольких пользователей на тот же файл (трек, который изменил что/когда/комментарии)
  • сравнить версии и выделить изменения в коде строка за строкой
  • подходит для пользователей, которые не являются tech-savvy, или Excel-savvy, если на то пошло
  • история версий хранится в Git-репозитории на вашем собственном ПК-любая версия может быть легко восстановлена

версии кода VBA бок о бок, изменения визуализируются


Я хотел бы порекомендовать отличный инструмент с открытым исходным кодом под названием Rubberduck который имеет контроль версий встроенного кода VBA. Попробуй!


возможно, вы пытались использовать Microsoft Excel XML в zip-контейнере (.xlsx и .xslm) для контроля версий и обнаружил, что vba был сохранен в vbaProject.bin (который бесполезен для управления версиями).

решение простое.

  1. откройте файл excel с помощью LibreOffice Calc
  2. В LibreOffice Calc
    1. Сохранить как
    2. Сохранить как тип: электронная таблица ODF (.ods)
  3. закрыть В LibreOffice Calc В
  4. переименуйте расширение файла нового файла .ods to .zip
  5. создайте папку для электронной таблицы в поддерживаемой git области
  6. извлеките zip в папку GIT
  7. коммит в Git
  8. когда вы повторите это со следующей версией электронной таблицы, вам нужно будет убедиться, что файлы папки точно соответствуют файлам в контейнере zip (и не оставляйте никаких удаленных файлов).


    существует также программа под названием Beyond Compare у этого есть довольно хороший файл Excel compare. Я нашел скриншот на китайском языке, который кратко выглядит так:

    Beyond Compare - comparing two excel files (Chinese)
    исходный источник изображения

    существует 30-дневная пробная версия на их страница


    моя компания делает значительный объем работы по автоматизации решений Microsoft Office, поэтому я написал .DLL, которая будет экспортировать источник решения при каждом сохранении шаблона. Он создает папку с именем Source в качестве дочернего элемента папки, в которой сохраняется шаблон, а под Source создает папку с тем же именем, что и проект VBA. В папке проекта экспортируется весь исходный код модулей, классов и форм пользователя. Это расположение было выбрано для того чтобы сделать его легким управление источником для больших коллекций шаблонов. DLL может разблокировать заблокированные проекты, чтобы получить доступ к проекту VBA, если у вас есть локальный файл конфигурации или файл глобальной конфигурации. С помощью этого инструмента разработчики могут работать над шаблонами для своего содержимого сердца и использовать свой любимый инструмент контроля версий для управления своей работой. Мы используем Git в основном в нашей среде, и мы сохраняем полные бинарные файлы шаблонов, а также ресурсы VBA под редакцией управление.


    Это зависит от того, какой уровень интеграции вы хотите, я использовал Subversion/TortoiseSVN, который кажется прекрасным для простого использования. Я также добавил ключевые слова, но, похоже, существует риск повреждения файлов. В Subversion есть опция сделать замены ключевых слов фиксированной длиной, и, насколько я понимаю, она будет работать, если фиксированная длина четная, но не нечетная. В любом случае вы не получаете никакой полезной функциональности diff, я думаю, что есть коммерческие продукты, которые будут делать "diff". Я сделал найдите что-то, что сделало diff, основанное на преобразовании материала в обычный текст и сравнении этого, но это было не очень приятно.


    Он должен работать с большинством VCS (в зависимости от других критериев вы можете выбрать SVN, CVS, Darcs, TFS и т. д.), Однако на самом деле это будет полный файл (потому что это двоичный формат), что означает, что вопрос "Что изменилось" не так легко ответить.

    вы все еще можете положиться на сообщения журнала Если люди завершают их, но вы также можете попробовать новые форматы на основе XML из Office 2007, чтобы получить дополнительную видимость (хотя по-прежнему было бы трудно прополоть тонны XML, плюс AFAIK XML-файл застегивается на диске,поэтому вам понадобится крюк предварительной фиксации, чтобы распаковать его для правильной работы текста).


    Я написал электронную таблицу, контролируемую ревизией, используя VBA. Он больше ориентирован на инженерные отчеты, где у вас есть несколько человек, работающих над документом или графиком, а затем в какой-то момент времени вы хотите создать ревизию моментального снимка, которая показывает добавления, del и обновления из предыдущего REV.

    Примечание: это книга с поддержкой макросов, которую вам нужно войти в систему, чтобы загрузить с моего сайта (Вы можете использовать OpenID)

    весь код разблокирован.

    Rev Контролируемая Электронная Таблица