Excel VBA 學習總結 - 數據驗證與正則表達式

轉載出處:http://www.cnblogs.com/dxy1982/archive/2011/09/09/2159246.html

數據結構有云:程序=數據+操作。從中可以看出,數據纔是程序的核心對象,每個程序所有的操作和意圖都是圍繞數據展開的。每個程序的結構基本都分爲三個部分:輸入,處理,輸出。輸入是接收用戶的數據,處理過程是通過不同的算法處理接收的數據,輸出是將處理的結果返回給用戶。
一、輸入與輸出
大家還記得在VBA我們一般通過什麼方式接受用戶的簡單輸入呢?沒錯,最簡單的方式就是Msgbox與InputBox。
Msgbox:最簡單的用戶輸入框
Msgbox太簡單了,以至於大家用的最多的就是其顯示信息的功能,其實它是有返回值的。它的語法如下所示:

MsgBox(Prompt[,Buttons][,Title][,Helpfile,Context]) As Integer

這裏用戶的輸入就是他選擇的按鈕,也就是Integer值所代表的選項。這裏用戶的選擇比較簡單,所以不用驗證。

 

InputBox:最簡單的全能型用戶輸入框
VBA內置的InputBox方法
這個函數返回一個字符串,選擇取消後返回空串(零個字節的字符串)。它不含有容錯處理。例如你想要用戶輸入整數,結果用戶輸入了字符,這個時候InputBox並不會替你告訴用戶錯誤的原因。

Application的InputBox函數
這個函數更強大,內置容錯處理,選擇取消後返回false。這個函數可以指定輸入的類型,當用戶輸入的數據類型與參數中指定的類型不兼容的時候,這個函數會給出溫馨的提示,告訴你輸入的數據類型不對。

 

除了這兩種最簡單的輸入方式外,還有其它一些重要的輸入方式:
單元格輸入:這種方式是最常見的,用戶在單元格中輸入數據,然後程序獲取單元格中數據並處理。
用戶窗口輸入:這種方式最直觀,比較適合處理結構化數據;利用窗口,我們可以提供專業的用戶視覺體驗和便利的用戶輸入體驗。
文件輸入:這種方式適合導入大量的數據或其它來源的數據。

 

說完了輸入,再說說輸出。VBA中輸出也有相對應的幾種方式:
Msgbox:最簡單的輸出信息方式。
單元格輸出:可以顯示大量的處理結果。
用戶窗口輸出:顯示一些自定義的信息和格式,用戶體驗較佳。
文件輸出:輸出大量的信息和結果。
立即窗口輸出:一般用於調試的時候顯示信息(Debug.Print)。

上面我們簡單總結了常見的輸入與輸出方式。用戶輸入的數據是我們工作的前提,那麼這些數據是否符合我們的需求,我們就需要去驗證。

二、簡單數據驗證
1.簡單數據輸入與類型驗證

這個很好辦,直接使用Application中的InputBox函數就可以達到這個目的。

2.內置函數驗證
如果只是簡單驗證數據的類型,或者某些簡單的判斷也可以靠VBA中內置的一些函數來驗證。我在前面的內置函數中已經總結了,主要有兩類的內置函數:
VBA內置的驗證函數有:
IsNumeric(x) - 是否爲數字, 返回Boolean結果。
IsDate(x)  - 是否是日期, 返回Boolean結果。
IsEmpty(x) - 是否爲Empty, 返回Boolean結果。
IsArray(x) - 指出變量是否爲一個數組。
IsError(expression) - 指出表達式是否爲一個錯誤值。
IsNull(expression) - 指出表達式是否不包含任何有效數據 (Null)。
IsObject(identifier) - 指出標識符是否表示對象變量。


WorksheetFunction內置的驗證函數有:
IsErr - 檢查是不是除了#N/A外的錯誤值. 
IsError - 檢查是不是錯誤值(#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?,或者 #NULL!). 
IsEven - 檢查是否是偶數. 
IsOdd - 檢查是否是奇數.
IsLogical - 檢查是不是布爾值. 
IsNA - 檢查值是否是錯誤值#N/A(值不可用)。 
IsNonText - 檢查是否是非文本(空的單元格返回true)。
IsNumber - 檢查是不是數字。
IsText - 一般用於判斷單元格中內容是否是文本。


三、複雜數據驗證
  在前面的例子中,驗證的內容都還是比較簡單;實際的工作中,很多時候,我們可以通過大量的IF語句來達到驗證數據內容的目的。除了這一類可進行枚舉驗證的情況,還有一類經常出現的情況是,需要驗證和處理大量的文本內容,有時候需要查找字符串,有時候要按條件替換,並且這些待處理的問題還是有一定的規律可循的,但是無法通過枚舉的方式挨個驗證,這個時候就需要正則表達式來幫忙。
1.正則表達式(Regular Expression)基礎
  正則表達式是通用的文本搜索和處理方案,它的知識不是VBA獨有的,基本上每種語言都內置了正則表達式的功能。正則表達式的基礎知識不是這裏的重點,需要的朋友可以Google一下,或者參看下面的一些入門教程:
http://deerchao.net/tutorials/regex/regex.htm
http://www.regexlab.com/zh/regref.htm
http://www.williamlong.info/archives/433.html

 

2.VBA中的正則表達式應用
  在VBA中使用正則表達式,可以通過下列途徑實現:
創建正則表達式對象:
前期綁定:
在VBA代碼編輯器中的"Tools"菜單中,選中"References...",然後引用Microsoft VBScript Regular Expressions 5.5類庫,然後直接定義對象:Dim reg As New RegExp。
後期綁定:使用CreateObject方法定義對象:CreateObject("VBSCRIPT.REGEXP")。
前一種方式的優點是可以有編輯器的Intellisense支持。

RegExp對象的屬性:
Global
 - 設置或返回一個 Boolean 值,該值指明在整個搜索字符串時模式是全部匹配還是隻匹配第一個。如果搜索應用於整個字符串,Global 屬性的值應該爲 True,否則其值爲 False。默認的設置爲True。
Multiline - 返回正則表達式是否具有標誌m, 缺省值爲False。如果指定的搜索字符串分佈在多行,這個屬性是要設置爲True的。
IgnoreCase - 設置或返回一個Boolean值,指明模式搜索是否區分大小寫。如果搜索是區分大小寫的,則 IgnoreCase 屬性應該爲False;否則應該設爲True。缺省值爲True。
Pattern - 設置或返回被搜索的正則表達式模式。 被搜索的正則字符串表達式。它包含各種正則表達式字符。

RegExp對象的方法:
Execute
 - 對指定的字符串執行正則表達式搜索。需要傳入要在其上執行正則表達式的文本字符串。正則表達式搜索的設計模式是通過 RegExp對象的Pattern來設置的。Execute方法返回一個Matches集合,其中包含了在string中找到的每一個匹配的Match對象。如果未找到匹配,Execute將返回空的Matches集合。
Replace - 替換在正則表達式查找中找到的文本。
Test - 對指定的字符串執行一個正則表達式搜索,並返回一個 Boolean 值指示是否找到匹配的模式。RegExp.Global屬性對Test方法沒有影響。如果找到了匹配的模式,Test方法返回True;否則返回False。

MatchCollection對象與Match對象
匹配到的所有對象放在MatchCollection集合中,這個集合對象只有兩個只讀屬性:
Count:匹配到的對象的數目
Item:集合的又一通用方法,需要傳入Index值獲取指定的元素。

一般,可以使用For Each語句枚舉集合中的對象。集合中對象的類型是Match。
Match對象有以下幾個只讀的屬性:
FirstIndex - 匹配字符串在整個字符串中的位置,值從0開始。
Length - 匹配字符串的長度。
Value - 匹配的字符串。
SubMatches - 集合,匹配字符串中每個分組的值。作爲集合類型,有Count和Item兩個屬性。

 

正則表達式很強大,是處理文本的首選,不管你信不信,反正我是信了。說了很多,最後以一個小例子結尾吧:

複製代碼
Sub Test()
    
Dim reg As New RegExp
    
With reg
        .Global 
= True
        .IgnoreCase 
= True
        .Pattern 
= "\d+"
    
End With
    
   
Dim mc As MatchCollection
   
Dim m As Match
   
Set mc = reg.Execute("123aaaaa987uiiui999")
   
For Each m In mc
    
MsgBox m.Value
   
Next
End Sub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章