繁体   English   中英

如何使用VBA导出工作表按钮和详细信息

[英]How to Export Sheet Buttons and Details with VBA

我一直在忙于在我使用的Excel应用程序中导入/导出VBA模块和类。 似乎与版本控制一起使用非常有用。 我喜欢。 我可以轻松地在模块中实现代码更改,导出更改,提交并推送更改,以及在其他Excel应用程序实例中“重新加载”(删除所有模块并重新导入)更改。

但是,我找不到在工作表上使用此方法。 如果我在工作表上添加了视觉更改(例如,我添加了按钮或更改了工作表的外观),是否可以像模块一样将工作表作为代码导出,因此我可以将工作表完全导入从我的变化看?

我已经知道一些伪解决方案,但是要么不能满足我在版本控制方面的需要,要么会变得很麻烦。 首先,我可以编写一个VBA脚本将Excel应用程序复制到一个.xlsx文件中,该文件将容纳我的任何工作表更改,然后,如果需要,我可以将它们导入到该应用程序的另一个实例中。 这样做的问题是,我将无法将它们包括在我的版本控制中。 我也知道,我可以在事件Workbook_Open编写脚本,从而基本上在每次打开Excel应用程序时以编程方式在工作表上创建用户界面。 这将解决我提交代码的问题,但实在太麻烦了。

对这个问题有什么建议或解决方案吗?

编辑:明确地说,我知道我也可以将工作表导出为模块。 但是,似乎没有任何迹象表明工作表在导出时的外观。 因此,当我导入“工作表”时,它作为类模块被导入。

昨天我回答了类似的问题Excel-VBA代码的版本控制系统

源代码控制表很困难。 假设您序列化单元格A1,A2,A3中的数据,那么您可能

A1:"Foo"
A2:"Bar"
A3:"Baz"
...
A5577: "Kevin"

即大量的行。 然后您在顶部的行中插入一行,例如3,那么下面的所有行将不同步并抛出5000! 版本比较不匹配; (当我在执行此操作的系统上工作时),这很烦人。

也许您可能想好好考虑一下这个问题并发布可能的解决方案。 我本人对此进行了快速思考,我想知道一些类似于链表的逻辑是否会有所帮助。 因此,先序列化一个单元格,然后再序列化到下一个单元格的链接,然后遍历整个单元格列表。 然后,单行插入将只需要一个更改,即链接插入。

“工作表”是Document类型的VBComponent ,它一个类模块,在宿主应用程序的对象模型(此处为Worksheet类) VBComponent类化特定的对象类型。 因此,“代码”部分将导出为类模块; “文件”部分,那么,您的主机的文件-即含量不止细胞值和公式(字体,单元格格式,条件格式,单元格批注,形状等),并在Office 2007+那些被序列化以XML格式打包,并以.zip打包(然后以.xlsx扩展名重命名):为了对文档进行适当的源代码控制,您需要与实际XML上的差异。

此外,您不能将文档类型的VBComponent导入回VBProject ,因为它是拥有文档类型组件的宿主应用程序。 例如,要将工作表添加到ThisWorkbook ,您需要使用Excel对象模型并调用ThisWorkbook.Worksheets.Add ; 同上删除它们。

这就是为什么没有用于VBA的源代码控制解决方案能够处理每个用例的原因:要使其功能完整,它必须能够在打开该文档的同时修改该文档结构的压缩XML。从磁盘加载XML。

我有这个OSS项目Rubberduck ,它具有集成的Git源代码控制功能:

Rubberduck的“源代码控制”面板

它与主机无关,因此它的功能并没有特定于主机的内容,但是即使有人声称“很简单” ,实际情况并非如此:一个人会很高兴能够恢复代码-背后; 另一个将需要单元格的值和公式; 另一个人将需要能够恢复形状及其格式和分配的宏,另一个人会抱怨,因为从源代码管理中恢复项目时,他们失去了条件格式:最后,拥有文档类型的唯一方法VBComponent源代码控制下,是提取它的XML,并保持源控制下......不过呢,你不能完全恢复的文件。

唯一合理的解决方案是,尽可能使VBA代码实现与文档脱钩-编写有效的VBA代码,而不管代码所在的工作簿中的工作表是什么; 参数化所有内容,并具有一个生成工作表布局和格式等内容的模块-换句话说,不要“设计”工作表(在Excel中),不要“编码”它们(在VBE中)。

至于数据...好运,不幸的是:源代码控制是为了代码 ,而不是数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM