您需要使用代码创建加载项。用户加载一次加载项并保持加载到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
迪克,我希望我不是太放肆,但我想知道你是否会介意扩大你的“回调”的解释?谢谢。 – DaveU