开发背景
查阅微软官网说明,创建任务窗格恰恰VBA不包含在内,有的开发者为了创建该窗体需要转到.net或其它语言,需要学习大量知识。为了能解决该问题我们可以用VB6.0 或 C++中的MFC简单的创建一个ActiveX控件来分别给32-bit和64-bit的Office使用。
开发思路
做过任务窗格的开发者都知道,其实任务窗格是实现了微软公开的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
对外公布Connect对象,用延迟的方式公布创建窗体的方法。
生成插件给Excel用。
开发实战
给Excel准备一个标准的ActiveX控件,最简单用VB6.0来生成一个,但只能给32位的Excel使用。
建立好后,修改成自己想要的名字,直接编译即可。
这就是我们需要的ActiveX控件。接下来编写VBA代码。查阅Excel对象模型可以很容易获取Addin-in自身对象。
上面VBA代码可以成功的创建一个窗体,首先拿到Addin,然后调用Connect对象的CreatePane方法,使其延迟到VBA中来。
如果要发布到客户机器,只要注册这2个Dll,然后注意名称的使用即可。如果要创建64位Excel的任务窗格请看我另外一篇文章,在VB6.0同样能实现。
虽然可以创建这样的窗体,但是不能可视化设计,但可以换一个思路,先创建这样的窗体,然后利用窗口子类化的技术,将任务窗格作为容器,将普通的VBA中窗体放进去,这样就有应用价值了。
有兴趣的朋友可以加群:794568082互相交流学习。