VBA专题10-6:使用VBA操控Excel界面之执行命令以及激活功能区选项卡的两种方法

2020-09-25 11:34:18 浏览数 (1)

执行在功能区和不在功能区中的命令

在上篇文章中,通过下面的语句来执行MinimizeRibbon命令:

Application.CommandBars.ExecuteMso(idMso)

该方法仅接受1个参数:idMso,指定命令的名称(也被称作该控件的标识符)。MinimizeRibbon是不在功能区中的一个命令。

下面展示的是执行不在功能区中的命令的另一个示例:

'启动计算器程序

Application.CommandBars.ExecuteMso "Calculator"

接下来的示例执行功能区中的命令,它们通过功能区控件图形化呈现:

'拆分活动窗口成窗格,移除拆分窗格

'可通过选择视图|窗口|拆分实现

'也可执行下面的ExecuteMso方法

Application.CommandBars.ExecuteMso "WindowSplitToggle"

Excel有超过10000个idMso,那是在功能区和不在功能区中命令的名字。

idMso可以是命令的名字,内置选项卡的名字,或者其它内置元素的名字。可以在网上搜索下载关于Excel内置控件名字的文档。

激活功能区选项卡的两种方法

下面介绍激活特定功能区选项卡的两种不同方法。一种是使用SendKeys方法模拟按键,就好像是手工按活动窗口中的键一样;另一种是使用XML和VBA代码。

SendKeys方法

例如,下面的VBA代码模拟按下ALT、A和ALT键:

Application.SendKeys "%A%"

将上面的语句放在Workbook_Open事件中,在打开该工作簿时,将激活“数据”选项卡:

Private Sub Workbook_Open()

Application.SendKeys "%A%"

End Sub

注意,在Excel的有些版本中,在Excel窗口被装载之前,Workbook_Open事件中的SendKeys方法执行得过早。为了解决这个问题,可以使用OnTime事件在执行Workbook_Open事件一至两秒后,发送按键,如下面的代码:

Private Sub Workbook_Open()

'在1秒后执行SendKeystrokes过程

Application.OnTime Now TimeValue("0:0:1"), "SendKeystrokes"

End Sub

Sub SendKeystrokes()

Application.SendKeys "%A%"

End Sub

下面列出了代表键的代码:

为了避免不可预料的结果,总是使用SendKeys方法作为最后的手段,并且确保活动窗口是想要发送按键的正确的窗口。

XML和VBA代码(Excel 2010及以后的版本)

激活功能区选项卡的另一种方法是使用XML和VBA代码。执行下列步骤:

1. 下载CustomUI Editor并安装。

2. 创建新工作簿并将其保存为启用宏的工作簿。

3. 关闭该工作簿并在CustomUI Editor中打开。

4. 在CustomUI Editor中,单击插入并选择Office 2007 Custom UI Part。

选择这个选项使工作簿与Excel 2007及后续版本兼容。

5. 复制并粘贴下面的XML代码:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"onLoad="Initialize">

</customUI>

onLoad是一个回调属性,有一个VBA过程的名称赋给它,本例中的过程命名为Initialize,当打开工作簿时调用此过程。

6. 单击Validate按钮来检查是否有错误。

7. 单击Generate Callbacks按钮生成Initialize回调过程:

' customUI.onLoad的回调

Sub Initialize(ribbon as IRibbonUI)

End Sub

复制该回调过程,用于稍后粘贴到工作簿的标准VBA模块中。

8. 保存并关闭该文件。

9. 在Excel中打开该文件。

由于Initialize过程仍然没有准备执行,因此会出现错误消息,单击“确定”。

10. 按Alt F11打开VBE。

11. 插入一个标准模块,粘贴刚才复制的回调过程,并修改代码如下:

Public myRibbon As IRibbonUI

' customUI.onLoad的回调

Sub Initialize(ribbon As IRibbonUI)

Set myRibbon = ribbon

End Sub

当在Excel中打开该工作簿时,执行Initialize过程,获取功能区对象引用赋值给myRibbon对象变量。使用对功能区的引用,可以接着通过myRibbon对象激活功能区选项卡(以及使功能区中的选项卡和控件无效)。

12. 保存,关闭,然后重新打开该工作簿。

要激活特定的内置功能区选项卡,例如“数据”选项卡,使用下面的代码:

myRibbon.ActivateTabMso "TabData"

如果要在打开工作簿时激活“数据”选项卡,在Initialize过程中插入上面的语句:

Sub Initialize(ribbon As IRibbonUI)

Set myRibbon = ribbon

'激活功能区的数据选项卡

myRibbon.ActivateTabMso "TabData"

End Sub

如果要激活自定义的功能区选项卡,例如id为MyCustomTab的自定义选项卡,使用下面的代码:

'激活id为MyCustomTab的自定义选项卡

myRibbon.ActivateTab "MyCustomTab"

注意,ActivateTabMso方法和ActivateTab方法仅适用于Excel 2010及后续版本,不能用于Excel 2007。

上面程序中ActivateTabMso方法的参数值“TabData”是idMso,我们将在下面的文章中讨论什么是idMso以及如何识别它们。

说明:本专题系列大部分内容学习整理自《Dissectand Learn Excel VBA in 24 Hours:Changingworkbook appearance》,仅供学习研究。

0 人点赞