Melhor maneira de fazer o Controle de Versão para o MS Excel

que Sistemas de controlo de versões usou com o MS Excel (2003/2007)? O que recomendaria e porquê? Que limitações você encontrou com o seu sistema de controle de versão de alta classificação?

para colocar isto em perspectiva, aqui estão alguns casos de uso:

  1. controlo de versões para módulos VBA
  2. mais de uma pessoa está trabalhando em uma planilha do Excel e eles podem estar fazendo mudanças na mesma planilha, que eles querem mesclar e integrar. Este documento de trabalho pode ter fórmulas, dados, gráficos etc
  3. os utilizadores não são muito técnicos e quanto menos Sistemas de controlo de versões forem utilizados, melhor
  4. a restrição de espaço é uma consideração. Idealmente, apenas as alterações incrementais são salvas em vez de toda a planilha do Excel.
Author: jeroenh, 2008-09-25

23 answers

Acabei de configurar uma folha de cálculo que usa Bazar, com verificação manual via TortiseBZR. Dado que o tópico me ajudou com a parte de salvar, eu queria postar minha solução aqui.

a solução para mim foi criar uma planilha que exporta todos os módulos no save, e remove e re-importa os módulos no open. Sim, isto pode ser potencialmente perigoso para a conversão de planilhas existentes.

Isto permite-me editar as macros nos Módulos via Emacs (sim, emacs) ou nativamente no Excel, e enviar o meu repositório BZR após grandes alterações. Como todos os módulos são Arquivos de texto, os comandos padrão de estilo diff no BZR funcionam para minhas fontes, exceto o arquivo Excel em si.

Configurei uma pasta para o meu repositório BZR, X:\Data\MySheet. No repo estão MySheet.xls e um .ficheiro vba para cada um dos meus módulos (ie: Module1Macros). Na minha folha de cálculo, adicionei um módulo que está isento do ciclo de exportação / importação chamado "VersionControl". Cada módulo a exportar e a reimportar deve terminar em"Macros".

Conteúdo do módulo "controlo de Versão":

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
A seguir, temos de configurar os ganchos de eventos para abrir / gravar para executar estas macros. No visualizador de código, clique com o botão direito em " ThisWorkbook "e selecione"View Code". Você pode ter que puxar para baixo a caixa de seleção no topo da janela de código para mudar de "(Geral)" vista para "Workbook" Vista.

Conteúdo do "manual" ver:

Private Sub Workbook_Open()

ImportCodeModules

End Sub

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

SaveCodeModules

End Sub
Vou instalar-me neste fluxo de trabalho nas próximas semanas, e vou postar se tiver algum problema. Obrigado por partilhares o código VBComponent!
 58
Author: Demosthenex, 2013-09-23 21:11:57

TortoiseSVN é um surpreendentemente bom cliente Windows para o sistema de controle de versões Subversion. Uma característica que eu acabei de descobrir que tem é que quando você clicar para obter uma diferença entre as versões de um arquivo Excel, ele vai abrir ambas as versões no Excel e destacar (em Vermelho) as células que foram alteradas. Isto é feito através da magia de um script vbs, descrito aqui.

Você pode achar isto útil mesmo que não use TortoiseSVN.

 38
Author: mcherm, 2010-01-07 15:52:46

Depende se está a falar de dados, ou do código contido numa folha de cálculo. Embora eu tenha uma forte antipatia com o Visual Sourcesafe da Microsoft e normalmente não o recomendaria, ele se integra facilmente com acesso e Excel, e fornece o controle de fonte de módulos.

[de facto, a integração com o acesso, inclui consultas, relatórios e módulos como objectos individuais que podem ser versionados]

A ligação MSDN está aqui .

 8
Author: Mitch Wheat, 2008-09-25 05:44:58
Não estou ciente de uma ferramenta que faça isto bem, mas já vi uma variedade de soluções caseiras. O fio comum é minimizar os dados binários sob controle de versão e maximizar os dados textuais para alavancar o poder dos sistemas SCC convencionais. Para fazer isso:
  • trata o livro como qualquer outra aplicação. Lógica separada, configuração e dados.
  • Código separado do manual.
  • construir a IU programaticamente.
  • escrever um programa de compilação para reconstrua o manual.
 7
Author: Hobbo, 2008-09-25 09:19:09
Deixe-me resumir o que gostaria de controlar a versão e porquê:
  1. O que:

    • código (VBA)
    • Folhas De Cálculo (Fórmulas)
    • Planilhas (Valores)
    • Gráficos
    • ...
  2. Porquê:

    • registo de auditoria
    • colaboração
    • comparação de versões ("diffing")
    • fusão
Como outros postaram aqui, há algumas soluções em cima da versão existente sistemas de controlo tais como:
  • Git
  • Mercurial
  • Subversion
  • Bazaar

Se a sua única preocupação é o código VBA nos seus livros de trabalho, então a abordagem Demosthenex acima propõe ou VbaGit (https://github.com/brucemcpherson/VbaGit trabalhar muito bem e são relativamente simples de implementar. As vantagens são que você pode confiar em sistemas de controle de Versão bem comprovados e escolher um de acordo com suas necessidades (dê uma olhada https://help.github.com/articles/what-are-the-differences-between-svn-and-git/ para uma breve comparação entre o Git e o Subversion).

Se não só se preocupa com o código, mas também com os dados nas suas folhas (valores"hardcoded" e resultados de fórmulas), pode usar uma estratégia semelhante para isso: serializar o conteúdo das suas folhas em algum formato de texto (via Range.Value) e usar um sistema de controle de versão existente. Aqui está um post muito bom blog sobre isso: https://wiki.ucl.ac.uk/display/~ucftpw2/2013/10/18/Using+git+for+version+control+of+spreadsheet+models+-+part+1+of+3

No entanto, a comparação de planilhas é um problema algorítmico não trivial. Existem algumas ferramentas, como o Microsoft Planilha Comparar (https://support.office.com/en-us/article/Overview-of-Spreadsheet-Compare-13fafa61-62aa-451b-8674-242ce5f2c986), Exceldiff (http://exceldiff.arstdesign.com/) e DiffEngineX ([62]} https://www.florencesoft.com/compare-excel-workbooks-differences.html mas é outro desafio integrar estas comparações com um sistema de controlo de versões como o Git.

Finalmente, tens de te fixar num fluxo de trabalho que se adapte às tuas necessidades. Para um Git simples e adaptado para o fluxo de trabalho do Excel, dê uma olhada em https://www.xltrail.com/blog/git-workflow-for-excel.
 6
Author: Bjoern Stiel, 2017-11-21 07:04:16

Trabalhando em @Demosthenex trabalho, @Tmdean e @Jon Crowell comentários inestimáveis! (+1 Eles)

Gravo ficheiros de módulos no git\ dir ao lado da localização do livro de trabalho. Muda isso para o teu gosto.

Isto não irá acompanhar as alterações ao Código do Livro de trabalho. Por isso, cabe-te a ti sincronizá-los.

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

E depois no Módulo de manual:

Private Sub Workbook_Open()

    ImportCodeModules

End Sub

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

    SaveCodeModules

End Sub
 5
Author: przemo_li, 2015-07-01 11:13:53

Levando a resposta do @Demosthenex um passo mais longe, se você também gostaria de manter o controle do código em seus objetos do Microsoft Excel e UserForms você tem que ficar um pouco complicado.

Primeiro alterei a minha função SaveCodeModules() para explicar os diferentes tipos de código que pretendo exportar:

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

As formas de Utilização podem ser exportadas e importadas tal como o código VBA. A única diferença é que dois arquivos serão criados quando um formulário é exportado (você terá um arquivo .frm e um .frx para cada UserForm). Um destes contém o software que você escreveu e o outro é um arquivo binário que (tenho certeza) define o layout do formulário.

Microsoft Excel Objects (meos) (significando Sheet1, Sheet2, ThisWorkbook etc) pode ser exportado como um arquivo .cls. No entanto, quando você quiser obter este código de volta para o seu livro de trabalho, se você tentar importá-lo da mesma forma que você faria um módulo VBA, você vai obter um erro se essa folha já existe no livro de trabalho.

Para contornar isto. questão, eu decidi não tentar importar o .cls file into Excel, but to read the .cls file into excel as a string instead, then paste string into the empty MEO. Aqui está o meu código de importação:
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

No caso de você estar confuso com a entrada dir para ambas as funções, isso é apenas o seu repositório de código! Então, você chamaria essas funções como:

SaveCodeModules "C:\...\YourDirectory\Project\source\"
ImportCodeModules "C:\...\YourDirectory\Project\source\"
 5
Author: dslosky, 2015-07-01 11:37:59

Uma coisa que se pode fazer é ter o seguinte trecho no seu livro de trabalho:

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
Encontrei este trecho na Internet.

Depois, pode usar o Subversion para manter o controlo de versões. Por exemplo, usando a interface da linha de comandos do Subversion com o comando 'shell' dentro do VBA. Isso bastava. Até estou a pensar fazer isto sozinho.

 4
Author: GUI Junkie, 2012-08-10 18:41:24

Eu uso o git , e hoje eu portei isto (git-xlsx-textconv) para o Python, uma vez que o meu projecto é baseado no código Python, e interage com os ficheiros Excel. Isto funciona pelo menos para .arquivos xlsx, mas acho que vai funcionar para .xls também. Aqui está a ligação github. Eu escrevi duas versões, uma com cada linha em sua própria linha, e outra onde cada célula está em sua própria linha (a última foi escrita porque git diff não gosta de embrulhar linhas longas por por omissão, pelo menos aqui no Windows).

Este é o meu.ficheiro gitconfig (isto permite que o programa diferente resida no repo do meu projecto):
[diff "xlsx"]
    binary = true
    textconv = python `git rev-parse --show-toplevel`/src/util/git-xlsx-textconv.py

Se quiser que o script esteja disponível para muitos repos diferentes, então use algo assim:

[diff "xlsx"]
    binary = true
    textconv = python C:/Python27/Scripts/git-xlsx-textconv.py

O Meu .GITATTRIBUTES ficheiro:

*.xlsx diff=xlsx
 3
Author: nmz787, 2015-05-16 08:02:48

Se estiver a olhar para um ambiente de escritório com utilizadores regulares não técnicos de escritório, O Sharepoint é uma alternativa viável. Você pode configurar pastas de documentos com o controle de versão ativado e checkins e checkouts. Torna-o mais freindlier para utilizadores de escritório regulares.

 2
Author: mattlant, 2008-09-25 05:55:35

Utilize qualquer uma das ferramentas padrão de controlo de versões, como o SVN ou o CVS. As limitações dependeriam do objectivo. Além de um pequeno aumento no tamanho do repositório, eu não enfrentei nenhum problema

 1
Author: Dheer, 2008-09-25 05:44:40

Em resposta ao sharepoint de Resposta da mattlant só funcionará bem como um controlo de versões se a funcionalidade de controlo de versões estiver ligada na biblioteca de documentos. além disso, esteja ciente de que qualquer código que chama outros arquivos por caminhos relativos não vai funcionar. e, finalmente, quaisquer links para arquivos externos irão quebrar quando um arquivo é salvo no sharepoint.

 1
Author: SpyJournal, 2008-09-29 04:16:55
Devias tentar DiffEngineX. Pode ser chamado programaticamente e também a partir da linha de comando tomando argumentos da linha de comando. Ele não só compara as células de planilhas do Excel, mas também as macros básicas visuais incorporadas nos workbooks. Também compara nomes definidos e comentários do Excel, que muitas ferramentas de freeware perdem. Pode ser baixado de

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

Tenho a certeza que o seu sistema de controlo de versões tem um opção ou caixa para que possa ligar automaticamente para o DiffEngineX com os seus livros originais e modificados do Excel.
 1
Author: Marisa Poulian, 2012-01-04 14:33:38
Também estive a investigar isto. Parece que o mais recente servidor da Fundação Team 2010 pode ter um Add-In do Excel. Aqui está uma pista:

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

 1
Author: Jim Slavens, 2013-03-20 13:43:46

Depois de procurar por idades e experimentar muitas ferramentas diferentes, encontrei a minha resposta para o problema do controlo de versões VBA aqui: https://stackoverflow.com/a/25984759/2780179

É uma adição excel simples para a qual o código pode ser encontrado aqui

Não existem módulos duplicados após a importação. Ele exporta seu código automaticamente, assim que você salvar seu livro de trabalho, sem modificar qualquer workbooks existentes. Vem junto com um código vba formatação.

 1
Author: CodeKid, 2017-05-23 12:17:43

Na verdade, há apenas um punhado de soluções para rastrear e comparar mudanças no código macro - a maioria deles já foram nomeados aqui. Tenho navegado pela web e encontrei esta nova ferramenta que vale a pena mencionar:

Controlo de versões XLTools para macros VBA

  • Controlo de versões para folhas de Excel e módulos VBA
  • antevisão e diferenças antes de cometer uma versão
  • Muito bom para o trabalho colaborativo de vários usuários no mesmo arquivo (faixa que mudou o que/quando / Comentários)
  • Comparar as versões e realçar as alterações no código Linha-A-Linha
  • adequado para utilizadores que não são conhecedores de tecnologia, ou conhecedores de Excel, já agora
  • o histórico da versão é armazenado no repositório Git no seu próprio PC-qualquer versão pode ser facilmente recuperada

Versões de código VBA lado a lado, as alterações são visualizadas

 1
Author: eriklind, 2016-04-12 17:00:40

Gostaria de recomendar uma grande ferramenta de código aberto chamada Rubberduck que tem o controlo de versões do código VBA incorporado. Experimenta!

 1
Author: Yuxiang Wang, 2016-08-09 19:08:15

Pode ter tentado usar o XML do Excel da Microsoft no contentor zip (.xlsx and .xslm) para controle de versão e descobriu que o vba foi armazenado no vbaProject.bin (que é inútil para o controle de versão).

A solução é simples.

  1. Abra o ficheiro excel com o LibreOffice Calc
  2. In LibreOffice Calc
    1. ficheiro
    2. gravar como
    3. gravar como tipo: folha de cálculo ODF (.ods)
  3. Fechar LibreOffice Calc
  4. mudar o nome do novo ficheiro extensão de arquivo de .ods para .zip
  5. crie uma pasta para a folha de cálculo numa área mantida pelo GIT
  6. extrair o fecho para dentro da pasta git
  7. comprometa - se com o GIT

Quando repetir isto com a próxima versão da folha de cálculo, terá de se certificar de que os ficheiros da pasta correspondem exactamente aos do contentor zip (e não deixe nenhuns ficheiros apagados para trás).

 0
Author: Dave Saunders, 2012-07-06 06:48:22

Existe também um programa chamado Beyond Compare que tem um arquivo Excel bastante bom comparar. Encontrei uma imagem em chinês que mostra brevemente isto:

Beyond Compare - comparing two excel files (Chinese)
Origem da imagem Original

Há um julgamento de 30 dias na sua página.
 0
Author: mana, 2015-07-01 11:32:54
A minha empresa trabalha bastante na automatização das soluções do Microsoft Office, por isso escrevi um .DLL que irá exportar a fonte de uma solução cada vez que um modelo é salvo. Cria uma pasta chamada Source como um filho da pasta onde o modelo é gravado, e por baixo da fonte cria uma pasta com o mesmo nome que o projecto VBA. Na pasta de projeto exporta todo o código fonte para módulos, classes e formulários de usuário. Este Acordo foi escolhido para facilitar a gerir a fonte para grandes colecções de modelos. O DLL é capaz de desbloquear projetos bloqueados para obter acesso ao projeto VBA se você tiver um arquivo de configuração local ou um arquivo de configuração global disponível. Com esta ferramenta em uso, os desenvolvedores podem trabalhar em modelos para o seu conteúdo hearts e usar sua ferramenta de controle de revisão favorita para gerenciar seu trabalho. Usamos git principalmente em nosso ambiente e mantemos os arquivos binários de modelo completo, bem como os recursos VBA sob revisão controlo.
 0
Author: Chad Knudson, 2016-01-07 17:21:04

Depende do nível de integração que você quer, eu usei Subversion/TortoiseSVN que parece bom para uso simples. Eu também adicionei em palavras-chave, mas parece haver um risco de corrupção de arquivo. Há uma opção no Subversion para fazer a palavra-chave substituições comprimento fixo e, tanto quanto eu entendo, vai funcionar se o comprimento fixo é mesmo, mas não estranho. Em qualquer caso, você não tem qualquer tipo útil de funcionalidade diff, eu acho que há produtos comerciais que vão fazer 'diff'. Sim. encontrar algo que fez diff baseado na conversão de coisas para texto simples e comparar isso, mas não foi muito agradável.

 -1
Author: Ian Hopkinson, 2008-09-25 05:45:05

Ele deve funcionar com a maioria dos VCS (dependendo de outros critérios que você pode escolher SVN, CVS, Darcs, TFS, etc), No entanto ele vai realmente o arquivo completo (porque é um formato binário), o que significa que a pergunta "O que mudou" não é tão fácil de responder.

Você ainda pode confiar em mensagens de log se as pessoas completá - las, mas você também pode tentar os novos formatos baseados em XML do Office 2007 para ganhar um pouco mais de visibilidade (embora ainda seria difícil de arrancar através das toneladas de XML, mais AFAIK o ficheiro XML é comprimido no disco, por isso você precisa de um gancho de pré-commit para o desbloquear para que o diff de texto funcione correctamente).

 -1
Author: Grey Panther, 2008-09-25 05:52:30

Escrevi uma folha de cálculo controlada com revisão usando VBA. Ele é mais orientado para relatórios de engenharia, onde você tem várias pessoas trabalhando em uma conta de Material ou cronograma e, em algum momento, você quer criar uma revisão instantânea que mostra adições, del e atualizações do rev. anterior

Nota: é um livro de trabalho com opção de macro que você precisa assinar para transferir do meu site (você pode usar OpenID)

Todo o código está desbloqueado.

Controlado Por Rev Folha de cálculo

 -1
Author: Nate, 2012-01-05 06:36:21