VBA给Office添加任务窗格

开发背景

 查阅微软官网说明,创建任务窗格恰恰VBA不包含在内,有的开发者为了创建该窗体需要转到.net或其它语言,需要学习大量知识。为了能解决该问题我们可以用VB6.0 或 C++中的MFC简单的创建一个ActiveX控件来分别给32-bit和64-bit的Office使用。
VBA给Office添加任务窗格_第1张图片

开发思路

 做过任务窗格的开发者都知道,其实任务窗格是实现了微软公开的Office.ICustomTaskPaneConsumer接口公布的一个回调函数,当Office的加载项被加载时,Office会利用该接口的回调函数来创建一个这样的窗体,但我们需要提供对应版本的ActiveX控件。
 可以封装一个加载项,创建这样的窗体延迟到VBA中来即可。

开发原理

 ActiveX是一个标准的Com DLL,每个Com组件都有唯一的GUID,可以看成是一个身份证。且32位的Office只能加载32位的ActiveX,64位的只能加载64位的ActiveX。
 第一步制作一个标准的Office插件,以Excel为例。

Implements Office.ICustomTaskPaneConsumer'该接口就是Office创建任务窗格的接口,
'当Dll被加载时,该接口的回调函数会被调用,然后用工程方法创建窗体。

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)
'该回调函数时Dll加载时获取该Dll实例对象初始化工作。

End Sub

Private Sub ICustomTaskPaneConsumer_CTPFactoryAvailable(ByVal CTPFactoryInst As Office.ICTPFactory)
'该方法是创建窗体的回调函数,然后将其延迟到VBA中去。

End Sub

VBA给Office添加任务窗格_第2张图片
 对外公布Connect对象,用延迟的方式公布创建窗体的方法。
VBA给Office添加任务窗格_第3张图片
VBA给Office添加任务窗格_第4张图片
 生成插件给Excel用。

开发实战

 给Excel准备一个标准的ActiveX控件,最简单用VB6.0来生成一个,但只能给32位的Excel使用。
VBA给Office添加任务窗格_第5张图片
 建立好后,修改成自己想要的名字,直接编译即可。
VBA给Office添加任务窗格_第6张图片
 这就是我们需要的ActiveX控件。接下来编写VBA代码。查阅Excel对象模型可以很容易获取Addin-in自身对象。
VBA给Office添加任务窗格_第7张图片
VBA给Office添加任务窗格_第8张图片
 上面VBA代码可以成功的创建一个窗体,首先拿到Addin,然后调用Connect对象的CreatePane方法,使其延迟到VBA中来。
VBA给Office添加任务窗格_第9张图片
 如果要发布到客户机器,只要注册这2个Dll,然后注意名称的使用即可。如果要创建64位Excel的任务窗格请看我另外一篇文章,在VB6.0同样能实现。
VBA给Office添加任务窗格_第10张图片
VBA给Office添加任务窗格_第11张图片

 虽然可以创建这样的窗体,但是不能可视化设计,但可以换一个思路,先创建这样的窗体,然后利用窗口子类化的技术,将任务窗格作为容器,将普通的VBA中窗体放进去,这样就有应用价值了。
 有兴趣的朋友可以加群:794568082互相交流学习。

你可能感兴趣的:(VBA,VB6.0,API,编程语言)