--教育不是灌輸,而是點燃火焰,學習程式設計成就更好的自己--
微軟公司Office軟體在商業辦公領域一直佔據著主流和主導地位,其中Excel在資料處理和分析領域有著強大的影響力,大部分人在經歷幾年職場歷練後可以熟練的使用Excel函式和透視表功能,基本可以輕鬆完成絕大多數工作和任務。但實際上Office的強大和獨特之處還在於VBA,因為VBA能夠勝任好多個性化二次開發,減少重複機械勞動從而實現辦公自動化,開發效率高且開發週期短,尤其對於Excel重度使用者來說會了VBA簡直就是如虎添翼啊!!!(本人外語專業畢業,機緣巧合愛上程式設計,自學道路曲曲折折,痛並快樂!)在這裡總結一下自學VBA遇到的難點和重點,分享碼過的程式碼和要點總結,希望能夠給初學者一點啟示和鼓勵,同時願意結交更多大神交流有助提升自己的水平。
在VBA裡可以編寫符合自己需求的自定義函式(例如:個人所得稅計算函式),同時在VBA裡也可以呼叫正則表示式處理文字資料,那麼把這兩者結合起來就能夠製作強大的文字資料清洗工具了,今天簡單列舉一些常見的清洗和提取資料自定義函式,讓大家感受和領略兩者結合後的魅力和威力。
提取功能-抽取單元格內容中出現的第一個數字資料:
提取功能-抽取單元格內容中出現的第二個數字資料:
提取功能-抽取單元格內容中出現的第三個數字資料:
利用這幾個正則自定義函式可以輕鬆得到想要的尺寸資料,可以直接算出體積或面積等資料,簡直不要太方便了吧!!!
提取功能-抽取單元格內容中出現的第一個QQ號碼資料:
可以看到QQ號碼也輕鬆被提取出來,簡單粗暴!!!
提取功能-抽取單元格內容中出現的第一個漢字資訊資料:
提取功能-抽取單元格內容中出現的第二個漢字資訊資料:
提取功能-抽取單元格內容中出現的第一個6位郵編資訊資料:
提取功能-抽取單元格內容中出現的第一個英文資訊資料:
替換功能-替換單元格內容中數字以外的字元或資料為空:
不僅可直接提取想的資料,也可以替換不想要的資料,是不是很爽!!
替換功能-替換單元格內容中漢字以外的字元或資料為空:
程式碼彙總如下:
Function PureNumberA(x) '提取出現的第一個純數字資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "\d+"
.IgnoreCase = True
.Global = True
If .Test(x) Then
PureNumberA = Val(.Execute(x)(0)) '把文字資料轉換為數值資料,0代表第一個出現的值
Else: PureNumberA = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function PureNumberB(x) '提取出現的第二個純數字資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "\d+"
.IgnoreCase = True
.Global = True
If .Test(x) Then
PureNumberB = Val(.Execute(x)(1)) '把文字資料轉換為數值資料,1代表第二個出現的值
Else: PureNumberB = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function PureNumberC(x) '提取出現的第三個純數字資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "\d+"
.IgnoreCase = True
.Global = True
If .Test(x) Then
PureNumberC = Val(.Execute(x)(2)) '把文字資料轉換為數值資料,2代表第三個出現的值
Else: PureNumberC = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function QQDTA(x) '提取出現的第一個QQ資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "QQ\d+"
.IgnoreCase = True
.Global = True
If .Test(x) Then
QQDTA = .Execute(x)(0)
Else: QQDTA = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function ChineseA(x) '提取出現的第一個出現的漢字資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "[\u4e00-\u9fa5]+"
.IgnoreCase = True
.Global = True
If .Test(x) Then
ChineseA = .Execute(x)(0) '把文字資料轉換為數值資料,0代表第一個出現的值
Else: ChineseA = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function ChineseB(x) '提取出現的第二個出現的漢字資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "[\u4e00-\u9fa5]+"
.IgnoreCase = True
.Global = True
If .Test(x) Then
ChineseB = .Execute(x)(1) '把文字資料轉換為數值資料,1代表第二個出現的值
Else: ChineseB = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function PostNumberA(x) '提取出現的第一個6位郵編資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "\d{6}"
.IgnoreCase = True
.Global = True
If .Test(x) Then
PostNumberA = Val(.Execute(x)(0)) '把文字資料轉換為數值資料,0代表第一個出現的值
Else: PostNumberA = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function EnglishDTA(x) '提取出現的第一個英文資料
Application.ScreenUpdating = False
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "[a-zA-Z]+"
.IgnoreCase = True
.Global = True
If .Test(x) Then
EnglishDTA = .Execute(x)(0)
Else: EnglishDTA = ""
End If
End With
Application.ScreenUpdating = True
End Function
Function OnlyNumber(x) '替換數字以外的字元為空
Application.ScreenUpdating = False
Set regex = CreateObject("VBSCRIPT.REGEXP")
regex.Pattern = "[^\d+]"
regex.IgnoreCase = True
regex.Global = True
OnlyNumber = regex.Replace(x, "")
Set regexex = Nothing
Application.ScreenUpdating = True
End Function
Function OnlyChinese(x) '替換漢字以外的字元為空
Application.ScreenUpdating = False
Set regex = CreateObject("VBSCRIPT.REGEXP")
regex.Pattern = "[^\u4e00-\u9fa5]"
regex.IgnoreCase = True
regex.Global = True
OnlyChinese = regex.Replace(x, "")
Set regexex = Nothing
Application.ScreenUpdating = True
End Function
看到這是不是已經感受到正則和自定義函式結合的好處和威力?還不趕緊動手也試一試哇,如果想要做得更好就沉下心來學習一下正則表示式吧。
END
我為人人,人人為我!!歡迎大家關注,點贊和轉發!!!
~~人生不是賽場,夢想不容退場~~不斷努力學習蛻變出一個更好的自己,不斷分享學習路上的收穫和感悟幫助他人成就自己!!!