创建VBA编辑器工具窗口的COM插件

在Office套件中,经常看到Excel、Word或Outlook的插件,但很少有人讨论如何为Excel的Visual Basic编辑器(VBE)创建插件。VBE不仅可以自定义工具栏、菜单,还可以创建可停靠的窗口。本文将介绍如何使用CreateToolWindow方法在VBA编辑器中创建一个新的自定义窗口。

虽然网络上有许多关于Office插件的文章,但很少有人讨论如何为Excel的VBE创建插件。VBE可以通过API进行定制,创建工具栏、菜单和可停靠窗口。API的详细信息可以在以下网址找到:

CreateToolWindow方法只能在构建真正的VBE COM插件时使用,而不能用于Excel插件。

使用代码

与构建Excel插件并调用Run方法以从OnConnection事件强制初始化VBE不同,也可以为VBA编辑器构建一个VBE COM插件。唯一的区别是注册表键的位置与Excel插件不同。需要进行相同的注册表条目,但放置在以下位置:

HKEY_CURRENT_USER/Software/Microsoft/VBA/VBE/6.0/Addins

创建VB6项目

VB6中创建一个新的ActiveX DLL项目,并将其命名为VBEDemo。向项目添加以下引用:

  • Microsoft Add-In Designer
  • Microsoft Visual Basic for Applications Extensibility 5.3
  • Microsoft Excel 14.0 Object Library
  • Microsoft Office 14.0 Object Library

向项目中添加一个名为VBEConnect的类,并在该类中实现IDTExtensibility2接口。向项目中添加一个用户文档,并将其命名为CoolDoc,这个用户文档将在VBE中的新工具窗口中托管。在类的顶部声明两个私有变量,m_cooldoc作为CoolDoc,m_window作为VBIDE.Window。m_window对象将保存即将创建的工具窗口的引用。

VBEConnect类现在应该看起来像这样:

VBScript Option Explicit Implements AddInDesignerObjects.IDTExtensibility2 Private m_cooldoc As CoolDoc Private m_window As VBIDE.Window Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant) 'do nothing End Sub Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant) 'do nothing End Sub Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, _ ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _ ByVal AddInInst As Object, custom() As Variant) On Error GoTo errorHandler Dim app As VBIDE.VBE Set app = Application Set m_window = app.Windows.CreateToolWindow(AddInInst, _ "VBEDemo.CoolDoc", _ "My CoolDoc", _ "anystring", m_cooldoc) m_window.Visible = True errorHandler: Select Case Err.Number Case 0 Case Else Debug.Print Err.Number & _ " " & Err.Description End Select End Sub Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As _ AddInDesignerObjects.ext_DisconnectMode, custom() As Variant) 'do nothing End Sub Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant) 'do nothing End Sub

魔法发生在OnConnection事件中。在这里声明了一个VBIDE.VBE应用程序对象,用于调用CreateToolWindow方法。该方法接受当前插件和用户文档作为参数,如果创建的是Excel COM插件,这里就会出现问题。AddInInst对象必须是VBE插件,而不是Excel插件!

运行代码

在插件工作之前,需要编译DLL并使用regsvr32.exe命令将其添加到注册表。需要在Windows注册表中创建适当的键,位置如下:

HKEY_CURRENT_USER/Software/Microsoft/VBA/VBE/6.0/Addins

新键必须以项目名称和实现IDTExtensibility2接口的类命名:

VBEDemo.VBEConnect

该键需要包含两个DWORD和两个字符串值:

  • DWORD: CommandLineSafe | 0
  • DWORD: LoadBehavior | 3
  • 字符串值: FriendlyName | VBEDemoToolWindow
  • 字符串值: Description | A Tool Window VBE Addin Demo
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485