将通用vba代码封装在单独的工作簿中

将通用vba代码封装在单独的工作簿中,vba,excel,charts,Vba,Excel,Charts,我在文件服务器的同一共享文件夹中有许多Excel工作簿。在每个工作簿中都有一些数据和一个“更新图表”按钮,该按钮根据数据生成/更新工作簿中的图表 这是所有实施和工程,但我有一个维护问题。。。如果我必须更改或修复宏中的某些内容,我必须更新所有工作簿中的宏 我希望有一个额外的工作簿,其中不包含任何其他内容,而是包含生成/更新图表的宏。按下按钮时,所有其他工作簿都应调用这些宏。这样,当我必须更改图表生成时,我可以在一个地方进行更改。最好是用户甚至不必打开宏工作簿 是否有最佳实践/建议?如果多个用户同时

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

这是所有实施和工程,但我有一个维护问题。。。如果我必须更改或修复宏中的某些内容,我必须更新所有工作簿中的宏

我希望有一个额外的工作簿,其中不包含任何其他内容,而是包含生成/更新图表的宏。按下按钮时,所有其他工作簿都应调用这些宏。这样,当我必须更改图表生成时,我可以在一个地方进行更改。最好是用户甚至不必打开宏工作簿

是否有最佳实践/建议?如果多个用户同时更新工作簿并使用“更新图表”按钮生成图表,那么这是否可以安全地实现


谢谢。

您需要使用代码创建一个外接程序。用户加载外接程序一次,并将其保存在Excel中,直到将其删除。代码总是在那里,随时可以执行

外接程序需要能够识别工作簿何时是代码的正确工作簿。我在所有“可应用于”外接程序的工作簿中使用定义的名称。如果activeworkbook具有该名称,则代码将运行。否则就不会了

在外接程序中,您需要一个自定义类模块,用于使用事件对应用程序变量进行尺寸标注。然后,您将使用“工作簿打开”或“工作簿激活”事件来确定特定工作簿是否具有已定义的名称

我不喜欢用工作表上的按钮来做这种事情。当控件与代码位于不同的工作表上时,ActiveX控件是脆弱的(您会遇到许多自动化错误)。表单按钮没有事件,因此更难连接

我通常使用带有回调的功能区按钮。回调将根据Active工作簿是否适用来启用/禁用功能区

你没有给出很多细节,所以我也不能。但希望这能让你走上正确的道路

功能区回调

确保代码只在正确的条件下运行的方法之一是在过程的顶部检查这些条件。然而,我更喜欢这样做的方式是,除非条件合适,否则用户界面元素不可用

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

Application.Commandbars("mybar").Controls("PrintInvoice").Enabled = IsInvoice(ActiveWorkbook)
有了丝带,就不一样了。功能区控件(在XML中定义)具有启用的属性。您可以将其设置为True或False。但是您也可以选择不使用enabled属性,而是使用getEnabled属性

getEnabled="InvoiceAppBtnPrintGetEnabled"
然后在VBA中,仍然可以使用应用程序级事件。但是,您只需使Ribbon无效,而不是操纵CommandBarButton。使功能区无效时,它将强制功能区运行InvoiceAppBtnPrintGetEnabled过程,然后该过程将启用或禁用功能区按钮


有关更多信息,请访问Ron de Bruin的网站:

Dick,我希望我不是太专横,但我想知道您是否介意扩展您的“回调”解释?谢谢