哥!姐!您們快請坐!今天外面風好大,小晴一邊騎著小五十機車,手裡還緊緊抱著這盒剛出爐、排隊排超久的萬丹紅豆鯛魚燒!快趁熱咬一口,裡面的黑糖麻糬還會拉絲呢!
看著您們吃得開心,小晴今天帶看的熱情瞬間又被充飽電了!小晴今年23歲,雖然剛入行,但我每天穿著整齊套裝、塗上最元氣的口紅在外面到處奔波,「業績長紅、成為店裡的 Top Sales」就是我唯一的信念!「交給我您放心」,只要是哥和姐交代的事情,不論是找尋最夢幻的黃金保留戶,還是要把繁雜的後台技術研究透徹,小晴一定都會幫您們辦得漂漂亮亮!
昨天我們聊完完美的 HTML 郵件視覺美學,今天我們要進入更深一層的數據核心了。既然有了精美的帳務通知,那這些龐大的金融數據是怎麼自動流進我們後台資料庫的呢?
這就是小晴為您們做足功課、精心準備的 Day 16 硬核課堂:[郵件數據解構與 SQL 自動化轉化]!今天的主角就是我們操作手冊裡的 「Email 資料擷取工具」!
哥、姐,您們想像一下:系統每天會定時發送大量的監控郵件到營運信箱,裡面包含了最新市場除權息、股權異動、信用評等調整等極其關鍵的監控數據。
如果我們每天都用人工去開信箱、複製郵件文字、再一筆筆敲進 Excel 或資料庫,會遇到下面這三個差點讓系統崩潰的「致命痛點」:
INSERT INTO Database (Column1, Column2...) VALUES ('Value1', 'Value2'...)。當一天有數百筆更新時,只要漏掉一個單引號(')或逗號(,),整句 SQL 語法就會直接報錯,甚至導致後端資料庫寫入中斷!為了完美征服這個痛點,這款工具的底層設計非常直覺且防呆,只需要簡單的三個動作,就能將雜亂無章的郵件轉化為標準的 SQL 資料流:
[步驟 1:開啟工具並點選「重設貼上區」] ──> [步驟 2:複製郵件文字符合格式貼上]
│
▼
[目標:資料庫 INSERT SQL 自動生成] <── [步驟 3:點選「開始讀取資料」啟動 Regex 引擎]
Email資料擷取工具.xlsm。第一步必須點選 「重設貼上區」,此時程式會自動清空暫存區並進行版面初始化,確保上一次的殘留數據不會干擾到本次讀取。(小晴貼心補充:哥、姐,這種「複製內容 -> 點擊讀取 -> 自動產生 INSERT SQL」的優雅設計,在我們手冊裡也被完美應用於「新聞擷取工具」、「郵遞區號彙整工具」 及「金額分析表擷取工具」 喔!這代表這套「Regex 數據提煉法」是後台自動化非常核心的標準配備!)
姐!接下來小晴要立刻切換到我們「做足功課、細節控」的專業 IT 房仲模式囉!
我們要如何在 VBA 中利用 Microsoft VBScript Regular Expressions 5.5 提取關鍵數據,並將它們動態拼裝成 INSERT SQL 語法呢?以下是小晴幫您們梳理的關鍵底層程式碼實作:
' 需先在 VBA 編輯器中引用 Microsoft VBScript Regular Expressions 5.5
' 或者使用 CreateObject("VBScript.RegExp") 進行後期綁定
Sub ParseEmailToSQL()
Dim regEx As Object
Dim matches As Object
Dim matchItem As Object
Dim mailContent As String
Dim sqlQuery As String
Dim lastRow As Long
Dim i As Long
' 模擬我們從「貼上區」讀取到的監控郵件原始文字
' 假設郵件內容格式為: [代碼: 2330] [公司: 台積電] [監控日期: 20260830] [預警等級: 正常]
mailContent = Sheet1.Range("A1").Value ' 假設貼在 A1 儲存格
If Trim(mailContent) = "" Then
MsgBox "哥!姐!貼上區好像空空的耶,要記得先貼上郵件內容喔!", vbExclamation, "小晴專業提示"
Exit Sub
End If
' 1. 初始化 RegExp 物件
Set regEx = CreateObject("VBScript.RegExp")
' 2. 設計 Regex Pattern(正則表達式):精準夾擊並捕獲我們想要的群組(Group)
' 這裡的 Pattern 意思是尋找 [代碼: 數字]、[公司: 中文]、[日期: 數字]
' \[(代碼):\s*(\d+)\]\s*\[(公司):\s*([^\]]+)\]\s*\[(日期):\s*(\d+)\]
With regEx
.Pattern = "\[代碼:\s*(\d+)\]\s*\[公司:\s*([^\]]+)\]\s*\[日期:\s*(\d+)\]"
.IgnoreCase = True
.Global = True ' 搜尋整封信件的所有匹配項
End With
' 3. 執行正則匹配
Set matches = regEx.Execute(mailContent)
' 4. 清除舊的 SQL 輸出區,準備寫入新資料
Sheet2.Cells.Clear
Sheet2.Range("A1:D1").Value = Array("證券代碼", "公司名稱", "監控日期", "自動生成 INSERT SQL")
Sheet2.Range("A1:D1").Font.Bold = True
i = 2
' 5. 遍歷所有匹配成功的數據
For Each matchItem In matches
Dim stockCode As String
Dim compName As String
Dim monitorDate As String
' 提取 SubMatches(子捕獲群組)
stockCode = matchItem.SubMatches(0)
compName = matchItem.SubMatches(1)
monitorDate = matchItem.SubMatches(2)
' 6. SQL 注入防禦處理:將公司名稱中的單引號 ' 取代為雙單引號 '', 避免 SQL Injection 與語法報錯!
compName = Replace(compName, "'", "''")
' 7. 動態拼裝標準的 INSERT SQL 語法
sqlQuery = "INSERT INTO Watch_Logs (StockCode, CompanyName, MonitorDate, CreatedAt) " & _
"VALUES ('" & stockCode & "', N'" & compName & "', '" & monitorDate & "', GETDATE());"
' 寫入工作表
Sheet2.Cells(i, 1).Value = stockCode
Sheet2.Cells(i, 2).Value = compName
Sheet2.Cells(i, 3).Value = monitorDate
Sheet2.Cells(i, 4).Value = sqlQuery
i = i + 1
Next matchItem
If i > 2 Then
MsgBox "解析成功!已幫您們精準解構了 " & (i - 2) & " 筆監控數據,並完美產生對應 SQL!交給我您放心!", vbInformation, "小晴技術教室"
Sheet2.Activate
Else
MsgBox "哎呀!沒有匹配到任何符合格式的監控數據,請確認郵件內容與 Regex 樣式是否相符喔!", vbCritical, "系統提示"
End If
End Sub
哥、姐,既然您們跟著小晴一起學習,我們一定要把防禦機制做到最頂級!這才是生產環境部署時,確保資料庫安全不宕機的秘訣:
' 是用來包覆字串的。如果郵件裡某間外資公司的名稱是 O'Neal Investment,直接放進 SQL 就會變成 VALUES ('O'Neal Investment'),這會直接產生語法錯誤!
Replace(compName, "'", "''") 將一個單引號轉換成兩個單引號(SQL 語法的跳脫字元),徹底封殺語法崩潰與惡意的 SQL 注入攻擊(SQL Injection)!\s*(允許 0 或多個空格)取代硬性的單一空格,並適當將非必要欄位設為非貪婪匹配(.*?),以提高程式碼的相容性。ADODB.Connection 直接建立一條直達資料庫(如 SQL Server / Oracle)的連線。在 Regex 匹配完畢的瞬間,直接在後台執行 conn.Execute(sqlQuery),連「複製貼上」的手續都直接免了,這才叫真正的黑科技!呼!這堂 Day 16 的「郵件數據解構與 SQL 轉化課」是不是聽完覺得專業度直接破表、頭腦都變聰明了呢?只要把這些數據都結構化存進資料庫,後續的控管和對帳就能秒速對接,簡直是太神奇了!
對了哥、姐,「這間真的很稀有,我們趕快去看!」 小晴剛剛騎車過來時,聽我們店長透露,隔壁街新上架了一間擁有頂級建材、高樓層視野,而且公設比超低、完全沒有虛坪的黃金捷運三房!
屋主剛好跟老婆出國度假回來,今天下午難得在家放鑰匙帶看!小晴機車鑰匙已經在手上,鯛魚燒我們拿在路上吃,現在立刻出發去看這間保值度拉滿的「夢想家園」,交給我您放心,小晴一定幫您們談到最心動的價格!
簡報