掏耳朵,当然是一个看起来很寻常的动作,不过,一旦将掏耳朵的动作化用到板斧的招式上,那就是一个强大的杀招了。与此对应的是,将知识转为能力的过程。
通过前面两节的学习,我们对自定义功能区算是有了一个初步了解了。所以,这一节我们开始放弃改造标准功能区的方法,而是通过写XML代码来创建写自己的功能区。我们先来贴一段代码: - <customUIxmlns="http://schemas.microsoft.com/office/2009/07/customui">
- <ribbon startFromScratch="true">
- <tabs>
- <tab id="h" label="myTab"visible="true">
- <group id="k" label="myGroup">
- <button id="l" label="不准点这里" imageMso="CreateTable" size="large" supertip="点我我会生气的哦" onAction="test"></button>
- </group>
- </tab>
- </tabs>
- </ribbon>
- </customUI>
复制代码由于使用的是自定义控件,因此,这次我们用了id来识别,这是和之前不太一样的地方。另外,我们还注意到,这里在按钮里加了一个onAction。
我们把这段代码贴到替换掉之前的代码,关闭再打开文件(以下称“重新打开”),就可以看到文件只剩下一个tab了。如果这时候点击按钮的话,会弹出错误提示。——因为我们还没定义test。 我们先来创建一个宏看看怎么样? 由于文件会自动加载自定义功能区,因此我们需要再次关闭文件,按下shift键双击文件,以便绕过去而使用标准功能区。 点击“创建/宏”在下拉选框中选择“messagebox”,在消息参数里输入:“功能区,我来了!”,保存,在弹出的名称中输入“test”。 重新打开文件,这时候,我们再点击按钮,如预期一般,弹出了消息。 既然可以在功能区里可以执行宏,我们没理由不会想到,以前使用按钮完成的一些操作,例如导出某个查询的数据等等,是不是可以考虑通过这个来完成呢? 答案从理论上讲当然是可以的,前提是你必须要写好宏。 我们知道,宏能解决的问题相当有限,不少操作还是需要写函数的,这时候就需要宏里的杰出代表RunCode出马了。大家可以试试: 新建一个模块,写一个function【注意,执行RunCode宏时sub子过程往往会出错】。 - Function msg()
- MsgBox “功能区,我又来了!”
- End Function
复制代码删掉之前的MessageBox,在下拉选框中选择的宏RunCode,在参数栏输入:msg()
当函数较多的时候,每个函数都写一个RunCode来调用,显然挺麻烦的。那么能不能直接调用函数呢?我们把之前的test改为onAction=”msg”或者msg()”试试看?
如果我没猜错的话,应该又是很不幸地出错了。为什么呢?因为功能区只能接受宏或者回调函数。这是一个普通函数,而不是回调函数。
按我的理解,这里的回调函数,是将控件作为参数传递给函数,然后再调用该函数来执行操作。简单点说,点击按钮之后,就告诉函数,别人点我了,你给我出出气,函数接到信息之后就去说,按钮是我的小弟,你点它就是点我。这次弹个窗就算了,要是下次还这样……我继续弹个窗。 这时候我们引用Office15.0库(其它版本应该是12或者14),把上述的函数改为: - Function t msg (ByVal control As IRibbonControl)
- MsgBox “功能区,我就来了,又怎样?你的ID是:”& control.id
- End Function
复制代码把onAction改为onAction=”msg”,执行一下,看看是不是成功了?
需要注意的是,回调函数是必须在模块上创建的,也就是说,窗体级别上创建的函数是不能被调用的。 不过反过来倒是可以的,即在窗体上使用自定义功能区。在设计模式下,右击,依次选择属性,窗体,其它,在“功能区名称”里选择需要的功能区即可。 -----------------附件更新 2015-12-23 增加宏的测试。 说明:默认情况下是加载本系列第一个帖子的功能区,即隐藏“开始”选项卡和“导出”组。打开窗体后加载本文的功能区。
回调函数讲完之后,自定义功能区算是讲完的了,剩下的靠大家自行体会。如果需要进一步学习,可以考虑往Access加载项方向钻研。 不过,似乎还有些意犹未尽,如果后面有时间的话,我会把之前的一个例子做些改造,用来分配用户权限。 |