是否有一个战术(阅读“黑客”)解决方案,以避免将VBA代码和Excel工作表作为一个二进制文件?

时间:2009-02-12 09:50:48

标签: excel vba excel-vba

据我所知,当我使用VBA代码创建Excel工作表时,VBA代码将与工作表一起保存为二进制代码。因此,我不能以有用的方式将代码放入源代码控制中,让多个开发人员处理问题,难以区分等等。

有没有办法围绕这个而不切换到VSTO,COM插件等?例如。对于要在运行时从Web服务,共享驱动器等加载所有VBA的工作表?任何想法都赞赏。

感谢。

6 个答案:

答案 0 :(得分:12)

我为Excel编写了一种构建系统,它从源文件中导入VBA代码(然后可以将其导入源代码控制,差异等)。它的工作原理是创建一个包含导入代码的新Excel文件,因此它可能不适用于您的情况。

构建宏看起来像这样,我把它保存在一个名为Build.xls的文件中:

Sub Build()
    Dim path As String
    path = "excelfiles"

    Dim vbaProject As VBIDE.VBProject
    Set vbaProject = ThisWorkbook.VBProject

    ChDir "C:\Excel"
    ' Below are the files that are imported
    vbaProject.VBComponents.Import (path & "\something.frm")
    vbaProject.VBComponents.Import (path & "\somethingelse.frm")

    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs "Output.xls"
    Application.DisplayAlerts = True

    Application.Quit
End Sub

现在,VBIDE的东西意味着你必须导入一个名为“Microsoft Visual Basic for Applications Extensibility 5.3”的引用,我认为。

当然,您仍然需要启动Excel才能构建。这可以通过一个小的VB脚本修复:

currentPath = CreateObject("Scripting.FileSystemObject") _
    .GetAbsolutePathName(".")
filePath = currentPath & "\" & "Build.xls"

Dim objXL
Set objXL = CreateObject("Excel.Application")
With objXL
    .Workbooks.Open(filePath)
    .Application.Run "Build.Build"
End With
Set objXL = Nothing

运行上面的脚本应该启动构建Excel文件,该文件输出结果表。您可能需要更改一些内容以使其在文件系统中可移动。希望这有帮助!

答案 1 :(得分:3)

我强烈建议您不要尝试在运行时加载VBA。 VBIDE自动化充其量只是片状,我认为你会遇到很多维护和支持问题。

我的解决方案是将源代码控制的peridocally代码导出为文本文件。我还将删除xls中的所有代码(完全删除表单,模块和类模块以及删除Worksheet和Workbook模块中的代码),并将此“stub”xls放入源代码控制中。

从源代码控制重建将包括获取“存根”xls,导入所有表单,类模块和模块,并将所有代码复制并粘贴到工作表和工作簿模块中。

虽然这是一个痛苦的过程,但它确实允许对代码进行适当的源代码控制,具有差异化,分支等所有常用功能。不幸的是,大多数代码都是手动的。我确实写了一个加载项,它自动化了一些,但很快被黑客攻击解决方案,即相当错误,需要人工干预。如果我再次回顾它并将其提升到划痕那么我会让你知道; - )

答案 2 :(得分:1)

有趣的问题......我们在VBA源代码控制方面也存在问题,但从未实际解决过这个问题。

Microsoft KB article符合您的条件吗?代码放在.BAS文件中,该文件可以位于任意位置(并与.xls分开)。

正如我所说,我从未尝试过这样做,但看起来这似乎是一种方法。

答案 3 :(得分:1)

最短路径是使用http://www.codeproject.com/KB/office/SourceTools.aspx

中的SourceTools.xla插件

另一种方法是使用COM绑定编写一个类似的工具到您喜欢的编程语言。我的一位聪明的同事在Python中创建了一个可以将包括VBA代码,工作表内容和公式甚至VBA引用在内的所有内容导出到文本文件中,并且可以组装一个工作工作簿。这也是XLSX格式之前的。

答案 4 :(得分:0)

我还建议不要在运行时加载并寻找make样式的实用程序。毕竟,如果您的代码受源代码控制,那么您只需要在提交后更新工作簿。

不幸的是,没有这样的实用工具,或者至少没有我能找到的工具。

答案 5 :(得分:0)

我认为与替代方案相比(即不断重建Excel工作簿文件),使用VBA进行轻型原型制作工作,转移到VSTO或COM Addins会更加麻烦。您还可以获得不具备“hackable”源代码的额外好处(即您需要的不仅仅是猜测VBA项目密码)