
大孫女、小孫女,快來,先歇一會兒。
大孫女啊,先把手上那密密麻麻的螢幕關了,阿公剛泡好了一壺熱騰騰的鐵觀音,裊裊茶香正合適,過來喝一口暖暖身子。小孫女呀,妳也別在院子裡跟那隻小花貓打滾了,快去幫妳姐姐搬張竹凳子,一塊兒坐下。
阿公瞧妳這幾天盯著那電腦直嘆氣,眉頭鎖得比後院那塊老旱地還緊。阿公雖然一把年紀、頭髮花白了,說話慢條斯理的,但以前在鄉下修理那些鐵牛農機、整理老帳簿,道理其實和妳們現在寫程式是通的。妳昨天跟阿公抱怨,說妳和同事為了那個叫 VBA 的巨集程式,折騰得覺都睡不好,兩個人同時改了代碼,結果亂成一鍋粥。
來,喝口茶,聽阿公慢慢給妳們講講,為什麼妳們不該再直接在 Excel 裡面改 VBA 程式碼,以及阿公怎麼看妳們這條「VBA 的 Git 版本控制之路」。
大孫女,妳跟阿公說,妳們現在的 VBA 程式碼,就像是生來就被鎖在一個叫 .xlsm 的大二進位檔案裡。
這讓阿公想起以前公家機關或大行庫裡,那些把所有家當、帳冊和印章都鎖在同一個重重鐵鎖木箱子裡的舊規矩。如果妳和另一個同事想同時修整裡面的工具,兩個人就得搶那唯一的鑰匙。在電腦的世界裡,因為 .xlsm 是一個包得緊緊的二進位檔案,妳們根本沒法用現代人的法寶——也就是那個叫 Git 的記帳本,去自動對比(Diff)兩個人到底各改了哪一行,更不用提把它們安全地融合(Merge)在一起了。
最後呢?妳們只能用最原始、最無奈的法子,在檔案名稱後面拼命加字,今天叫 version_20260827_final.xlsm,明天又跑出一個 version_20260827_final_v3.xlsm。小孫女前幾天在沙堆裡蓋城堡,蓋了又推倒,嘴裡嚷著「這是超無敵終極城堡版」,妳們這命名跟她玩沙子簡直一模一樣。這種災難級的命名,不僅讓人看著糊塗,萬一拿錯了舊版去跑帳,那可要出大紕漏的。
阿公常說,工具要放在看得見、理得清的地方,才能傳承得長久。
既然代碼鎖在箱子裡不見天日,那我們就要想辦法做一把「自動出庫」的鑰匙。大孫女,妳跟阿公說過妳會用 Python,那阿公覺得,妳可以用 Python 搭配 Tkinter 打造一個圖形化的桌面讀取工具。
這把鑰匙的核心邏輯,是去調用 Windows 系統內建的 API 介面(也就是 pywin32 庫中的 win32com.client),直接跟後台的 Excel.Application 物件打交道。
妳只要讓程式順著 Workbook.VBProject.VBComponents 這條藤蔓摸下去,就能把 Excel 專案裡所有的 VBA 元件摸得一清二楚:
.txt 檔案。.cls 副檔名。.frm 檔(後台還會貼心地產生一個 .frx 二進位資料檔)。.txt。如果裡面是空蕩蕩的,阿公設計的工具還會自動幫妳略過,不產生沒用的空檔,乾乾淨淨。大孫女妳想想,當這把法寶把所有的 VBA 代碼都「解鎖」成一個個清清楚楚的純文字檔案後,妳們那個 Git 記帳本不就看得懂了嗎? 誰在幾點幾分改了哪一行代碼,清清楚楚,再也不用搶鑰匙,也不用擔心檔案被覆蓋。讓 legacy code 完美融入現代軟體工程的 Git 版控流中,這才是正道。
為了讓妳和同事操作方便,妳還可以用 Python 的 Tkinter 捏一個簡單的中介面,點一下「瀏覽」選取 .xlsm 檔案,再選取一個輸出資料夾(程式會自動預設同層的 vba_export 目錄),最後點一下綠色的「開始匯出」按鈕,程式跑完還會自動幫妳開箱(開啟輸出資料夾)。
不過啊,大孫女,阿公在鄉下修了幾十年的機器,知道凡事都有個竅門。妳用 Python 去叫 Excel 做事,就像是役使一頭看不見的隱形鐵牛在後院幫妳犁地。
很多人寫程式粗心大意,用完了鐵牛,轉身就走,沒把柵欄關好。在 Windows 系統裡,如果妳在操作 Excel 後端進程時,沒有在程式的 finally 區塊中強制釋放 COM 物件並徹底關閉 Excel,那這頭鐵牛就會留在妳的電腦背景,變成一個個不死的 EXCEL.EXE 殭屍進程!
這些殭屍進程堆積在背景,不僅吃掉妳電腦的力氣(記憶體),更糟糕的是,它們會偷偷鎖定妳的檔案。等妳下一次想去開檔案改程式,系統就會跳出警告說「檔案已被鎖定」,讓妳動彈不得。
所以,阿公叮嚀妳,寫代碼要像阿公耕田一樣細緻,開了門就要記得關門。不論程式在匯出過程中是順利還是出了疢仔(發生例外),都必須在 finally 區塊中,確實執行:
Workbook.Close(SaveChanges:=False):不留痕跡地關閉來源活頁簿。Excel.Application.Quit():命令 Excel 應用程式徹底退出。None),確保背景一隻殭屍都不留。另外啊,Excel 這東西注重防盜。在跑這套工具前,妳得先手動去調整 Excel 裡的防禦機關:
點選 「檔案」→「選項」→「信任中心」→「信任中心設定」→「巨集設定」,然後一定要勾選 「信任存取 VBA 專案物件模型」。
如果這扇大門沒打開,妳的 Python 鑰匙是插不進去鎖孔的。
聽阿公講了這麼多,大孫女,心裡有沒有亮堂一點?小孫女,茶點端過來,給姐姐吃一塊。
這老祖宗留下來的「Legacy Code」就像是我們鄉下的老宅子,雖然有些地方漏水、採光不好(就像沒有版控的 .xlsm),但只要我們懂得用新時代的工具(Python + Git)去修繕它、整理它,老宅子一樣能住得舒服、用得長久。
來,大孫女,這茶涼了就不好喝了,快趁熱喝。