中國電子科技集團公司第二十九研究所 羅 剛 羅小平 薛 磊
日常生活、工作、學習中,計算機操作很簡單,但在操作過程中,很多事情在流程上都具有重復性。也許你每天啟動計算機第一件事都是登陸某個網站,打開常用的辦公軟件,也許需要對文件進行大量的重命名、復制、粘貼、刪除、數據處理等操作,重復、瑣碎,讓人容易產生疲勞,甚至出錯。
有沒有一種簡單易學的編程語言,能代替人工實現自動化操作呢?VBS是一款非常適合的工具。
VBS是VBScript的簡寫,不同于其他高級語言,它是基于Visual Basic的腳本語言。不需要先去學習系統架構,復雜的語法、命令、算法等,用VBS編寫的代碼簡單、易學、高效,也不用編譯轉換成exe,源代碼可直接由Windows系統執行,大部分高級語言能處理的,VBS基本都具備。VBS編輯工具為文本編輯器,最常見的就是記事本,編輯好后保存為*.vbs的文件,雙擊即可運行。
用Dim來聲明變量,類型不需要聲明,對變量、函數、方法、對象的引用是也不區分大小寫的。需要注意的是,不允許在聲明變量的同時給變量賦值,多個變量用逗號隔開,注釋用分號標注,VBS中所有符號只能是英文符號。用Const定義常量,需在定義時賦值。如:
Dim a,b ‘定義變量a和b
Const c=10 ‘定義常量c,值為10
Inputbox,運行后彈出帶提示且可輸入內容的對話框,返回值將傳遞給函數或變量。如:
a=Inputbox(“提示”) ‘引號內為提示消息
Msgbox,以對話框形式觀察輸出結果。如:
Msgbox a ‘顯示a的值
VBS中條件判斷語句有If和Case兩種。
If判斷語格式為If…Then…End If,若需對多個條件進行判斷,使用Else If … Then。If和Else If需要分別對應一個End If結尾。但有兩個及以上的Else If時,只需要一個End If結尾。
Case判斷語句:針對有很多種不同的判斷情況,Case比If語句更簡單方便。格式為Select Case變量名…Case 值…End Select
無限循環語句,Do…loop。
條件循環,Do While…Loop,條件為true的時候執行循環體,需要跳出循環用Exit do。與while相反的是until。
計數循環,For i=n to m…Next,這是一種基于計數的循環,是最常見的循環結構,經常用來做單循環和嵌套循環。每一個for需要對應一個next結尾。
掌握了VBS基本知識后,我們可以進一步運用,編輯一些自動化腳本,如自動運行軟件、打開網頁、模擬鍵盤輸入,定時操作等,減少人工操作,為我們帶來便利。
VBS強大之處在于簡單的指令完成復雜操作。只需兩行簡潔的代碼便可啟動外部程序,如運行一個記事本程序:
Set abc=CreateObject(“Wscript.shell”)
abc.Run”notepad”
Set是VBS指令,用于將對象引用賦給某個變量,abc是變量,abc.Run調用的就是Wscript.shell中的Run函數。值得注意的是,一般在程序結束前需要釋放變量所占內存空間,如:Set abc=nothing。Notepad可替換成其他程序的絕對路徑,如abc.Run”D:QQQQ.exe”,也可以是網址或IP地址,如abc.Run”http://www.baidu.com”,多個任務需分行輸入指令,可一鍵打開所有需要用到的程序和網頁。
Sendkeys:模擬鍵盤操作指令,妙用該指令簡化重復操作,可以向當前最前端窗口發送指令或字符串。如:
Set abc=CreateObject(“Wscript.shell”)
abc.Run”notepad”
Wscript.sleep 1000‘等待1000ms
abc.Sendkeys”123”‘往打開的記事本填入123
Sendkeys引號內的字符是分為基本鍵和特殊功能鍵,基本鍵按字符順序排列在一起即可,特殊功能鍵Shift用+、Ctrl用^、Alt用%代替。
編程難免會遇到錯誤,VBS中提供了一條On error resume next的語句,意思是在該語句后的代碼運行出錯時,程序忽略當前語句或返回值錯誤并繼續執行。若在某一段代碼后又想恢復,則使用語句On error goto 0,意思是在該語句后的代碼運行出錯時,程序會停止運行并彈出錯誤提示框。
獲取系統時間的函數為date和time,直接賦給變量即可。Date獲取當前年月日,time獲取當前時分秒。由于系統時間有很多種格式,編程時需要統一格式,那就用時間轉換函數Cdate,該函數可以根據電腦系統設置,把預設時間轉換成當前系統的格式,防止因格式不同而出錯。若系統時間格式為2000年1月1日,a=”2000/1/1” ‘若時間代碼寫為2000/1/1。
b=Cdate(a) ‘將時間格式轉換成系統格式
msgbox b
通過換轉后變量b的值為2000年1月1日。
我們的操作基本上都是基于時域進行的,以時間為基準,設計各種執行方案,在編程時,那就需要用到時間比較函數,根據當前時間是否到達預定時間來做判斷,時間比較函數為datediff,格式為變量=datediff("格式",時間1,時間2),意思是以一定的格式表示時間2減時間1的差值,格式可以是年月日時分秒周等,使用時非常方便。如:

d=datediff(“n”,a,c) ‘比較預設時間和當前系統時間的差值,并以分鐘表示,n代表分鐘
msgbox d ‘顯示預設時間與系統時間的差
日常工作中,經常會遇到要修改幾十上百個,甚至更多文件的文件名,而這些文件名中又含有相同字符,若依次去重命名每一個文件,那將面臨巨大的工作量,而且是重復操作,會耗費大量的時間。下面是使用VBS編寫的批量修改文件名代碼,可以將有相同字符的替換成想要的結果,代碼為原創,只用了最簡單的條件判斷if語句和計數for循環便可實現。


在運行批量修改文件名代碼時,如果不輸入文件路徑點確定,則會彈出”文件夾不存在”提示,對于Inputbox而言,只要彈出對話框,無論用戶是否輸入了值,點擊確定、取消或關閉按鈕中任意一個,該條語句就算成功執行,然后繼續執行下一條語句。
假如用戶沒有輸入任何值點了確定,或者輸入0點確定,又或者點了取消或關閉按鈕,這三種情況的返回值都是0,若不加以區分,錯誤的結果會導致后續程序出錯。
在現有文獻中,未找到相關解決辦法來識別用戶到底采取了哪種操作。經長時間探索,總結出了一種可以通過判斷返回值的類型和長度,再利用系統錯誤處理,能準確判斷用戶的操作的方法,編程者可以根據判斷結果進行提示和決策腳本后續處理方式。代碼如下:


Len為計算表達式的長度,cstr轉換成字符型,cint轉換成整型。當用戶未輸入任何值并點確定時,a為空,cint(a)轉換會出錯,但我們使用了On error resume next,忽略了該錯誤,程序繼續運行,這樣就能利用“錯誤”處理來進行分辨。當用戶點了取消或關閉時,a返回值為0,linta為1。
VBS簡單易學,實用性強,功能強大,巧用內置函數,用簡單的代碼、基本語句就可完成繁瑣、重復的操作,在日常生活辦公中能實現自動處理、模擬輸入、定時操作、批處理等各種自動化,解放人力,提高工作效率。