在工作簿之间共享VBA模块

时间:2019-03-27 08:15:25

标签: excel vba

我有很多工作簿。每个工作簿都包含许多电子表格,除了所携带的数据外,所有工作簿都完全相同。每个工作簿都有许多VBA模块,当我对一个模块进行更改时,我需要将对所有其他模块的相同更改推送到所有其他工作簿。

是否可以在所有工作簿中共享VBA模块,所以我只能在一个地方进行更改?

2 个答案:

答案 0 :(得分:1)

我对这种东西有一个业余的解决方法。在我的办公室里,大约有15个人在EXCEL上共享一些公用程序和UDFS。当必须修改或改进代码时,我们不得不更改15份Excel工作簿。浪费时间

  

首先,我必须说,要使此解决方案起作用,所有用户   需要共享一个文件夹,您可以在其中放置共享工作簿   每个人都可以访问。 如果用户无法共享任何内容,则此解决方案   将无法正常工作。

我们为我们找到了一个简单的解决方案。 我敢肯定,确实有一种更好的方法可以做到这一点,并且更加优雅,但这在过去的十年中对我们有效,我们已经受够了。

我们创建了一个主工作簿,其中包含我们需要的所有子功能。我将举一个简单的例子。该主工作簿名为MASTER_WB(VBAProject的标题也为MASTER_WB)

enter image description here

此MASTER_WB将保存您的所有实用程序和通用代码。如您在图像中看到的,我键入了1个sub和1个UDF确实很简单(如Public,可从任何地方调用)。

此外,我强烈建议您在MASTER_WB中键入的每个子/函数中使用MW缩写。这样,您可以100%确保在调用同一过程的USER_WB和MASTER_WB之间没有名称冲突。 这只是个人喜好。

在此MASTER_WB中,相关代码在工作簿对象中:

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub

Private Sub Workbook_Open()
If Application.Workbooks.Count > 2 Then '2 BECAUSE I got also PERSONAL MACRO WORKBOOK
    ThisWorkbook.IsAddin = True
Else
    ThisWorkbook.IsAddin = False
End If
End Sub

现在,我们保存并关闭MASTER_WB,然后在模块的每个USER_WB中,添加新创建的MASTER_WB作为参考:

enter image description here

请注意,在每个USER_WB中,我们还键入代码以调用在MASTER_WB中创建的那些公共子对象和UDF:

Option Explicit

Sub ESTE_LIBRO()
Call MASTER_UTILITIES.MW_ESTE_LIBRO(ThisWorkbook)
End Sub

Function PORTRES(vRNG As Range) As Double
PORTRES = MASTER_UTILITIES.MW_PORTRES(vRNG)
End Function

仅此而已!现在,每个USER_WB都可以访问存储在MASTER_WB中的UDF和子程序。而当我们需要进行更新/更改时,我们只需更新MASTER_WB。

如果我们创建 UDF / SUB,则可以,需要在两个工作簿中都创建它。 MASTER_WB将自己保存代码,并且每个USER_WB都需要在其模块中添加以下内容:

Sub MY_NEW_SUB()
Call MASTER_UTILITIES.MY_NEW_SUB
End Sub

此外,如果sub / udf的参数/参数更改,是的,还需要更新每个USER_WB。

但是,至少在我们办公室里,当我说这是值得的时候,请相信我,因为这些情况并不常见。最常见的一种就是改进/添加新的代码行,因此更新MASTER_WB将使新代码可用于所有已连接的USER_WB,而无需执行15次。

正如我在第一行所说。 这不是最优雅的解决方案,可以肯定会有更好的解决方案,但是我可以说它对我们有用。我想学习有关开发外接程序的一天,但是现在,我们使用此业余修补程序。

希望您可以使其适应您的需求。

答案 1 :(得分:1)

将代码移动到单独的Excel工作簿中,并将其另存为.xlam(启用Excel宏的加载项)。

从所有其他文件的工具-引用中引用加载项(单击浏览,将文件类型更改为“ Microsoft Excel文件”,然后导航到xlam文件)。

仔细检查代码,确保正确编写并正确引用工作簿和工作表。例如。 ThisWorkbook现在将引用外接工作簿,而不是调用它的文档。