Office VBA开发经典:中级进阶卷
上QQ阅读APP看书,第一时间看更新

2.8 自动发送按键

日常办公过程中,计算机的绝大多数操作都是通过操纵鼠标和键盘完成的。对于Office文档的处理,使用VBA编程可以很好地完成,但是如果要处理屏幕上不属于Office管辖的窗口,就需要自动按键、自动单击鼠标的技术。

关于自动单击鼠标,需要用到API技术,本书暂不作介绍。

虽然在Excel VBA中Application对象也有Sendkeys方法,但是仅限于Excel VBA,Office的其他组件(PowerPoint、Word等)的VBA模型中并未提供这个方法。因此,本节讲述更加通用的WshShell的Sendkeys方法以实现自动按键。

熟练掌握自动按键,可以在非Office窗口中实现类似于VBA操作的效果,更大程度地减少手工操作。

2.8.1 按键写法

WshShell的Sendkeys方法的功能就是在活动窗口中,按下指定的键(键盘上的键)。这里所说的活动窗口就是屏幕上置于最前的、具有焦点的一个窗口,而并非其代码宿主程序。

Sendkeys语法很简单,然而重点和难点在于按键字符串的构造。因此首先列出键和代码的对应关系,如表2-4所示。

表2-4 SendKeys用到的按键写法

例如,要在一个窗口中按下退格键,书写代码的方法如下。

    WshShell.SendKeys "{BACKSPACE}"

下面的实例首先启动记事本,其次输入英文单词,然后按下退格键删掉最后一个字符。

代码分析:Delay过程用于延时,Delay 1表示程序暂停1秒,这个技术经常用于自动发送按键的程序中。

SendKeys "Excel VBA",相当于依次按了9次键盘,每次按的都是字母键。因此向一个接受文字的区域输入英文句子,就可以采用这种方式。SendKeys "{BackSpace}"千万不能写成SendKeys "BackSpace",因为这样表示连续按下多次字母键。

除了输入英文外,还可以输入键盘上的符号,例如SendKeys "3*2="就自动输入一个数学题。

注意,发送一个英文字母或符号可以用花括号括起来,但是两个以上不可,例如SendKeys "{M}"是允许的,但SendKeys {VBA}"不允许。

2.8.2 多次按同一个键

如果要多次按下同一个键,键码必须放在花括号内,然后输入空格和次数。例如下面这些示例。

SendKeys "138{6 4}{8 4}"表示输入13866668888。

SendKeys "{Enter 3}"表示连续按下3次回车键。

SendKeys "{+ 3}{—3}"表示连续按3次加号,然后按3次减号。

利用这个特点,经常可以在文字中移动光标,例如SendKeys "Microsoft{Left 4}{Right 2}"表示在记事本程序中输入Microsoft这个单词,然后按下4次左箭头、2次右箭头,从而把光标移动到o与f之间。

2.8.3 组合按键

如果要发送包含Ctrl、Alt、Shift的组合键,分别用^、%、+表示。

SendKeys "^o"或者SendKeys "^{o}"表示按下。【Ctrl+O】,用来打开文件。

SendKeys "+{F3}"表示按下快捷键【Shift+F3】。

SendKeys "%f"表示按下快捷键【Alt+F】,经常用于显示文件菜单。

下面的代码向记事本程序输入一个英文句子,然后调出记事本程序的替换对话框快捷键【Ctrl+H】,把里面的字母o全部替换为X。

代码分析:SendKeys "{Tab}"表示切换控件焦点,也就是从查找文本框切换到替换文本框中。这一步是必不可少的。

在记事本程序的替换对话框中,“全部替换”按钮中有个带下画线的字母A,意思是用【Alt+A】快捷键按下该按钮,因此采用代码SendKeys "%a"。

最后一句代码SendKeys "{ESC}",表示按下【Escape】关闭替换对话框。

执行上述过程,可以看到其中的字母被替换,如图2-47所示。

图2-47 使用Sendkeys自动操作记事本程序

2.8.4 特殊符号的输入

前面讲过,双引号中的^、%、+被转义为组合键,如果需要输出这几个字符本身,就需要把它们放在花括号内。例如,SendKeys "{+}{%}"表示往记事本中写入+%。

此外,要输出花括号本身,也需要把它们套在花括号内。例如SendKeys "{}}{{}"表示往记事本中写入}{。

2.8.5 循环中使用按键

如果按键的内容相同或者类似,可以把Sendkeys方法放在循环结构中,从而减少Sendkeys的书写次数。

下面的代码把Excel单元格区域中的内容顺次打印到记事本程序中。

可以看出代码中只有两处Sendkeys,就把12个单元格的内容发送到记事本程序中,如图2-48所示。

图2-48 循环使用Sendkeys

下面是一个技术点比较综合的实例,希望读者仔细分析其细节。

2.8.6 关于自动按键的补充说明

也就是说,不仅可以用Sendkeys方法输入文本,还可以自动单击窗口的菜单、设定对话框中的控件参数等。

但是Sendkeys存在如下几个不足。

 不能发送中文字符。

 不能发送一部分特殊按键,例如Windows键(Ctrl和Alt之间的键)。

 被操作的窗口不能被遮挡,不能失去焦点。

对于中文或其他字符串的发送,可以借助剪贴板的功能,先把中文发送到系统的剪贴板上,然后发送按键【Ctrl+V】再粘贴中文即可。

如果要按下特殊按键,还需要借助API函数,本书暂不讲解API函数用法。