RunMacro实现COM加载项的功能区按钮调用Excel、PowerPoint、Word中的VBA宏
我给大家介绍一款新的工具:RunMacro。
RunMacro简介
众所周知,Excel、PPT、Word文档或加载宏文件中可以写很多过程和函数,调试的过程中当然可以按F8或F5直接在VBA环境中运行。
不过,当你开发完一个工具的时候,一定会想到这些过程的执行方式,普遍的做法是向工作表上放置表单控件,用户在工作表上点击按钮来执行宏。
另外的方式,就是利用CustomUI技术,制作一个扩展名为xlam的加载宏文件,通过Ribbon中的按钮来调用VBA宏。这种方式虽然美观了,但是存在的问题是只要开发一个工具,就得修改或新建一个加载宏文件,冗余操作很多。
RunMacro是一个COM加载项,它的作用是根据外部XML文件呈现自定义功能区的按钮,当用户点击按钮就可以调用当前应用程序中的VBA过程和函数。真正做到了界面与功能分离。具体的好处是,用户不需要理解Ribbon的封装知识,会编辑简单的XML文件就可以更改界面,也用不着把XML压缩到Office文件。
市面上实现相同功能的其他插件几乎没有,这是重点。
*注意:一般情况下COM加载项里植入的功能区按钮只能调用COM加载项项目中的过程,而不是VBA中的过程。
为方便用户使用,我制作了携带版(免安装版)和安装版两种方式,携带版就是解压缩后的路径就是工作路径,没有安装目录的概念。
RunMacro携带版的用法
点击链接 https://share.weiyun.com/R3QI4yfl
进入腾讯微云,你必须登录QQ才能下载腾讯微云中的内容。登录以后再次进入,看到“工具大全”文件夹,从中找到RunMacro_Portable.zip。并且下载。
下载后,解压到不含空格的路径下(不要选择解压到当前文件夹)。例如E:\RunMacro_Portable
这些文件的主要功能:
- WK.bmp Watch.ico BQ.png:是一些示例自定义图标文件
- RegAsm.bat Unregasm.bat:注册与反注册用
- Excel.xml PowerPoint.xml Word.xml:这三个组件的示例自定义功能区的XML代码
- Portable.exe:安装界面
- RunMacro.dll:COM加载项的核心文件
安装RunMacro
这里用“安装”一词可能不妥,就是把该COM加载项部署一下的意思。
鼠标直接双击Portable.exe。首次使用的用户,上面的“安装 RunMacro”是黑色可用的,直接点击一下就行。
然后,重启Excel或PPT或Word。会看到出现“Run Macro in Excel”的新选项卡,并且包含6个按钮
这些按钮的出现,是和Excel.xml这个文件有关。用记事本打开看一下。
用户可以根据自己需要自由编辑这3个XML文件,只要是合法的Ribbon XML代码就行。注意按钮中的onAction属性,它必须是Application.Run可以调用的过程名称。例如某个按钮的 onAction="模块1.测试",那么你必须在VBA工程中有这个模块、有这个过程。
因此插入一个模块,书写一个过程“测试”:
接着点击功能区按钮,嘿!显然调用到了。
PowerPoint和Word情况,与上面相同,不需要重复讲述。
RunMacro的高级用法
RunMacro可以用于微软Office 32位、64位的Excel、PowerPoint、Word这三个组件,2007版以上支持自定义功能区的就可以。
另外,还可以用于金山软件的WPS三大组件(ET、WPP、WPS)
高级用法1:使用指定位置的XML文件
RunMacro使用的XML文件默认使用RunMacro.dll相同路径下的Excel.xml、PowerPoint.xml、Word.xml。实际上,用户可以使用电脑中任意路径下的XML作为功能区界面来源。
在注册表编辑器中打开如下路径:
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\RunMacro\XML
你一定可以看到右侧面板中的值和数据。
双击任意一个,例如双击Excel,就可以编辑了
修改为:D:\Temp\Demo.xml
点击“确定”按钮即可。
以后,只需要重新勾选RunMacro COM加载项,或者重启Excel,就会看到自定义界面来自于Demo.xml中的内容。
高级用法2:自定义按钮图标
RunMacro仍然采用微软标准的Ribbon XML规则。按钮的图标自然可以继续使用imageMso来引用内置图标。
如果要了解更多内置图标,可以参考我的关于imageMsoViewer软件方面的资料。
自定义图标的注意点有两个:
一是最上面一行的后面,必须添加 loadImage="LoadImage"
二是按钮使用image属性来指定图片的路径
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" loadImage="LoadImage"> <ribbon startFromScratch="false"> <tabs> <tab id="Tab1" label="RunMacro in Excel"> <group id="Group1" label="内置图标"> <button id="Button1" label="Test1" imageMso="_1" size="large" onAction="Module1.Test1"/> <button id="Button2" label="Test2" imageMso="_2" size="large" onAction="模块1.测试"/> <button id="Button3" label="Test3" imageMso="A" size="large" onAction="汇率计算!模块1.测试"/> </group> <group id="Group2" label="自定义图标"> <button id="Button4" label="bmp" image="WK.bmp" size="large" onAction="宏1"/> <button id="Button5" label="ico" image="Watch.ico" size="large" onAction="宏1"/> <button id="Button6" label="png" image="BQ.png" size="large" onAction="宏1"/> </group> </tab> </tabs> </ribbon> </customUI>
例如,上述XML中image="WK.bmp",显然是一个相对路径,此时,在RunMacro.dll文件的相同路径下必须有这个图片。
当然可以换成绝对路径,例如 image = "D:\Temp\Face.bmp"。
支持的图片格式
最好使用 .bmp .png .ico这三个格式的文件,不要使用.gif .jpg文件。
高级用法3:调用带参数的过程或函数
RunMacro的核心技术,是调用了Application的Run方法,通过字符串执行宏。onAction通常指定为一个无参数的Sub的名称。
也可以设置为带参数的。
例如VBA模块中有这样的函数:
Function Msg(number As Integer, unit As String) MsgBox (number * 1000) & unit End Function
对应的onAction是:
onAction='模块1.Msg(3.14,"吨")'
注意!其他的XML属性都是用双引号包围,但是这里特殊,Msg函数参数自带双引号,外部必须换成单引号。
效果如下。
高级用法4:在WPS软件中使用
WPS中的ET和微软的Excel用法相同,也是调用Excel.xml中的。
效果如下:
WPP和WPS与PPT、Word用法相同,不再举例。
RunMacro安装版
为了更方便用户的使用,还制作了安装版,用户同样可以从腾讯微云下载到RunMacro-Setup.exe,双击安装即可。
安装后产生如下文件:
使用方法与便携版相同。
另外,会看到还有3个XML文件,例如用记事本打开Excel.xml,显然这是一个定制功能区的XML代码,默认情况下有四个button,注意里面的每个onAction,用它来指代点击按钮调用哪一个VBA过程,红框中的部分,是不是一看就明白?
这个文件其他位置的编辑方法没什么两样,唯一注意的是就是onAction要写上VBA中确实存在的过程名称。当然你需要事先准备好的VBA代码了,假设你做了一个“上传工具.xlsm”,里面有个模块Module2,里面包含一个ABC过程。
那么它恰好对应于<button id="Button3" label="Button3" imageMso="C" size="large" onAction="上传工具.xlsm!Module2.ABC"/>
当你点击Button3这个按钮时,弹出一个“好棒呀”,这显然是VBA中的过程。
对于PowerPoint、Word,做法与Excel类似。效果如下:
点击四个按钮其中的一个,会弹出错误对话框,这是很正常的。因为,我打开的幻灯片是空白的,没有任何宏。你需要事先准备一下。
总结
在使用工具的过程中,我们需要做的有两点,一是把VBA开发的工具做好,过程名明确,宏名是什么,它的模块名是什么,文件名是什么。
二是根据VBA中的过程路径,来修改对应的XML文件中的onAction属性,我提供的模板仅仅是默认值,大家可以根据customUI的知识任意修改XML。
那么,RunMacro究竟带来了哪些好处呢?
1.用户不需要设计加载宏,也不需要开发COM加载项,只负责开发VBA部分即可。
2.根据VBA工程结构,修改对应XML文件,是不是太简单。