假設今天我們在 Excel 或自動化流程中,收到這樣一段訊息:
「請參考附件,發票號碼是 IJP202406001,已於昨日開立,金額 88,000。」
如果你要讓 RPA 自動從這段文字中抓出「IJP202406001」,你可能會想:「那我用Excel語法Vlookup/LEFT/MID/RIGHT 抓看看好了?」但實際測試有時候你會發現:
- 發票號碼不一定在固定位置
- 有時開頭不是「請參考附件」,而是「本次開立的是……」
- 有時候同一個儲存格中包含文字
這時候都讓我們花更多時間想辦法清洗數據之後再抓到要的字串,
這時候用正則表達式可以只用一句話就搞定:
IJP\d{9}
它的意思是:
「IJP」開頭,接著 9 位數字(\d{9}
)的字串,不管號碼出現在第幾個字元、被什麼字包圍,都可以一網打盡。
那我們用會計人較熟悉的Excel VBA來測試看看,什麼是正則表達式。
首先,到開發人員*(怎麼打開網路上有很多教學就不再贅述)打開Visual Basic程式介面工工具 → 設定引用項目

→ 找到Microsoft VBScript Regular Expressions 5.5 → 打勾 → 確定

於是你可以在VBA中使用正則表達式;我們貼一段程式碼來測試看看
(請將下列程式碼複製貼上到VBA程式碼區)
Sub FindIJPInvoices_ShowInMsgBox()
Dim ws As Worksheet
Dim rng As Range
Dim cell As Range
Dim regex As RegExp
Dim matches As MatchCollection
Dim foundList As String
' 設定工作表
Set ws = ThisWorkbook.Sheets("工作表1")
' 設定正則表達式
Set regex = New RegExp
With regex
.Pattern = "IJP\d{9}"
.Global = False
.IgnoreCase = False
End With
' 假設搜尋範圍 A1 到 Z100(可依資料調整)
Set rng = ws.Range("A1:Z100")
' 初始化結果字串
foundList = ""
' 搜尋每個儲存格
For Each cell In rng
If Not IsEmpty(cell.Value) Then
If regex.Test(cell.Value) Then
Set matches = regex.Execute(cell.Value)
foundList = foundList & "第 " & cell.Address & " 格找到:" & matches(0).Value & vbCrLf
End If
End If
Next cell
' 顯示結果
If foundList = "" Then
MsgBox "找不到任何符合格式的發票號碼(IJP+9碼)", vbExclamation
Else
MsgBox "以下是找到的發票號碼:" & vbCrLf & foundList, vbInformation
End If
End Sub

這時你的畫面應該長這樣
接著請回到Excel的介面中隨機在A1:Z100之間,輸入IJP開頭,加上隨機九位數號碼,例如:IJP000005678

回到VBA按下執行鍵,會發現可以找到以IJP開頭+9個數字的字串。


除了在VBA之外,RPA工具中如果善加利用正則表達,我們在做抽取PDF內容的時候就更方便了。
假設我使用RPA用要去取下面這張發票的發票號碼IJP006235001,

就在RPA (這邊使用的是微軟Power Automate)中寫入尋找IJP\d{9}字串,之後我就可以將一整串PDF中全部的發票號碼抓下來。接著只要再讓它寫入Excel或是Sharepoint中,
就可以獲得你想要的所有發票號碼。當然客戶編號、會計科目、身分證號碼、電話號碼等,只要有取號邏輯都可以這樣做。

以上供參考。