小编典典

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

all

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

从这个角度来看,这里有几个用例:

  1. VBA 模块的版本控制
  2. 不止一个人在处理 Excel 电子表格,他们可能正在对同一个工作表进行更改,他们希望将其合并和集成。此工作表可能包含公式、数据、图表等
  3. 用户不太懂技术,使用的版本控制系统越少越好
  4. 空间限制是一个考虑因素。理想情况下,只保存增量更改而不是整个 Excel 电子表格。

阅读 70

收藏
2022-08-16

共1个答案

小编典典

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

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

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

我已经为我的 BZR 存储库设置了一个目录 X:\Data\MySheet。在 repo 中有我的每个模块的 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 代码!

2022-08-16