VBE CreateToolWindow





0/5 (0投票)
在 VBA 编辑器中创建一个自定义的可停靠窗口。
引言
要在 Microsoft Excel VBA 编辑器中创建可停靠窗口,您必须确保创建的是 VBE (VBA) 加载项,而不是 Excel 加载项。 本文快速展示了如何使用 CreateToolWindow
方法在 VBA 编辑器中创建一个新的自定义窗口。
背景
网络上关于 Office 的 COM 加载项的文章很多讨论了 Excel、Word 或 Outlook 的加载项。 但很少有文章讨论为 Excel 的 Visual Basic 编辑器创建加载项。 VBE 也可以通过创建工具栏、菜单和可停靠窗口进行自定义。 可以在此处找到 API:http://msdn.microsoft.com/en-us/library/aa443985%28v=vs.60%29.aspx。
只有构建了真正的 VBE COM 加载项,而不是 Excel 加载项,才能使用 CreateToolWindow
方法。 CreateToolWindow
方法创建一个包含指示的 UserDocument
对象的新工具窗口。
使用代码
除了为 Excel 构建加载项并调用 Run
方法来强制 VBE 从 OnConnection
事件初始化之外,您还可以为 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 对象库
- Microsoft Office 14.0 对象库
添加一个名为 VBEConnect
的类到项目中,并在该类中实现 IDTExtensibility2
接口。 向项目中添加一个 User Document,并将其命名为 CoolDoc
,此用户文档将托管在 VBE 的新工具窗口中。 在类的顶部声明两个私有变量,m_cooldoc
作为 CoolDoc
和 m_window
作为 VBIDE.Window
。 m_window
对象将保存对我们即将创建的工具窗口的引用。 VBEConnect
类现在应该看起来像这样
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 加载项!
在之前的项目中(一个 Excel 加载项),我使用 Run
方法强制 VBE 启动并尝试执行 CreateToolWindow
,但这不起作用。 为了显示区别,以下是不起作用的代码
Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, _
ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)
Dim gxlApp as Excel.Application
Set gxlApp = Application
Dim gxCAI as Excel.Addin
Set gxCAI = AddInInst
On Error Resume Next
''' Force the VBE to initialize.
gxlApp.Run "xhYe1lsGtd3soe2t4ns"
On Error GoTo errorHandler
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
运行代码
在加载项工作之前,需要编译 DLL 并使用 regsvr32.exe 命令将其添加到注册表中。 需要在 Windows 注册表的以下位置创建正确的键:HKEY_CURRENT_USER/Software/Microsoft/VBA/VBE/6.0/Addins。
新键必须以项目名称和实现 IDTExtensibility2
接口的类命名:VBEDemo.VBEConnect
。 该键需要包含两个 DWORD
和两个字符串值
DWORD
:CommandLineSafe | 0DWORD
:LoadBehavior | 3- 字符串值:FriendlyName | VBEDemoToolWindow
- 字符串值:Description | 一个工具窗口 VBE 加载项演示
启动 Excel VBA 编辑器时,加载项将加载并且工具窗口将出现。 当然,这什么也没做,因为没有添加任何功能,但我欣喜若狂,因为我花了几个小时在网上搜索如何做到这一点(如果我可以说的话,没有成功),并且回到了反复试验。 我希望这篇小巧超级简单的文章可以为其他人节省几个小时。
历史
- 第一个版本:2012-01-05(是的,有些人仍然使用 VB6)。