【问题标题】:Is there a place to store VBA code that's accessible to all Microsoft Office products..?是否有地方可以存储所有 Microsoft Office 产品都可以访问的 VBA 代码..?
【发布时间】:2017-11-04 00:04:56
【问题描述】:

有没有一种方法可以存储所有 Microsoft Office 产品通用且可访问的 VBA 源代码..?我在 Access 和 Excel 中使用了多种功能,有时甚至在 Word 中使用。我经常修改和添加功能和模块。在项目之间复制、粘贴和维护代码可能会很乏味,而且我不可避免地会忽略一些事情。

我知道我可以做一些事情,比如在 VB6 或 DotNet 中编写一个 class/ocx/addin,编译它,然后在我的 VBA 项目中引用它,但我希望有更简单的东西。

如果有办法将 VBA 代码存储在独立文件中,并使用 VBA IDE 以某种独立模式打开它们,那将是非常出色的,但我知道 IDE 不能那样工作......据我所知。

【问题讨论】:

  • 您可以创建加载项。另一种简单的方法是创建一个可以在 VBA IDE 中导入的模块文件
  • 是的,我考虑过这些,但我希望像我建议的那样简单——某种常见的位置。我将在我的脑海中形成一个插件,可以加载到所有 Office 产品中,并保持源代码同步......不知何故。

标签: excel ms-access vba ms-word


【解决方案1】:

我知道我可以做一些事情,比如在 VB6 或 DotNet 中编写一个 class/ocx/addin,编译它,然后在我的 VBA 项目中引用它,但我希望有更简单的东西。

很遗憾,这是你最好的选择。

如您所知,VBA 代码是托管的,封装在宿主文档中:VBA 加载项仍与其宿主文档(.xlam 等)绑定,因此无法与其他宿主共享.

在 VBA 领域中,意味着要在 VBA 项目之间共享的是 类型库 - 您与 VBA 项目分开编译的东西,以及 参考 em> 来自尽可能多的项目。

如果您有 VB6 IDE,则可以编译 VBA 项目可以引用的 32 位 DLL。问题是它不适用于 64 位主机 - 解决方案是一个 .NET 类型库,用您选择的 .NET 语言编写,使 COM 可见。请注意,COM 兼容性确实限制了您可以在 API 中公开的内容:例如,您不能公开泛型,并且方法重载看起来很奇怪。

如果类型库不是您希望探索的途径,那么您的选择相当有限,而且 IMO 不是最佳选择。

IMO可以“工作”的唯一东西是一些公共文件夹中的一堆导出代码文件,需要使用该代码的 VBA 项目需要逐字导入这些代码文件。这里的风险是,如果您进行任何更改,使用该代码的未修改版本的其他 VBA 项目将不会“看到”这些更改,IOW 通过这样做,您将需要修复错误的次数乘以使用该代码的项目数量。

或者您可以使用一些使用 VBIDE 可扩展性类型库的代码来确保导入的模块集始终与该公共位置中的导出文件完全匹配。

【讨论】:

  • 是的,我了解封装问题,这就是为什么我认为插件是可行的方法。但是...不是 Office 产品的插件,而是 VBA IDE 窗口的插件。我下载了一个名为 PrettyCodePrint 的软件。将它安装在 Excel VBA IDE 中,你瞧,它也神奇地出现在了 Access VBA IDE 中。我发现 IDE 插件 在所有 Office 产品中都很常见,所以我认为这是要走的路。我必须设计某种同步方案,也许可以感知窗口何时被激活/停用,然后根据需要复制到/从。
  • 我有VB6;它安装在 Oracle Virtual Box VM 中。这就是为什么我提到使用 VB6 创建插件的原因;我已经涉足其中。我有 O'Reilly 的书“开发 Visual Basic 插件”,我对 VBIDE OL 非常熟悉,并且用它完成了一些奇怪的开发项目。出于讨论的目的,我只需要确定同步触发器,然后确定同步将如何发生。小菜一碟..!尤其是在我的其他项目之间。呵呵 =-)
  • 如果您只需要针对确实可以选择的 32 位主机 - 再说一次,IMO 将 VB6 类型库维护为 VB6 DLL 并引用该类型库会简单得多在任何需要它的 VBA 项目中 - 你的电话!
  • 抱歉,我的 C# 有点不稳定。我确实以第三类方式知道一些;我最近回到学校完成了我的编程文凭,我有四个学期的 JAVA。我无意中发现了一个副作用:我意识到我可以阅读 C* 代码。但是……不写了。然而。
  • 我之前也遇到过同样的问题,复制代码。 @Mat'sMug 建议建立一个图书馆可能是你最好的选择。以前的同事向我介绍了 C#,一个月后发现 Rubberduck 对如何学习毫无疑问。请到池塘边(又名作战室)。 免责声明:我为 RD 做出了贡献,并从小组中学到了很多东西。
【解决方案2】:

如果您想在同一个 Office 程序中使用 VBA(例如,一个 Excel 文件到另一个,或一个 Access 文件到另一个),您不需要使用任何特殊类型的文件。您可以添加对启用宏的外部数据库或工作表的引用。

导航工具 - 参考资料 - 浏览 - Excel/Access 文件 - 添加文件

请看以下截图:

您不能以这种方式跨不同的 Office 应用程序使用文件,但您不应该这样做。每个应用程序都有不同的内置函数,因此您的代码可能无论如何都不兼容。

【讨论】:

  • 每个宿主应用程序都将其类型库添加为对 VBA 项目的引用,是的。我想这取决于您认为“内置”的内容......有很多的自定义代码可以很好地不使用任何特定于主机的库(例如进度指示器类和用户表单,一个自定义集合类、字符串实用函数等),所以这个答案中的最终假设很可能是错误的。 OP 还专门询问在不同主机之间共享代码
  • @Mat'sMug 我想知道是否应该添加它。这确实不完全正确(作为一个 Access 程序员,我倾向于使用 Nz 很多,这在其他 Office 程序中是不可用的,所以我的很多模块将无法编译)。但无论如何,这是一个限制,你可能想绕过它,但据我所知,你做不到。
  • 您在新/现有项目中引用的 Excel/Access 文件是否只需要引用相关的 Microsoft(主机)XX.0 对象库?在最坏的情况下,您的新项目/现有项目还需要引用相关的 Microsoft(主机)XX.0 对象库。
  • @Tigregalis 您只是无法为其他 Office 程序添加对文件的引用。您确实可以尝试通过导入相关库来使代码正常工作,但是由于您无法从 Excel 引用 Access 文件或从 Access 引用 Excel 文件,因此没有用
  • 我的意思是,例如在您的“插件”中使用Access.Nz,它并非在所有应用程序中都可用。假设“addin”中的函数Test 使用Access.Nz;您需要在“新项目”中使用Test,以便添加对“addin”的引用,并且“addin”已经引用了“Microsoft Access 对象库” - Access.Nz 是否可用于“new项目”还是“新项目”需要添加对“Microsoft Access 对象库”的引用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多