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文件,是不是太简单。

 

posted @ 2019-06-30 09:28  ryueifu  阅读(3430)  评论(0编辑  收藏  举报