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

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

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

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

В Google Apps / Docs отсутствуют все функции MS Excel, которые необходимы для выполнения более сложных задач, таких как моделирование.

TheObserver 18.01.2010 04:33

@ Ричи Коттон. Если бы это был практический вариант (например, использование Matlab / python), то ВСЕ финансовые компании к настоящему времени изменились бы. Просить людей, которые анализируют финансовые модели, но не являются программистами, быть программистами, в целом чревато опасностями и на самом деле непрактично.

Anonymous Type 07.06.2011 05:51
stackoverflow.com/q/608872/107537 see similar question here. But it doesn't address the worksheets themselves. Only the VBA code.
Vijay 12.03.2013 15:42

Те, кто обвиняет моделирование Excel в кредитном кризисе, скорее всего, являются мошенниками, намеренно продававшими барахло как AAA. Вам не нужна электронная таблица, чтобы сказать, что вложения - дерьмо. Как финансовый специалист, я могу сказать вам, что полная зависимость от любой модели - верный способ потерять свою задницу. Кроме того, любые модели настолько хороши, насколько хороши люди, которые их построили. Если вы наймете Мортса, чтобы тот выполнял работу Эйнштейна, у вас будут плохие времена.

Eric J 16.07.2013 00:51

Если вас больше всего интересует управление версиями макросов VBA, см. Мой ответ здесь: stackoverflow.com/a/38297505/2146688

Chel 11.07.2016 03:10

Если вас просто интересует часть VBA VCS, то релевантен связанный с Chel поток, как и этот поток по управлению VBA через Git: stackoverflow.com/questions/36024342/…

Colm Bhandal 08.04.2020 12:11
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
176
6
153 779
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

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

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

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

Ссылка MSDN - здесь.

Один из наиболее охраняемых секретов - я не знал, что VSS может это сделать. +1

ConcernedOfTunbridgeWells 25.09.2008 12:00

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

GUI Junkie 25.09.2008 12:18

Я был очень взволнован и потратил час на поиск этого в сети, но похоже, что MS перестала поддерживать его в Excel 2003. Возможно, вам повезет, если вы работаете с Access VBA, но я не смотрел.

harvest316 31.05.2011 06:27

вы могли бы использовать надстройку Office для разработчиков ?: brandon.fuller.name/archives/2003/11/07/10.26.30

Mitch Wheat 31.05.2011 09:24

Это зависит от того, какой уровень интеграции вы хотите, я использовал 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, но в равной степени ваш код эквивалентен.

polyglot 03.10.2009 16:44

Я попытался изменить это для работы с Microsoft® Excel® для Mac 2011 версии 14.4.1. Строка, которая вызывает метод Export, ничего не делает (независимо от того, какие правильно сформированные каталоги OS X я использовал).

D A Vincent 21.05.2014 07:12

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

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

Зачем повторять всю эту ерунду, когда все, что вам нужно, это система управления версиями, которая обрабатывает двоичные объекты? SVN может это сделать.

Unknown Coder 14.02.2014 04:03

Потому что вы не можете объединять бинарные объекты

igelineau 14.05.2014 17:47

в ответ на ответ 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 для модуля документа (книги или листа).

Jon Crowell 10.08.2012 22:29

Ошибка в коде импорта. Поскольку вы удаляете и импортируете модули, он меняет порядок модулей, поэтому каждый раз вам не хватает нескольких. Вам нужно изменить цикл For, чтобы перемещаться по массиву в обратном направлении. например Для i = .VBComponents.Count To 1 Step -1

Tmdean 01.12.2012 02:13

Я вижу, что он может изменить порядок макросов, почему он потеряет один?

Demosthenex 01.12.2012 07:47

Допустим, у вас есть модули a, b и c: первый проход цикла удаляет a и воссоздает его, теперь порядок модулей - b, c, a. Второй проход цикла удаляет c и воссоздает его, теперь порядок b, a, c. Третий проход цикла снова удаляет c и воссоздает его, и цикл завершается. Он пропустил b.

Tmdean 07.12.2012 10:09

Я попробовал этот макрос, и мой антивирус (Symantec 12.1) определил его как BloodHound.ExcelMacro. Чтобы этого избежать, мне пришлось изменить несколько строк кода.

igelineau 14.05.2014 21:52

В Excel 2013 необходимо включить «Доверять доступ к объектной модели проекта VBA» в Центре управления безопасностью, иначе вы получите очень бесполезную ошибку 1004, если попытаетесь запустить этот код.

Robin Green 18.06.2014 19:36

Этот сценарий выше далек от совершенства. Подпрограмма importCodeModules () содержит ошибки и производит повторяющиеся модули. Более того, вам нужно будет отредактировать каждую книгу, чтобы добавить события open и before_save. Это неприемлемо. После долгого поиска в сети я наконец нашел что-то, что действительно работает (что относится к здесь). Он имеет импорт, экспорт кода, форматирование кода и многое другое. Экспорт происходит автоматически при сохранении, и нет необходимости редактировать существующие книги.

CodeKid 12.10.2014 04:38

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

Demosthenex 12.10.2014 12:33

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

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

Так удивительно знать, что TortoiseSVN можно сравнить как встроенную функцию ^^

Nam G VU 05.07.2012 09:44

То же самое и с файлом Word?

Nam G VU 05.07.2012 09:48

Я только что протестировал - это также доступно для файла Word. Круто ^^

Nam G VU 05.07.2012 09:53

Похоже, это не работает для кода VB. Любое решение для этого?

manpreet singh 02.09.2015 10:41

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

Вот подсказка:

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

TFS активно использует Excel в отчетах по рабочим элементам, к сожалению, это не связано с получением файлов Excel в системе управления версиями.

Brad R 14.04.2011 08:19

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

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

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

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

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

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

Таблица с контролем оборотов

Возможно, вы пробовали использовать Microsoft Excel XML в 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-контейнере (и не оставляют никаких удаленных файлов).

Однако такой подход сопряжен с риском. Если впоследствии вы будете использовать функцию в Excel, которая либо не реализована в Libre, либо не «отображается» на Libre и обратно правильно, этот подход не работает. Я уверен, что это сработает для простых таблиц, но нужно проявлять особую осторожность. PW

Phil Whittington 21.03.2013 18:44

Работая над работой @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.

dslosky 16.12.2015 20:16

Я использую мерзавец, и сегодня я портировал это (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

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

  1. Какие:

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

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

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

  • Git
  • Mercurial
  • Subversion
  • Базар

Если вас беспокоит только код 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 между коммитами, хотя и ограниченное, спасает меня от подверженного ошибкам импорта и экспорта

chingNotCHing 10.01.2020 06:24

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

XLTools Version Control для макросов VBA

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

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

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

Я нашел очень простое решение этого вопроса, которое отвечает моим потребностям. Я добавляю одну строку в конец всех своих макросов, которая экспортирует файл *.txt со всем кодом макроса при каждом его запуске. Код:

ActiveWorkbook.VBProject.VBComponents("moduleName").Export"C:\Path\To\Spreadsheet\moduleName.txt"

(Найдено на Учебники Тома, где также описаны некоторые настройки, которые могут вам понадобиться, чтобы это работало.)

Поскольку я всегда запускаю макрос всякий раз, когда работаю над кодом, я гарантирую, что git подберет изменения. Единственное, что раздражает, это то, что если мне нужно проверить более раннюю версию, мне придется вручную скопировать / вставить из *.txt в электронную таблицу.

Другие вопросы по теме