【问题标题】:How to create a workboook specific Excel Add in如何创建特定于工作簿的 Excel 插件
【发布时间】:2011-03-05 03:18:37
【问题描述】:

我想创建一个 Excel Add,在其中创建一些额外的工具栏和菜单按钮。 但我希望仅在打开特定工作簿时加载此插件。如果有其他工作簿打开,我不想加载插件。

我想知道解决此问题的可能方法是什么,以及实现此插件(XLA 或 VSTO 或 COM 插件)的最佳方法是什么。

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

【问题讨论】:

    标签: com excel vsto excel-2007 vba


    【解决方案1】:

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

    【讨论】:

    • 缺点是 VSTO 文档项目需要在您进行生产部署时将特定程序集加载到 GAC,这在某些企业环境中可能是一个安全问题。否则是一条好路。
    【解决方案2】:

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

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

    记住要在 ThisAddIn 级别声明一个成员变量以保持对工具栏的引用!

    【讨论】:

    • 这行得通,但有一点需要注意:无论打开哪个工作簿,都会加载加载项。如果我理解您所描述的内容,那么您实际上是在根据工作簿触发加载项是否可见。
    • @Mathias,必须始终加载加载项。这正是 VSTO 加载项加载程序的工作方式。如果要控制加载项的物理加载/卸载,则必须编写自己的 AddInLoader.dll。
    • 我同意@Mathais。我什至不想加载插件。
    【解决方案3】:

    如果您真的只想在某个工作簿打开时加载插件,为什么不在相关工作簿的 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,如果新打开的作品的名称是您感兴趣的名称,则执行任何操作,即加载插件

    【讨论】:

    • 我也不想让用户知道我的插件是如何加载的,插件的路径是什么以及加载/初始化插件的代码
    • @Ankit,如果您使用 VBA,您可以通过密码保护项目。它并不完全安全,但它会阻止大多数用户。插件的“路径”是您安装插件的位置。如果它与工作簿位于同一路径中,请参考上面的示例,您可以使用 Set wb = Application.Workbooks.Open(ThisWorkbook.Path & "\myAddin.xla")。不确定“初始化”插件是什么意思。通常你会在插件的打开/关闭事件中包含创建/删除菜单等的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多