【发布时间】:2011-03-05 03:18:37
【问题描述】:
我想创建一个 Excel Add,在其中创建一些额外的工具栏和菜单按钮。 但我希望仅在打开特定工作簿时加载此插件。如果有其他工作簿打开,我不想加载插件。
我想知道解决此问题的可能方法是什么,以及实现此插件(XLA 或 VSTO 或 COM 插件)的最佳方法是什么。
我不想让用户知道我的插件路径,加载/初始化插件所需的 VbA 代码。
【问题讨论】:
标签: com excel vsto excel-2007 vba
我想创建一个 Excel Add,在其中创建一些额外的工具栏和菜单按钮。 但我希望仅在打开特定工作簿时加载此插件。如果有其他工作簿打开,我不想加载插件。
我想知道解决此问题的可能方法是什么,以及实现此插件(XLA 或 VSTO 或 COM 插件)的最佳方法是什么。
我不想让用户知道我的插件路径,加载/初始化插件所需的 VbA 代码。
【问题讨论】:
标签: com excel vsto excel-2007 vba
这听起来像是 VSTO 文档项目的好案例;与扩展整个应用程序并因此适用于任何打开的文档的加载项不同,VSTO 文档项目是对特定文档的自定义,附加了额外的代码。
【讨论】:
在开始时创建工具栏,但将工具栏可见性设置为 false。使用 AddIn.Application.WorkbookOpen 事件的事件处理程序捕获正在打开的工作簿,并确定该工作簿是否是您想要的特定工作簿。此时您可以设置工具栏的可见性。
如果活动工作簿不是特定工作簿,您还可以捕获 AddIn.Application.WorkbookActivate 事件并再次隐藏工具栏。
记住要在 ThisAddIn 级别声明一个成员变量以保持对工具栏的引用!
【讨论】:
如果您真的只想在某个工作簿打开时加载插件,为什么不在相关工作簿的 Open 事件中加载它
' code in the ThisWorkbook module
Private Sub Workbook_Open()
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks("myAddin.xla")
If wb Is Nothing Then
Set wb = Application.Workbooks.Open("c:\path\myAddin.xls")
End If
End Sub
或者,任何其他工作簿或插件都可以包含代码来捕获 Excel 应用程序级别事件,例如 Workbook.Open,如果新打开的作品的名称是您感兴趣的名称,则执行任何操作,即加载插件
【讨论】: