如何使用 VBA 导出 Sheet 按钮和详细信息
How to Export Sheet Buttons and Details with VBA
我一直在摆弄 importing/exporting VBA 模块和 classes 在我开发的 Excel 应用程序中。与版本控制一起使用似乎真的很有用。我喜欢。我可以轻松地在模块中实现代码更改、导出我的更改、提交和推送我的更改,以及 "reload"(删除所有模块并重新导入)我在 Excel 应用程序的另一个实例中的更改。
但是,我找不到将它与 sheet 一起使用的方法。如果我对 sheet 添加视觉更改(例如,我添加按钮或更改 sheet 的外观),是否有办法将 sheet 导出为代码,就像模块,这样我就可以完全按照更改后的样子导入 sheet?
我已经知道一些伪解决方案,但要么不适合我在版本控制方面的需求,要么提升太多。首先,我可以编写一个 VBA 脚本来将我的 Excel 应用程序复制到一个 .xlsx 文件,该文件将包含我的任何 sheet 更改,然后我可以将它们导入另一个实例如果我愿意的话。问题是我无法将它们包含在我的版本控制中。我也知道我可以在 Workbook_Open
事件中编写脚本,以便在每次打开 Excel 应用程序时以编程方式在我的 sheet 上创建我的用户界面。这将解决我提交代码的问题,但是提升太大了。
对这个问题有什么建议或解决方案吗?
编辑:明确地说,我知道我也可以将我的 sheet 导出为模块。但是,似乎没有任何内容表明 sheet 在导出时的样子。因此,当我导入 "sheet" 时,它被导入为 class 模块。
我昨天回复过类似的问题
来源控制表很难。假设您序列化单元格 A1、A2、A3 中的数据,那么您可能有
A1:"Foo"
A2:"Bar"
A3:"Baz"
...
A5577: "Kevin"
即很多行。然后你在顶部的行插入一行,例如 3,那么下面的所有行都会不同步并会抛出 5000!版本比较不匹配;这非常令人恼火(当我在一个执行此操作的系统上工作时)。
也许你想好好想想这个问题,post一个可能的解决方案。我自己快速考虑了一下,我想知道一些类似于 linked 列表的逻辑是否会有所帮助。因此,一个序列化一个单元格,然后也将一个 link 序列化到下一个单元格,然后遍历整个单元格列表。然后单行插入只需要一个更改,一个 link 插入。
一个"sheet"是一个Document
类型的VBComponent
,其中是一个class模块,subclassing 宿主应用程序对象模型中的特定对象类型(这里是 Worksheet
class)。所以 "code" 部分被导出为 class 模块; "document" 部分是您的宿主文档 - 其内容 远不止 单元格值和公式(字体、单元格格式、条件格式、单元格注释、形状、等),在 Office 2007+ 中,它们以 XML 格式序列化,打包在 .zip 中(然后用 .xlsx 扩展名重命名):for proper 文档的源代码控制你需要实际 XML.
上的差异
此外,您无法将文档类型 VBComponent
导入回 VBProject
,因为它是拥有文档类型组件的宿主应用程序。例如向ThisWorkbook
添加工作表,需要使用Excel对象模型,调用ThisWorkbook.Worksheets.Add
;删除它们也是如此。
这就是为什么 VBA 没有处理每个用例的源代码控制解决方案的原因:要使其功能齐全,它必须能够修改压缩的 XML文档的结构,打开该文档,通过从磁盘加载 XML。
我有这个 OSS 项目,Rubberduck,它集成了 Git 源代码控制:
它与主机无关,因此它的功能与主机无关 - 但即使有些 claim "it's simple",事实是,好吧,事实并非如此:一个人会很高兴成为能够恢复代码隐藏;另一个会想要单元格值和公式;另一个人需要能够恢复形状及其格式和分配的宏,另一个人会抱怨,因为他们在从源代码管理恢复项目时丢失了条件格式:在一天结束时,唯一的方法是拥有文档类型VBComponent
在源代码管理下,是提取它的 XML 并保持 that 在源代码管理下......但是,你不能完全 恢复 文档。
唯一合理的解决方案是尽可能将 VBA 代码实现与文档分离 - 编写 VBA 代码,无论代码托管在工作簿中的工作表如何,都可以正常工作在;参数化所有内容,并有一个生成工作表布局和格式的模块等等 - 换句话说,不要 "design" 工作表(在 Excel 中),"code" 它们(在 VBE 中).
至于数据...好吧,运气不好:源代码控制是针对 code,而不是针对 data。
我一直在摆弄 importing/exporting VBA 模块和 classes 在我开发的 Excel 应用程序中。与版本控制一起使用似乎真的很有用。我喜欢。我可以轻松地在模块中实现代码更改、导出我的更改、提交和推送我的更改,以及 "reload"(删除所有模块并重新导入)我在 Excel 应用程序的另一个实例中的更改。
但是,我找不到将它与 sheet 一起使用的方法。如果我对 sheet 添加视觉更改(例如,我添加按钮或更改 sheet 的外观),是否有办法将 sheet 导出为代码,就像模块,这样我就可以完全按照更改后的样子导入 sheet?
我已经知道一些伪解决方案,但要么不适合我在版本控制方面的需求,要么提升太多。首先,我可以编写一个 VBA 脚本来将我的 Excel 应用程序复制到一个 .xlsx 文件,该文件将包含我的任何 sheet 更改,然后我可以将它们导入另一个实例如果我愿意的话。问题是我无法将它们包含在我的版本控制中。我也知道我可以在 Workbook_Open
事件中编写脚本,以便在每次打开 Excel 应用程序时以编程方式在我的 sheet 上创建我的用户界面。这将解决我提交代码的问题,但是提升太大了。
对这个问题有什么建议或解决方案吗?
编辑:明确地说,我知道我也可以将我的 sheet 导出为模块。但是,似乎没有任何内容表明 sheet 在导出时的样子。因此,当我导入 "sheet" 时,它被导入为 class 模块。
我昨天回复过类似的问题
来源控制表很难。假设您序列化单元格 A1、A2、A3 中的数据,那么您可能有
A1:"Foo"
A2:"Bar"
A3:"Baz"
...
A5577: "Kevin"
即很多行。然后你在顶部的行插入一行,例如 3,那么下面的所有行都会不同步并会抛出 5000!版本比较不匹配;这非常令人恼火(当我在一个执行此操作的系统上工作时)。
也许你想好好想想这个问题,post一个可能的解决方案。我自己快速考虑了一下,我想知道一些类似于 linked 列表的逻辑是否会有所帮助。因此,一个序列化一个单元格,然后也将一个 link 序列化到下一个单元格,然后遍历整个单元格列表。然后单行插入只需要一个更改,一个 link 插入。
一个"sheet"是一个Document
类型的VBComponent
,其中是一个class模块,subclassing 宿主应用程序对象模型中的特定对象类型(这里是 Worksheet
class)。所以 "code" 部分被导出为 class 模块; "document" 部分是您的宿主文档 - 其内容 远不止 单元格值和公式(字体、单元格格式、条件格式、单元格注释、形状、等),在 Office 2007+ 中,它们以 XML 格式序列化,打包在 .zip 中(然后用 .xlsx 扩展名重命名):for proper 文档的源代码控制你需要实际 XML.
此外,您无法将文档类型 VBComponent
导入回 VBProject
,因为它是拥有文档类型组件的宿主应用程序。例如向ThisWorkbook
添加工作表,需要使用Excel对象模型,调用ThisWorkbook.Worksheets.Add
;删除它们也是如此。
这就是为什么 VBA 没有处理每个用例的源代码控制解决方案的原因:要使其功能齐全,它必须能够修改压缩的 XML文档的结构,打开该文档,通过从磁盘加载 XML。
我有这个 OSS 项目,Rubberduck,它集成了 Git 源代码控制:
它与主机无关,因此它的功能与主机无关 - 但即使有些 claim "it's simple",事实是,好吧,事实并非如此:一个人会很高兴成为能够恢复代码隐藏;另一个会想要单元格值和公式;另一个人需要能够恢复形状及其格式和分配的宏,另一个人会抱怨,因为他们在从源代码管理恢复项目时丢失了条件格式:在一天结束时,唯一的方法是拥有文档类型VBComponent
在源代码管理下,是提取它的 XML 并保持 that 在源代码管理下......但是,你不能完全 恢复 文档。
唯一合理的解决方案是尽可能将 VBA 代码实现与文档分离 - 编写 VBA 代码,无论代码托管在工作簿中的工作表如何,都可以正常工作在;参数化所有内容,并有一个生成工作表布局和格式的模块等等 - 换句话说,不要 "design" 工作表(在 Excel 中),"code" 它们(在 VBE 中).
至于数据...好吧,运气不好:源代码控制是针对 code,而不是针对 data。