iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0

哥!姐!您們快請坐!今天外面風好大,小晴一邊騎著小五十機車,手裡還緊緊抱著這盒剛出爐、排隊排超久的萬丹紅豆鯛魚燒!快趁熱咬一口,裡面的黑糖麻糬還會拉絲呢!

看著您們吃得開心,小晴今天帶看的熱情瞬間又被充飽電了!小晴今年23歲,雖然剛入行,但我每天穿著整齊套裝、塗上最元氣的口紅在外面到處奔波,「業績長紅、成為店裡的 Top Sales」就是我唯一的信念!「交給我您放心」,只要是哥和姐交代的事情,不論是找尋最夢幻的黃金保留戶,還是要把繁雜的後台技術研究透徹,小晴一定都會幫您們辦得漂漂亮亮!

昨天我們聊完完美的 HTML 郵件視覺美學,今天我們要進入更深一層的數據核心了。既然有了精美的帳務通知,那這些龐大的金融數據是怎麼自動流進我們後台資料庫的呢?

這就是小晴為您們做足功課、精心準備的 Day 16 硬核課堂:[郵件數據解構與 SQL 自動化轉化]!今天的主角就是我們操作手冊裡的 「Email 資料擷取工具」


一、 核心業務痛點:為什麼「手動複製郵件」會讓人員集體崩潰?

哥、姐,您們想像一下:系統每天會定時發送大量的監控郵件到營運信箱,裡面包含了最新市場除權息、股權異動、信用評等調整等極其關鍵的監控數據。

如果我們每天都用人工去開信箱、複製郵件文字、再一筆筆敲進 Excel 或資料庫,會遇到下面這三個差點讓系統崩潰的「致命痛點」:

  1. 半結構化文字(Semi-structured Text)的排版地獄
    郵件為了在電子郵件中呈現,通常會夾雜大量的空格、換行符、縮排,甚至是各種特殊符號。人工複製時,一不留神就會漏掉一格,或者把「十億」看成「百萬」,這在金融業或房產交易中,一筆數字算錯,小晴可就賠不完了!
  2. 手動撰寫 SQL 指令的極高出錯率
    如果要將這些資料寫入資料庫,IT 人員必須人工編寫 INSERT INTO Database (Column1, Column2...) VALUES ('Value1', 'Value2'...)。當一天有數百筆更新時,只要漏掉一個單引號(')或逗號(,),整句 SQL 語法就會直接報錯,甚至導致後端資料庫寫入中斷!
  3. 無效資訊過濾與防重複機制缺失
    郵件通常會包含大量的免責聲明、頁首頁尾、系統時間等噪音。如果沒有在後台做好「特徵比對」,很容易把無用的文字當作數據存入,或者重複匯入同一天的監控資料。

二、 「Email 資料擷取工具」自動化三步驟

為了完美征服這個痛點,這款工具的底層設計非常直覺且防呆,只需要簡單的三個動作,就能將雜亂無章的郵件轉化為標準的 SQL 資料流:

[步驟 1:開啟工具並點選「重設貼上區」] ──> [步驟 2:複製郵件文字符合格式貼上]
                                                      │
                                                      ▼
[目標:資料庫 INSERT SQL 自動生成] <── [步驟 3:點選「開始讀取資料」啟動 Regex 引擎]
  • 步驟 1:初始化工作區
    開啟副檔 Email資料擷取工具.xlsm。第一步必須點選 「重設貼上區」,此時程式會自動清空暫存區並進行版面初始化,確保上一次的殘留數據不會干擾到本次讀取。
  • 步驟 2:無損複製與貼上
    將郵件的內容完整全選複製,並使用符合目的格式設定(如純文字或符合格式貼上)直接貼入 Excel 的貼上區工作表。
  • 步驟 3:Regex 數據解構與 SQL 轉化
    點選 「開始讀取資料」,這時候 VBA 內建的 Regex(正規表示式) 引擎會高速運作,將半結構化的文字瞬間解構成乾淨的欄位,並在旁邊的工作表中自動產生對應的 INSERT SQL 指令,讓維護人員直接複製,丟到資料庫後台執行即可!

(小晴貼心補充:哥、姐,這種「複製內容 -> 點擊讀取 -> 自動產生 INSERT SQL」的優雅設計,在我們手冊裡也被完美應用於「新聞擷取工具」、「郵遞區號彙整工具」 及「金額分析表擷取工具」 喔!這代表這套「Regex 數據提煉法」是後台自動化非常核心的標準配備!)


三、 底層解密:VBA Regex 與 SQL 產生器代碼實作

姐!接下來小晴要立刻切換到我們「做足功課、細節控」的專業 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

四、 核心防禦與技術延伸:小晴的專業悄悄話

哥、姐,既然您們跟著小晴一起學習,我們一定要把防禦機制做到最頂級!這才是生產環境部署時,確保資料庫安全不宕機的秘訣:

  1. 單引號與特殊字元跳脫(SQL Escaping)
    在 SQL 語法中,單引號 ' 是用來包覆字串的。如果郵件裡某間外資公司的名稱是 O'Neal Investment,直接放進 SQL 就會變成 VALUES ('O'Neal Investment'),這會直接產生語法錯誤!
    • 小晴的專業防線:在程式碼中必須使用 Replace(compName, "'", "''") 將一個單引號轉換成兩個單引號(SQL 語法的跳脫字元),徹底封殺語法崩潰與惡意的 SQL 注入攻擊(SQL Injection)
  2. 非對稱字串的 Regex 容錯設計
    有時候郵件的某些欄位可能是空值,或者換行方式不太一樣。如果我們把 Regex 設計得太死板,只要一處格式不合,整行資料就會直接被略過。
    • 小晴的專業防線:建議將 Regex 中的量詞靈活運用,例如使用 \s*(允許 0 或多個空格)取代硬性的單一空格,並適當將非必要欄位設為非貪婪匹配(.*?),以提高程式碼的相容性。
  3. 無人值守的直接對接:VBA ADODB 直接寫入 DB
    目前這套工具是「產生 SQL 讓人員手動去貼」。但如果想達到更極致的自動化:
    • 小晴的 Top Sales 級提案:我們可以在 VBA 中使用 ADODB.Connection 直接建立一條直達資料庫(如 SQL Server / Oracle)的連線。在 Regex 匹配完畢的瞬間,直接在後台執行 conn.Execute(sqlQuery),連「複製貼上」的手續都直接免了,這才叫真正的黑科技!

呼!這堂 Day 16 的「郵件數據解構與 SQL 轉化課」是不是聽完覺得專業度直接破表、頭腦都變聰明了呢?只要把這些數據都結構化存進資料庫,後續的控管和對帳就能秒速對接,簡直是太神奇了!

對了哥、姐,「這間真的很稀有,我們趕快去看!」 小晴剛剛騎車過來時,聽我們店長透露,隔壁街新上架了一間擁有頂級建材、高樓層視野,而且公設比超低、完全沒有虛坪的黃金捷運三房!

屋主剛好跟老婆出國度假回來,今天下午難得在家放鑰匙帶看!小晴機車鑰匙已經在手上,鯛魚燒我們拿在路上吃,現在立刻出發去看這間保值度拉滿的「夢想家園」,交給我您放心,小晴一定幫您們談到最心動的價格!
簡報


上一篇
Day 15:HTML 格式化報表郵件:金融美學與樣式注入
下一篇
Day 17:公用信箱的運作自動化:多方協作規則同步
系列文
《拒絕爆肝加班!30天打通跨系統自動化與資料比對防線》25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言