- Office VBA開發經典:中級進階卷
- 劉永富 劉行
- 1609字
- 2019-11-22 18:29:08
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函數用法。
- CMDB分步構建指南
- Visual Basic編程:從基礎到實踐(第2版)
- C/C++常用算法手冊(第3版)
- Learning Firefox OS Application Development
- Scala程序員面試算法寶典
- Learning Apache Karaf
- ASP.NET程序開發范例寶典
- 打開Go語言之門:入門、實戰與進階
- 編寫高質量代碼:改善Objective-C程序的61個建議
- .NET 4.5 Parallel Extensions Cookbook
- 大數據時代的企業升級之道(全3冊)
- Java從入門到精通(視頻實戰版)
- 基于MATLAB的控制系統仿真及應用
- Parallel Programming with Python
- 前端程序員面試算法寶典