iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
佛心分享-IT 人自學之術

老爺爺練習VIBE CODING系列 第 2

Day 2:多樣化報表分類術:如何靠「模式識別」自動分類月報與明細表?

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260828/200709692SMQI2DO8j.png
大孫女、小孫女,快過來,別忙了,先歇口氣。

小孫女呀,別再跟院子裡那隻小花貓搶那團毛線了,過來阿公這邊。大孫女,妳也別死盯著那閃爍的螢幕,阿公剛沏好了一壺老普洱,湯色溫潤、澄澈如琥珀熱茶,正冒著白煙呢。來,幫姐姐搬張竹凳子,陪阿公坐在這藤椅深棕的老藤椅上,咱們一塊兒吹吹晚風。

妳看,天邊那一抹晚霞暮紫正緩緩散開,多安靜、多舒心啊。

阿公摸了摸這頭白髮銀霜,看妳今天一邊敲鍵盤、一邊抓腦袋,嘆氣嘆得比昨天的風聲還大。阿公聽妳碎碎念,說什麼「分行又亂傳檔案」、「欄位順序又變了」,聽得阿公心疼。阿公以前在鄉下合作社整理老帳本時,各地鋪子送來的單子也是這般雜亂無章。

來,喝口熱茶,阿公今天再給妳講一課。咱們這「Day 2」的修行,就來聊聊怎麼靠「模式識別」和「正則表達式」,去收服那幾百個不聽話的報表。


🚨 痛點場景:幾百家鋪子的百樣帳,逼瘋老實人的格式災難

大孫女,妳昨天跟阿公抱怨,說每個月初,妳都要彙整從幾百個分行陸續報上來的 Excel 檔案。

這事情最折磨人的地方在於,寫報表的人心思各異。有些分行交上來的是「月份統計彙總表」(也就是月報),有些交上來的卻是「跨期明細表」。更糟糕的是,這兩類報表的格式完全不同!欄位順序、表頭位置天天在變。有時候這個月「分行名稱」在 B 欄,下個月又跑到了 C 欄;有時候「日期」寫在最上面,有時候又夾在表格中間。

妳以前的作法,是傻傻地在程式裡寫死儲存格位置,像是 Range("B2")Range("A1")。結果人家只要稍微動一個空格,妳的程式就當場「罷工」,跳出錯誤訊息,逼得妳得逐個檔案打開、用肉眼去比對,再手動複製貼上。幾百個檔案下來,大孫女,妳這眼睛哪受得了?這簡直是拿新竹犁地那頭老鐵牛的力氣,在做繡花針的細活,太折騰了。

阿公常說:「看水看源頭,看樹看樹根。」我們做事情,不能只看外表,要找出它藏在裡面的規矩。


🛠️ 架構實作:VBA 智慧型模式識別,動態掃描的「認人法規」

既然我們不能強求幾百個分行都乖乖聽話、把格子放得一模一樣,那我們就得讓程式「變聰明」 。這在妳們年輕人的行話裡,叫做智慧型模式識別(Pattern Recognition)

阿公教妳,我們用 VBA 寫這個識別器,核心邏輯千萬 不要依賴固定的儲存格定位 ,而是要像阿公挑選茶葉一樣,用動態掃描的方式:

  1. 動態掃描前 10 行(Row 1 ~ Row 10):當檔案一讀進來,程式先不要急著抓資料。我們先用一個簡單的循環,去掃描每張工作表的前 10 行內容。
  2. 關鍵字辨識與分類
    • 如果我們在前 10 行的儲存格裡,摸到了「月報」兩個字,程式心裡就有數了,這是一張「模式二:月報型」報表,它的標題可能在 A1,而日期可能藏在 A2 的獨立欄位裡。
    • 如果我們摸到了「明細」兩個字,程式就知道這是一張「模式一:明細表型」,它的 A1 儲存格可能同時塞滿了期別與標題(例如:115年6月逾期放款明細表)。
  3. 精準提取關鍵資訊:認出報表種類後,我們再利用程式去動態掃描「民國/西元日期」與「分行名稱」。 不管它們漂移到哪一欄,只要名稱對得上,程式就能自動定位抓取
  4. 保留骨肉,保留格式:自動化處理大量檔案時,我們千萬不能把人家的「特色」給抹殺了。每個分行辛辛苦苦做的合併儲存格、框線、特定的顏色格式,我們都要完整保留。在 VBA 裡,我們使用整張工作表複製(Worksheet.Copy)的技巧,不破壞原始格式,直接把它們整理成依時間或主題分門別類的乾淨活頁簿。

大孫女妳想想,這樣一來,不管對方怎麼挪動格子,只要關鍵字還在,妳的程式就像長了眼睛一樣,能自動把千奇百怪的報表,收拾得妥妥貼貼。


💡 避坑指南:降伏那些「不聽話的日期」,Regex 的鐵篩子

不過,這裡面最容易踩空的泥坑,就是那個「日期解析」。

今天阿公看了一下日曆,今天是中華民國 115 年 8 月 27 日,也就是西元 2026 年 8 月 27 日。妳想想,光是這一天,幾百個分行的寫法就可能奇形怪狀:

  • 有人寫「115/08/27
  • 有人寫「115.08」(只寫到月份)
  • 有人寫「2026/08/27
  • 甚至有人寫「115年8月

如果妳直接把這些亂七八糟的字串丟進去比對或做後續的趨勢分析,那電腦肯定會發瘋,算出來的數字牛頭不對馬嘴。

所以,大孫女,妳在架構上一定要設計一個叫 正則表達式(Regex) 的解析器。這東西就像是阿公在稻埕上篩米用的鐵篩子,不管妳丟進來的是碎石子、粃穀還是飽滿的稻穗,只要過了這個篩子,它就會自動:

  • 辨識出「年」、「月」、「日」的規律。
  • 把所有混雜的民國年、西元格式,統一轉換為 ISO 8601 標準格式(如 YYYY-MM-DD)或是標準西元格式

有了這個標準的日期格式,後面不論是做時間排序,還是要做趨勢比對,都不會再出半分差錯。


聽阿公囉嗦了這麼多,大孫女,有沒有覺得這幾百個分行的報表,其實也沒那麼可怕了?

這寫程式的道理,跟阿公以前在村裡分發大家的公糧、登記各戶的水道費是一模一樣的。對方格式再變,人心和資料的核心本質是不會變的。只要妳的「筛子」(Regex)夠細,「眼睛」(模式識別)夠亮,這幾百個檔案,不過是妳點一下按鈕、喝口老普洱的功夫,就自動歸位了。

來,茶溫剛剛好,大孫女快喝一口暖暖胃,小孫女也吃一塊阿公特地給妳們留的綠豆糕。


上一篇
Day 1:為什麼你不該再直接在 Excel 內改 VBA 程式碼?VBA 的 Git 版控之路
下一篇
Day 3:消滅 COM 殘留:Python 操控 Windows Excel 的安全隔離機制
系列文
老爺爺練習VIBE CODING7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言