2013-12-11 53 views
1

我在文件服务器上的同一个共享文件夹中有许多Excel工作簿。在每个工作簿中都有一些数据和一个“更新图表”按钮,可根据数据生成/更新工作簿中的图表。将常用vba代码封装在单独的工作簿中

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

我宁愿有一个额外的工作簿,其中没有别的,但我的宏来生成/更新图表。所有其他工作簿应在按下按钮时调用这些宏。那样,当我必须改变图表生成时,我可以在一个地方完成。如果用户甚至不需要打开宏工作簿,最好的办法是。

对此有最佳做法/建议吗?如果多个用户同时更新工作簿并使用“更新图表”按钮生成图表,这可以安全地实现吗?

谢谢。

回答

2

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

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

在外接程序中,您需要一个自定义类模块,该模块可以对应用程序变量WithEvents进行尺寸调整。然后,您将使用Workbook_Open或Workbook_Activate事件来确定特定工作簿是否具有已定义的名称。

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

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

你不给了很多细节,所以也不能。但希望这将启动你正确的道路。

丝带回调

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

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

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

与色带,这是不同的。功能区控件(以XML定义)具有启用的属性。您可以将其设置为True或False。但是,您也可以选择不使用enabled属性,而是使用getEnabled属性。

getEnabled="InvoiceAppBtnPrintGetEnabled" 

然后在您的VBA中,仍然可以使用应用程序级别的事件。但是不要操纵CommandBarButton,只需使Ribbon失效即可。当功能区失效时,它强制它运行InvoiceAppBtnPrintGetEnabled过程,然后启用或禁用功能区按钮。

见罗恩去熊先生的网站获取更多信息:http://www.rondebruin.nl/win/s2/win013.htm

+0

迪克,我希望我不是太放肆,但我想知道你是否会介意扩大你的“回调”的解释?谢谢。 – DaveU

相关问题