Com 如何创建特定于workboook的Excel加载项

Com 如何创建特定于workboook的Excel加载项,com,excel,vsto,excel-2007,vba,Com,Excel,Vsto,Excel 2007,Vba,我想创建一个excel加载项,它可以创建一些额外的工具栏和菜单按钮。 但我希望此加载项仅在打开特定工作簿时加载。如果其他工作簿打开,我不想加载加载项 我想知道解决此问题的可能方法以及实现此加载项(XLA或VSTO或COM加载项)的最佳方法 我不想让用户知道我的加载项路径,加载/初始化加载项所需的VbA代码。这听起来像是VSTO文档项目的一个好例子;与扩展整个应用程序并应用于任何打开的文档的加载项不同,VSTO文档项目是特定文档的自定义,附加了额外的代码。在开始时创建工具栏,但将工具栏可见性设置为

我想创建一个excel加载项,它可以创建一些额外的工具栏和菜单按钮。 但我希望此加载项仅在打开特定工作簿时加载。如果其他工作簿打开,我不想加载加载项

我想知道解决此问题的可能方法以及实现此加载项(XLA或VSTO或COM加载项)的最佳方法


我不想让用户知道我的加载项路径,加载/初始化加载项所需的VbA代码。

这听起来像是VSTO文档项目的一个好例子;与扩展整个应用程序并应用于任何打开的文档的加载项不同,VSTO文档项目是特定文档的自定义,附加了额外的代码。

在开始时创建工具栏,但将工具栏可见性设置为false。捕获正在使用AddIn.Application.WorkbookOpen事件的事件处理程序打开的工作簿,并确定该工作簿是否为所需的特定工作簿。此时,可以设置工具栏的可见性

如果活动工作簿不是特定工作簿,还可以捕获AddIn.Application.WorkbookActivate事件并再次隐藏工具栏


记住在ThisAddIn级别声明成员变量,以保留对工具栏的引用

如果确实只希望在打开某个工作簿时加载加载项,为什么不在相关工作簿的打开事件中加载它

' 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应用程序级事件,例如工作簿.Open,如果新打开的工作的名称是您感兴趣的名称,请执行任何操作,即加载有效的加载项,但有一条警告:无论打开哪个工作簿,都将加载加载项。如果我理解您所描述的内容,您实际上是在触发基于工作簿的外接程序是否可见。@Mathias,外接程序必须始终加载。这就是加载程序工作的方式。如果要控制外接程序的物理加载/卸载,必须编写自己的AddInLoader.dll。我同意@Mathais。我甚至不想加载加载项。缺点是VSTO文档项目需要在进行生产部署时将特定程序集加载到GAC,这在某些企业环境中可能是一个安全问题。我也不想让用户知道我的插件是如何加载的,插件的路径是什么,以及加载/初始化插件的代码addin@Ankit,如果您使用的是VBA,则可以保护项目。它不是完全安全的,但它会阻止大多数用户。加载项的“路径”位于安装加载项的任何位置。如果它与工作簿位于同一路径中,请参考上面的示例,您可以使用Set wb=Application.Workbooks.Open(thiswoolk.Path&“\myAddin.xla”)。不确定“初始化”加载项是什么意思。通常,您会在加载项的打开/关闭事件中包含创建/删除菜单等的代码