我一直在忙着在我工作的Excel应用程序中导入/导出VBA模块和类。对于版本控制来说似乎非常有用。我喜欢。我可以轻松地在模块中实现代码更改,导出我的更改,提交和推送我的更改,以及"重新加载" (删除所有模块并重新导入)我在Excel应用程序的另一个实例中的更改。
但是,我无法找到一种方法来使用它。如果我在工作表中添加一个视觉更改(例如,我添加一个按钮或更改工作表的样子),有没有办法将工作表导出为代码,就像模块一样,这样我就可以完全导入工作表它看起来像我的变化?
我已经意识到了这方面的一些伪解决方案,但要么在版本控制方面不能满足我的要求,要么太过于提升。首先,我可以编写一个VBA脚本来将我的Excel应用程序复制到.xlsx文件中,该文件将包含我的任何工作表更改,然后如果我愿意,我可以将它们导入到应用程序的另一个实例中。问题在于我无法将它们包含在我的版本控制中。我也知道我可以在事件Workbook_Open
中编写脚本,以便在每次打开Excel应用程序时以编程方式在我的工作表上创建用户界面。这将解决我提交代码的问题,但是太过分了。
对此问题的任何建议或解决方案?
编辑:要清楚,我知道我也可以将我的工作表导出为模块。但是,似乎没有任何东西表明出口时纸张的样子。因此,当我导入"表"时,它将作为类模块导入。
答案 0 :(得分:2)
我昨天回复了一个类似的问题Version control system for Excel-VBA code
来源控制表很难。想象一下,您将单元格A1,A2,A3中的数据序列化,这样就可以
A1:"Foo"
A2:"Bar"
A3:"Baz"
...
A5577: "Kevin"
即。很多行。然后你在顶部的行插入一行,例如3,然后下面的所有行将不同步,并将抛出5000!版本比较中的不匹配;这非常令人恼火(当我在一个系统上工作时)。
也许您可能希望对此问题有一个很好的思考并发布可能的解决方案。我自己快速思考一下,我想知道一些类似于链表的逻辑是否会有所帮助。因此,一个序列化一个单元格,然后序列化到下一个单元格的链接,一个遍历整个单元格列表。然后单行插入只需要一次更改,即链接插入。
答案 1 :(得分:2)
A" sheet"是Document
- 类型VBComponent
,其中是类模块,在主机应用程序的对象模型中对特定对象类型进行子类化(此处为{{1} })。所以"代码" part作为类模块导出; "文件"部分是,你的主机文件 - 内容多不仅仅是单元格值和公式(字体,单元格格式,条件格式,单元格注释,形状等),以及Office 2007+那些是以XML格式序列化的,用.zip封装(然后用.xlsx扩展名重命名):对于文件的正确的源代码控制,你需要实际XML上的差异。
此外,您无法将文档类型Worksheet
导回VBComponent
,因为它是拥有文档类型组件的主机应用程序。例如,要将工作表添加到VBProject
,您需要使用Excel对象模型并调用ThisWorkbook
;删除它们同样如此。
这就是为什么VBA没有处理每个用例的源控制解决方案的原因:为了使它具有全功能性,它必须能够修改文档的压缩XML'通过从磁盘加载XML,打开文件时的结构。
我有这个OSS项目Rubberduck,它具有集成的Git源代码控制功能:
它与主机无关,所以它没有特定于主机的具体内容 - 但即使有些claim "it's simple",现实情况也是如此,嗯,它不是:一个人会很高兴能够恢复代码隐藏;另一个人会想要细胞的价值和公式;另一个人需要能够恢复形状及其格式和分配的宏,而另一个人会抱怨,因为他们在从源代码控制恢复项目时丢失了条件格式:在一天结束时,只有一个文档类型的方法源代码管理下的ThisWorkbook.Worksheets.Add
是提取其XML并将 保持在源代码管理下......但是,您无法恢复文档
唯一合理的解决方案是尽可能地将VBA代码实现与文档分离 - 编写VBA代码,无论代码托管在工作簿中的工作表是什么,它都能正常工作;参数化所有内容,并有一个模块,生成工作表布局和格式等等 - 换句话说,不要设计"设计"工作表(在Excel中),"代码"他们(在VBE中)。
至于数据......好吧,运气不好:源控制意味着代码,而不是数据。