1. 程式人生 > >EXCEL VBA 使用正則表示式清洗替換資料

EXCEL VBA 使用正則表示式清洗替換資料

在EXCEL表內遇到有規律性的資料需要提取或者替換時,比如在資料中提取時間,身份證號碼等,EXCEL內自帶的查詢替換就難以實現,我們可以利用VBA適用正則表示式去對資料進行匹配。

什麼是正則表示式?

正則表示式,又稱規則表示式(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。

下表為正則表示式的元字元和對它們的一個簡短的描述,新手可以百度下看下教程,不建議死記硬背,多做練習後更容易懂。

常用的正則表示式:

匹配手機號碼:1[3|4|5|7|8][0-9]{9}

匹配身份證號(15位):\d{14}[[0-9],0-9xX] ;身份證號(18位):\d{17}(\d|X|x)

匹配郵箱地址:[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

匹配(年-月-日)格式日期:([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))

匹配3位以上數字:[1-9][0-9]{2,}

匹配字串之間的字元:前面的字元(.*?)後面的字元,比如abc123def ,需要匹配abc和def之間的字元的表示式就是abc(.*?)def

在VBA使用正則表示式程式碼如下:

Sub re()
Application.ScreenUpdating = False
Set oRegExp1 = CreateObject("vbscript.regexp")
re = InputBox("請輸入正則表示式")
if re="" then exit sub
With oRegExp1
    .Global = True
    .IgnoreCase = True
    .Pattern = re
End With

For Each Rng In Selection
    if Rng <>"" then
        Set a = oRegExp1.Execute(Rng)
        For j = 0 To a.Count - 1
	    IF j=0 then
	        b = a(j)
	    else
       	        b = b & "," & a(j)
	    end if
        Next
        Rng.Value = b
        b = ""
    end if
Next
Application.ScreenUpdating = true
End Sub

例如在下面的產品名稱內需要提取TM-xxx這個型號,則正則表示式為:TM-[0-9]{3,} (TM-為開頭字串加上3個數字以上)

選擇需要提取的A列資料,執行VBA,在輸入框內輸入正則表示式,確認後就可以得到結果:

結果如下:

若有多個結果會以,號隔開放回結果。

另:正則表示式線上測試平臺:http://tool.oschina.net/regex/