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

excel version-control

123401 просмотра

24 ответа

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

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

  1. контроль версий для модулей VBA
  2. более одного человека работает над электронной таблицей Excel, и они могут вносить изменения в тот же рабочий лист, который они хотят объединить и интегрировать. Этот рабочий лист может содержать формулы, данные, диаграммы и т. Д.
  3. пользователи не слишком технические, и чем меньше систем управления версиями, тем лучше
  4. Косвенное ограничение является соображением. В идеале сохраняются только инкрементные изменения, а не вся электронная таблица Excel.
Автор: TheObserver Источник Размещён: 17.05.2019 03:54

Ответы (24)


58 плюса

Решение

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

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

Это позволяет мне редактировать макросы в модулях через Emacs (да, emacs) или изначально в Excel и фиксировать мой репозиторий BZR после серьезных изменений. Поскольку все модули являются текстовыми файлами, стандартные команды diff-style в 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

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

Содержание представления «Рабочая книга»:

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub

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

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

Автор: Demosthenex Размещён: 05.01.2010 02:28

38 плюса

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

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

Автор: mcherm Размещён: 07.01.2010 03:52

8 плюса

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

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

Ссылка MSDN находится здесь .

Автор: Mitch Wheat Размещён: 25.09.2008 05:44

7 плюса

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

  • Обращайтесь с книгой как с любым другим приложением. Отдельная логика, конфигурация и данные.
  • Отдельный код из книги.
  • Создавайте пользовательский интерфейс программно.
  • Напишите сценарий сборки, чтобы восстановить книгу.
Автор: Hobbo Размещён: 25.09.2008 09:19

7 плюса

Позвольте мне подвести итог тому, что вы хотели бы контролировать версии, и почему:

  1. Какие:

    • Код (VBA)
    • Таблицы (формулы)
    • Таблицы (значения)
    • Графики
    • ...
  2. Зачем:

    • Журнал аудита
    • сотрудничество
    • Сравнение версий ("diffing")
    • сращивание

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

  • Гит
  • ртутный
  • диверсия
  • базар

Если ваша проблема связана только с кодом 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 + 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 for Excel ознакомьтесь с https://www.xltrail.com/blog/git-workflow-for-excel .

Автор: Bjoern Stiel Размещён: 04.04.2016 12:06

6 плюса

Работая над работой @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
Автор: przemo_li Размещён: 07.03.2014 05:25

5 плюса

Принимая ответ @Demosthenex на шаг дальше, если вы хотите также отслеживать код в своих объектах Microsoft Excel и UserForms, вам нужно немного запутаться.

Сначала я изменил свою 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. Единственное различие заключается в том, что при экспорте формы будут созданы два файла (вы получите файл a .frmи .frxфайл для каждого UserForm). Один из них содержит написанное вами программное обеспечение, а другой - двоичный файл, который (я уверен) определяет макет формы.

Объекты Microsoft Excel (MEOs) (значение 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\"
Автор: dslosky Размещён: 08.05.2015 03:37

4 плюса

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

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. Это сделало бы это. Я даже подумываю сделать это сам :)

Автор: GUI Junkie Размещён: 25.09.2008 08:16

3 плюса

Я использую git , и сегодня я портировал это (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
Автор: nmz787 Размещён: 16.05.2015 08:02

2 плюса

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

Автор: mattlant Размещён: 25.09.2008 05:55

1 плюс

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

Автор: Dheer Размещён: 25.09.2008 05:44

1 плюс

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

Автор: SpyJournal Размещён: 29.09.2008 04:16

1 плюс

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

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

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

Автор: Marisa Poulian Размещён: 04.01.2012 02:33

1 плюс

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

Вот ключ:

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

Автор: Jim Slavens Размещён: 27.10.2010 10:35

1 плюс

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

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

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

Автор: CodeKid Размещён: 12.10.2014 12:50

1 плюс

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

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

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

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

Автор: eriklind Размещён: 12.04.2016 05:00

1 плюс

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

Автор: Yuxiang Wang Размещён: 09.08.2016 07:08

0 плюса

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

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

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

Когда вы повторите это со следующей версией электронной таблицы, вам нужно будет убедиться, что файлы папки точно совпадают с файлами в zip-контейнере (и не оставляйте удаленные файлы позади).

Автор: Dave Saunders Размещён: 06.07.2012 06:48

0 плюса

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

Beyond Compare - сравнение двух файлов excel (китайский)
Исходный источник изображения

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

Автор: mana Размещён: 04.01.2012 02:46

0 плюса

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

Автор: Chad Knudson Размещён: 07.01.2016 05:21

0 плюса

Вот проект GitHub, который решает только пункты 1. и 4. вопроса OP: https://github.com/ColmBhandal/VbaMisc . Это VC-решение только для модулей VBA. Он может быть легко адаптирован к любому проекту путем репликации структуры проекта, видимой в GitHub, и добавления любых модулей, которые должны быть помещены под VC в белый список, определенный в модуле ExportImport. Этот модуль контролирует экспорт и импорт белого списка модулей VBA, потенциально включающий сам себя. См. Репозиторий GitHub для получения инструкций по использованию.

Автор: Colm Bhandal Размещён: 05.11.2018 07:24

-1 плюса

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

Автор: Ian Hopkinson Размещён: 25.09.2008 05:45

-1 плюса

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

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

Автор: Grey Panther Размещён: 25.09.2008 05:52

-1 плюса

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

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

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

Контрольная таблица с контролируемым контролем

Автор: Nate Размещён: 05.01.2012 06:36
Вопросы из категории :
32x32