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