将常见的vba代码封装在单独的工作簿中

我在文件服务器上的同一个共享文件夹中有许多Excel工作簿。 在每个工作簿中都有一些数据和一个“更新图表”button,可根据数据生成/更新工作簿中的图表。

这是所有的实施和工作,但我有一个维护问题…如果我必须改变或修复我的macros中的东西,我必须更新所有工作簿中的macros。

我宁愿有一个额外的工作簿,不包含其他任何东西,但我的macros生成/更新图表。 所有其他工作簿应该按下button时调用这些macros。 这样,当我必须改变图表生成时,我可以在一个地方做到这一点。 如果用户甚至不需要打开macros工作簿,最好的办法是。

有最好的做法/build议吗? 如果多个用户同时更新工作簿并使用“更新图表”button生成图表,这可以安全地实现吗?

谢谢。

您需要使用代码创build一个加载项。 用户加载一次加载项并保持加载到Excel,直到它被删除。 代码总是准备好执行。

加载项需要能够识别何时工作簿是正确的代码工作簿。 我在所有附加的“appicable”工作簿中使用了一个定义的名称。 如果activeworkbook有这个名字,那么代码将会运行。 否则它不会。

在外接程序中,您需要一个自定义类模块来定义一个ApplicationvariablesWithEvents。 然后,您将使用Workbook_Open或Workbook_Activate事件来确定特定的工作簿是否具有已定义的名称。

我不喜欢使用工作表button来做这种事情。 当控件位于与代码不同的工作表上时,ActiveX控件很脆弱(您会遇到很多自动化错误)。 而表单button没有事件,所以他们很难挂钩。

我通常使用带有callback的function区button。 callback根据活动手册是否适用来启用/禁用function区。

你没有提供很多细节,我也没有。但是,希望这会使你走上正确的道路。

function区callback

您可以确保代码只在正确的条件下运行的方法之一是检查过程顶部的那些条件。 但是,我喜欢这样做的方式是使用户界面元素不可用,除非条件适当。

在过去,这意味着设置CommandBarButton的Enabled属性。 我会使用应用程序级别的事件,以便每次激活工作簿窗口时,这样的代码将运行

Application.Commandbars("mybar").Controls("PrintInvoice").Enabled = IsInvoice(ActiveWorkbook) 

用丝带,它是不同的。 function区控件(在XML中定义)具有启用的属性。 您可以将其设置为True或False。 但是,您也可以select不使用enabled属性,而是使用getEnabled属性。

 getEnabled="InvoiceAppBtnPrintGetEnabled" 

然后在你的VBA中,你仍然可以使用应用程序级事件。 但是,而不是操作一个CommandBarButton,只是无效的function区。 当您使function区无效时,会迫使其运行您的InvoiceAppBtnPrintGetEnabled过程,然后启用或禁用function区button。

有关更多信息,请参阅Ron de Bruin的网站: http : //www.rondebruin.nl/win/s2/win013.htm