VBA外部模块

时间:2015-03-03 00:25:58

标签: vba module

是否可以让模块在实际的Excel文件外部并在外部调用函数/ subs?

我的想法是,如果有多个Excel文件使用相同的模块,而不是在我进行更改时单独更新这些文件中的每一个,我可以只更新存储在服务器上的一个模块吗?

2 个答案:

答案 0 :(得分:0)

不确定这是否满足您的需求,但您可以将您的公共模块创建为“加载项”,然后安装它,以便您在同一个excel实例中打开的所有文件都可以访问添加 - 在代码中。 这不是我推荐的方法,因为我担心对所有使用它的excel文件进​​行合适的测试,进行更改时,以及让用户安装加载项的额外复杂性(这可能不是对你来说是一个问题)。我有一个“developersToolkit”模块,我在8个不同的工作簿中使用,但我将模块导入到每个工作簿中,因此它可以单独使用,我也可以测试更改以便与8个工作簿中的每一个兼容。

答案 1 :(得分:0)

我做了像你描述多年的事情。您可以将VBA代码移动到VB6 ActiveX dll,将其组织到类中,并将该dll作为Excel VBA中的引用加载。

这是重用非工作簿特定代码的好方法。例如,我有查询大型机的代码。我喜欢从Excel调用它,但是连接的细节和数据的传递方式都包含在一个dll中,我可以从Excel,VB6,Word,.NET加载它。我有一个类似的dll用于从AutoCAD绘图中读取数据,一个用于连接MySQL服务器上的产品数据库等。

Excel中保留的代码往往是简单的格式化内容。假设我从我编写的某个库中返回一个变量数组字符串(技术上是一个COM SAFEARRAY)。然后我会将其输出到Excel中,可能会执行文本到列,并将结果列表返回给用户。

您还可以传递和返回更复杂的数据结构。 VB6 / COM自动化的优点(我不知道这一点,直到我学会了在VB.NET或C#中更难实现),数据将无缝地流入和流出您的组件,所有必要的接口将为你创造。

对代码的主要更改是使用显式参数替换ThisWorkbook或ActiveSheet之类的内容,例如(Byval sht as Excel.Worksheet)。这些将在VB6的编译时捕获(因为它不知道ThisWorkbook是什么),所以你不能忽视它们;你被迫传递一个明确的参考。

我还注意到,如果接收到Worksheet或其他Excel对象作为参数,我在dll中的代码会变得更加偏执。在VBA中,您可能更确信您传递的是一个好的对象,因为它是给定工作簿的私有对象。 dll不知道是谁调用它,所以我更加怀疑地查看传入的对象(检查是否有任何内容,工作表名称,格式化线索以确保我使用我认为我正在使用的内容)。

我看到的唯一缺点是你必须得到一份Visual Basic 6.0。我在1998年买了它。它不再是微软提供的,但肯定有人会把它卖给你。最新的服务包是SP6。

在各种计算机上打开工作簿时,您还必须熟悉“regsvr32”和“regsvr32 / u”来处理“ActiveX无法创建组件”错误。我只是将我的dll发布到映射的网络驱动器,并在发生重大更改时在用户的计算机上重新注册它们。显然这是一个内部网/单一公司解决方案。发布更新的版本会更加分散您的痛苦。