从Excel电子表格中提取VBA

时间:2009-05-11 02:45:18

标签: vba excel-vba version-control excel

是否有一种从电子表格中提取VBA并将其存储在存储库中的简洁方法。

电子表格几乎没有改变,但VBA确实如此。将整个电子表格存储在存储库中使得难以跨不同的VBA修订版进行差异,以查看哪些代码已更改以及谁更改了它。

我们使用VBA 6.5 / Excel 2003。

5 个答案:

答案 0 :(得分:10)

以前版本的Excel和Access(2003年之前)通过加载项支持VBA源代码版本控制。我在Office 2000中非常有效地使用了它。

Visual SourceSafe(VSS)对VBA的支持是dropped with the release of Office 2003,但Office XP Developer附带的加载项显然是works with Office 2003

Microsoft知识库文章:

如果不能使用此代码来提取VBA代码(来自here,但它缺少最终的对象清理)。阅读网页了解警告:

option explicit

Const vbext_ct_ClassModule = 2
Const vbext_ct_Document = 100
Const vbext_ct_MSForm = 3
Const vbext_ct_StdModule = 1

Main

Sub Main
    Dim xl
    Dim fs
    Dim WBook
    Dim VBComp
    Dim Sfx
    Dim ExportFolder

    If Wscript.Arguments.Count <> 1 Then
        MsgBox "As the only argument, give the FULL path to an XLS file to extract all the VBA from it."
    Else

        Set xl = CreateObject("Excel.Application")
        Set fs = CreateObject("Scripting.FileSystemObject")

        xl.Visible = true

        Set WBook = xl.Workbooks.Open(Trim(wScript.Arguments(0)))

        ExportFolder = WBook.Path & "\" & fs.GetBaseName(WBook.Name)

        fs.CreateFolder(ExportFolder)

        For Each VBComp In WBook.VBProject.VBComponents
            Select Case VBComp.Type
                Case vbext_ct_ClassModule, vbext_ct_Document
                    Sfx = ".cls"
                Case vbext_ct_MSForm
                    Sfx = ".frm"
                Case vbext_ct_StdModule
                    Sfx = ".bas"
                Case Else
                    Sfx = ""
            End Select
            If Sfx <> "" Then
                On Error Resume Next
                Err.Clear
                VBComp.Export ExportFolder & "\" & VBComp.Name & Sfx
                If Err.Number <> 0 Then
                    MsgBox "Failed to export " & ExportFolder & "\" & VBComp.Name & Sfx
                End If
                On Error Goto 0
            End If
        Next

        xl.Quit

        Set fs = Nothing
        Set xl = Nothing

    End If
End Sub

答案 1 :(得分:1)

答案 2 :(得分:1)

这个问题的其他答案很好地解决了,但是如果你刚刚开始编写代码,请查看VSTO。它为Office提供托管代码,最重要的是,您甚至可以使用C#或任何.NET语言来实现它。它也适用于Excel 2003,这是一个奖金,在你的情况下。

答案 3 :(得分:1)

在另一个话题中回答了同样的事情。 您尝试的另一种选择。

Exporting VBA code from Multiple Excel documents to put into version control

(有没有办法交叉链接这些主题和/或答案?)

答案 4 :(得分:0)

你已经有了一个很好的答案,但请允许我添加一个。

很有可能将所有VBA代码保存在与包含数据的电子表格分开的电子表格中。如果你这样做,它可能会使你的比较更容易。