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

时间:2020-03-06 14:42:18  来源:igfitidea点击:

我们在MS Excel(2003/2007)中使用了哪些版本控制系统?我们会推荐什么,为什么?我们对最高评价的版本控制系统有什么限制?

为了正确理解这一点,这里有一些用例:

  • VBA模块的版本控制
  • 超过一个人正在处理Excel电子表格,他们可能正在更改要合并和集成的同一工作表。该工作表可能包含公式,数据,图表等
  • 用户不太技术,使用的版本控制系统越少越好
  • 空间限制是一个考虑因素。理想情况下,仅保存增量更改,而不是整个Excel电子表格。

解决方案

使用任何标准版本控制工具,例如SVN或者CVS。局限性取决于目标。除了存储库的大小略有增加外,我没有遇到任何问题

这取决于我们是在谈论数据还是电子表格中包含的代码。虽然我对Microsoft的Visual Sourcesafe非常讨厌,并且通常不建议这样做,但它确实可以轻松地与Access和Excel集成,并提供模块的源代码控制。

[实际上,与Access的集成包括查询,报告和模块,它们是可以版本化的单个对象]

MSDN链接在这里。

这取决于我们想要的集成级别,我使用了Subversion / TortoiseSVN,对于简单的用法来说似乎不错。我也添加了关键字,但是似乎存在文件损坏的风险。 Subversion中有一个选项可以将关键字替换设置为固定长度,据我所知,如果固定长度为偶数而不是奇数,它将可以工作。无论如何,我们都不会获得任何有用的diff功能,我认为有些商业产品会执行" diff"操作。我确实发现了一些将差异转换为纯文本并进行比较的东西,但这不是很好。

它可以与大多数VCS一起使用(取决于其他条件,我们可以选择SVN,CVS,Darcs,TFS等),但是它实际上将是完整的文件(因为它是二进制格式),这意味着"更改了什么"问题是不太容易回答。

如果人们完成了日志消息,我们仍然可以依靠日志消息,但是我们也可以尝试使用Office 2007中基于XML的新格式来获得更多可见性(尽管仍然很难除掉大量的XML和AFAIK XML文件压缩在磁盘上,因此我们需要一个预先提交的钩子来解压缩它,以使文本差异正常工作。

如果我们正在与普通办公室非技术用户一起查看办公室环境,那么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维护版本控制。例如,通过在VBA中将Subversion的命令行界面与" shell"命令配合使用。那样就可以了。我什至在考虑自己做这件事:)

我不知道有什么工具可以很好地做到这一点,但是我已经看到了各种本地解决方案。这些的共同点是在版本控制下最小化二进制数据,并在文本数据最大化时利用常规scc系统的功能。去做这个:

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

仅当在文档库中打开了版本控制功能时,作为对mattlant的答复的响应,共享点才能很好地用作版本控制。
此外,请注意,任何通过相对路径调用其他文件的代码都无法正常工作。最后,当将文件保存在sharepoint中时,指向外部文件的任何链接都将断开。

我刚刚设置了一个使用Bazaar的电子表格,并通过TortiseBZR手动签入/签出。鉴于该主题对我的保存部分有所帮助,因此我想在此处发布我的解决方案。

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

这使我可以通过Emacs(是,emacs)或者在Excel中本地编辑模块中的宏,并在进行重大更改后提交我的BZR存储库。因为所有模块都是文本文件,所以BZR中的标准diff样式命令适用于我的源文件,但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代码!

对于Subversion版本控制系统,TortoiseSVN是一个非常好的Windows客户端。我刚刚发现的一个功能是,当我们单击以获取Excel文件版本之间的差异时,它将在Excel中打开两个版本并以红色突出显示已更改的单元格。这是通过vbs脚本的魔力来完成的,如此处所述。

即使不使用TortoiseSVN,我们也可能会发现它很有用。

我也一直在研究这个。这表明最新的Team Foundation Server 2010可能具有Excel加载项。

这是一个线索:

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