在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。向项目添加以下引用:
向项目中添加一个名为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和两个字符串值: