为MS Excel执行版本控制的最佳方法

为MS Excel执行版本控制的最佳方法,excel,version-control,Excel,Version Control,您在MS Excel(2003/2007)中使用了哪些版本控制系统?你会推荐什么?为什么?您发现顶级版本控制系统存在哪些限制 为了更好地理解这一点,这里有几个用例: VBA模块的版本控制 不止一个人正在处理Excel电子表格,他们可能正在对同一工作表进行更改,并希望合并和集成该工作表。本工作表可能包含公式、数据、图表等 用户技术性不强,使用的版本控制系统越少越好 空间限制是一个考虑因素。理想情况下,只保存增量更改,而不是保存整个Excel电子表格 使用任何标准版本控制工具,如SVN或CVS。限制

您在MS Excel(2003/2007)中使用了哪些版本控制系统?你会推荐什么?为什么?您发现顶级版本控制系统存在哪些限制

为了更好地理解这一点,这里有几个用例:

  • VBA模块的版本控制
  • 不止一个人正在处理Excel电子表格,他们可能正在对同一工作表进行更改,并希望合并和集成该工作表。本工作表可能包含公式、数据、图表等
  • 用户技术性不强,使用的版本控制系统越少越好
  • 空间限制是一个考虑因素。理想情况下,只保存增量更改,而不是保存整个Excel电子表格
    使用任何标准版本控制工具,如SVN或CVS。限制取决于目标是什么。除了存储库的大小略有增加外,我没有遇到任何问题

    这取决于您谈论的是数据还是电子表格中包含的代码。虽然我非常不喜欢Microsoft的Visual Sourcesafe,通常也不会推荐它,但它确实可以轻松地与Access和Excel集成,并提供模块的源代码控制

    [事实上,与Access的集成包括查询、报告和模块,作为可以进行版本控制的单个对象]


    MSDN链接是。

    这取决于您想要的集成级别,我使用了Subversion/TortoiseSVN,它似乎适合简单使用。我还添加了关键字,但似乎存在文件损坏的风险。Subversion中有一个使关键字替换固定长度的选项,据我所知,如果固定长度是偶数而不是奇数,它将起作用。在任何情况下,您都无法获得任何有用的差异功能,我认为有一些商业产品可以实现“差异”。我确实发现了一些基于将内容转换为纯文本并进行比较的差异,但这不是很好。

    它应该适用于大多数VCS(取决于您可能选择的其他标准SVN、CVS、DARC、TFS等),但实际上它将是完整的文件(因为它是二进制格式),这意味着“发生了什么变化”这个问题不太容易回答


    如果人们完成了日志消息,您仍然可以依赖日志消息,但是您也可以尝试Office2007中新的基于XML的格式,以获得更多的可见性(尽管仍然很难从大量的XML中剔除,而且AFAIK会将XML文件压缩到磁盘上,因此您需要一个预提交钩子来解压它,以便文本差异正常工作).

    如果您正在使用普通office非技术用户的office设置,Sharepoint是一个可行的替代方案。您可以设置启用版本控制、签入和签出的文档文件夹。这使普通office用户更容易使用它。

    您可以做的一件事是在工作簿中包含以下代码片段:

    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来维护版本控制。例如,通过在VBA中使用Subversion的命令行界面和“shell”命令,就可以做到这一点。我甚至想自己做这件事:)

    我不知道有什么工具可以做到这一点,但我已经看到了各种国产解决方案。其共同点是在版本控制下最小化二进制数据,并最大化文本数据,以利用传统scc系统的功能。为此:

    • 像对待任何其他应用程序一样对待工作簿。将逻辑、配置和数据分开
    • 从工作簿中分离代码
    • 以编程方式构建UI
    • 编写生成脚本以重建工作簿

    回应mattlant的回复-只有在文档库中打开版本控制功能时,sharepoint才能作为版本控制正常工作。
    此外,请注意,任何通过相对路径调用其他文件的代码都不会工作。最后,当文件保存在sharepoint中时,任何指向外部文件的链接都将中断。

    我刚刚设置了一个使用Bazaar的电子表格,通过TortiseBZR手动签入/签出。考虑到这个主题在保存部分对我有所帮助,我想在这里发布我的解决方案

    我的解决方案是创建一个电子表格,在保存时导出所有模块,在打开时删除并重新导入模块。是的,这可能对转换现有电子表格有潜在危险

    这允许我通过Emacs(是的,Emacs)或在Excel中本机编辑模块中的宏,并在重大更改后提交我的BZR存储库。因为所有模块都是文本文件,所以BZR中的标准diff样式命令适用于我的源代码,Excel文件本身除外

    我已经为我的BZR存储库设置了一个目录,X:\Data\MySheet。repo中有MySheet.xls和我的每个模块的一个.vba文件(即:module1宏)。在我的电子表格中,我添加了一个名为“VersionControl”的模块,该模块不受导出/导入周期的限制。要导出和重新导入的每个模块必须以“宏”结尾

    版本控制模块的内容:

    子SaveCodeModules()
    '此代码导出所有VBA模块
    昏昏欲睡$
    使用ThisWorkbook.VBProject
    对于i%=1到.VBComponents.Count
    如果.VBComponents(i%).CodeModule.countofline>0,则
    sName$=.VBComponents(i%).CodeModule.Name
    .VBComponents(i%)。导出“X:\Tools\MyExcelMacros\”和sName$&.vba”
    如果结束
    接下来我
    以
    端接头
    子导入解调器()
    使用ThisWorkbook.VBProject
    对于i%=1到.VBComponents.Count
    ModuleName=.VBComponents(i%).CodeModule.Name
    如果ModuleName为“VersionControl”,则
    如果正确(ModuleName,6)=“宏”,则
    .VBComponents.Remove.VBComponents(模块名称)
    .VBComponents.Import“X:\Data\MySheet\”和ModuleName&“.vba”
    如果结束
    如果结束
    
    [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
    
    *.xlsx diff=xlsx
    
    ActiveWorkbook.VBProject.VBComponents("moduleName").Export"C:\Path\To\Spreadsheet\moduleName.txt"