VBA给Office添加任务窗格

  • Post author:
  • Post category:其他




开发背景

查阅微软官网说明,创建任务窗格恰恰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互相交流学习。



版权声明:本文为qq_25686631原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。