Excel 自動產生報表:用 VBA 建立每日匯率紀錄
Excel 自動產生報表可以利用 VBA 把資料更新、整理與歷史紀錄整合成一次執行。這次以臺灣銀行匯率為實際範例,讓 VBA 固定更新原始報表、記錄執行日期,再把美元與日圓匯率新增到每日匯率表,建立可以持續累積的自動化報表。

一、Excel 自動產生報表,不只是更新最新資料
Excel 自動產生報表不只是把最新資料重新寫進工作表,更重要的是把固定的資料取得、整理與保存流程串在一起。以這次的匯率報表為例,「原始報表」負責呈現目前最新的臺灣銀行匯率,「每日匯率表」則負責把每天需要追蹤的美元、日圓資料另外保存下來。
每次執行 VBA 時,最新匯率會重新更新,而當天的重要資料則往每日匯率表新增一筆。如此一來,今天執行留下今天的紀錄,下一個工作日再次執行,就繼續增加新的資料,而不是每次更新後只剩下一份最新狀態。
Excel 自動化報表通常可以拆成資料取得、資料整理與報表產出三個層次。若想另外了解前兩個環節,可以參考 Excel 自動抓取網頁資料 與 Excel VBA 整理資料;本文則集中處理如何把整理後的資料更新到固定報表,並持續累積每日紀錄。
最新報表與歷史資料是兩種不同用途。原始報表負責呈現目前最新匯率,每日匯率表負責保留每天的關鍵數值。當 Excel 開始自動產生並保留歷史資料後,後續才能進一步進行趨勢圖、最高最低值、期間比較或其他資料分析。

二、先確認原始報表與每日匯率表
目前活頁簿已經有三張工作表,分別是「每日匯率表」「原始報表」與「FAQ」。贊贊小屋切到「原始報表」,可以看到欄位為「幣別」「現金買入」「現金賣出」「即期買入」「即期賣出」,第 2 列則出現多餘的「幣別」「現金匯率」字樣,屬於整理前的殘留標題。
贊贊小屋切換到「每日匯率表」,目前已經有 2026/8/21、2026/8/24 兩筆歷史資料,欄位包含「日期」「星期」「美金即期買入」「美金即期賣出」「日元即期買入」「日元即期賣出」。這次程式修改的目的,就是讓往後不需要再手動新增這些資料,而是在每次自動產生報表時,由 VBA 自動判斷並新增當天紀錄。
值得注意的是,這組欄位順序就是新版 VBA 每天寫入資料時依循的格式。如果之後想追蹤其他幣別,或想調整欄位順序,必須同步在需求裡說明新的欄位結構,不能只告訴 AI「多抓一種幣別」,否則寫入位置容易對不上。



三、把新的工作需求一次交給 ChatGPT
贊贊小屋在 ChatGPT 對話框中輸入:「我現在已經有一個VBA程式,可以取得台銀最新匯率,有三個想要優化的地方:1.現在是把匯率寫在目前工作表,希望改成固定的工作表:「原始報表」。2.現在取得匯率後,第二列是多餘的,請將它刪除。此外,順便把程式執行日期寫入G1儲存格。3.我另外有個「每日匯率表」,欄位如下,希望執行程式時,如果還沒有當天匯率資料,就依照欄位結構寫入,注意到六日沒有匯率,所以六日不用執行。」並附上欄位清單:「日期 星期 美金即期買入 美金即期賣出 日元即期買入 日元即期賣出」。
這次的提示詞刻意列出三個具體項目,而不是籠統地說「幫我優化一下」:固定寫入哪張工作表、要刪除的是哪個位置、新表的欄位結構長什麼樣子。範圍愈具體,AI 產出的程式碼愈不需要來回追加細節;如果只給模糊方向,通常得再補兩三輪對話才能對齊實際的工作表結構。


四、ChatGPT 先整理流程,再產出新版 VBA
ChatGPT 收到需求後,先把整體工作方式整理成「抓取→整理→寫入固定工作表→刪除多餘第二列→記錄執行日期→更新每日匯率表」一次完成,同時特別指出六日不用執行,會直接在程式最前面判斷星期六、星期日,如果是週末就直接結束,不抓臺銀資料;這類星期判斷也可以參考 Excel WeekDay 用法 的 VBA 範例。接著列出建議的最後工作方式:「原始報表」固定存放臺灣銀行完整整理後的匯率,A1 到 E1 是標題,不會使用目前工作表,G1 寫入執行日期,不會留下多餘的第二列;「每日匯率表」則是如果今天已經有資料就不重複新增,如果今天還沒有資料就新增一筆。
確認邏輯後,ChatGPT 才提供可以直接取代目前程式的新版 VBA,程式開頭為「Sub 取得臺灣銀行匯率()」,除了原有抓取資料所需要的 Worksheet、QueryTable、URL 等變數,也增加每日匯率工作表、最後一列、美元買入賣出、日圓買入賣出、是否找到匯率資料等後續處理需要的變數。正文不需要逐行解釋完整程式碼,重點在於程式功能為什麼比前一版增加。
ChatGPT 在給程式碼之前,先把「原始報表」與「每日匯率表」各自要維持的欄位結構整理成條列式規格,這一步等於先幫贊贊小屋確認一次需求:如果這時就發現欄位順序、欄位名稱或買入賣出的對應有誤,就可以在產生程式前先修正,不必等 VBA 執行後才從錯位的資料回頭找原因。



五、把新版 VBA 貼入模組並執行巨集
贊贊小屋將 ChatGPT 提供的新版程式貼到新的 Module2,而不是直接覆蓋原本可以正常執行的 Module1。即使 ChatGPT 說「這個版本可以取代你的程式」,也不會拿到新版就直接複製貼上完成,而是把新舊版本分開保留:Module1 是已經驗證過、確定能跑的基準版,Module2 是這次要測試的新版。萬一新版程式出問題,Module1 還在,不需要重新找回原本的程式碼;同樣都叫「取得臺灣銀行匯率」,也方便直接比對兩個模組的程式碼差在哪裡、結果差在哪裡。
贊贊小屋回到 Excel 的「開發人員」索引標籤,開啟「巨集」,這時巨集清單會同時列出「Module1.取得臺灣銀行匯率」與「Module2.取得臺灣銀行匯率」兩筆,名稱相同但來自不同模組。VBA 規定同一個模組裡不能有兩個同名的 Sub,但不同模組各自建立一個同名 Sub 是允許的;正因為如此,巨集清單在顯示時會自動把模組名稱加在 Sub 名稱前面做區隔,才會看到這種「模組名稱.Sub名稱」的寫法。在清單中選擇「Module2.取得臺灣銀行匯率」,按下「執行」,才會跑到剛剛貼入的新版邏輯,Module1 這次不會被動到。
這一步有個容易被忽略的前提:VBA 程式必須儲存在支援巨集的 Excel 檔案格式中,例如 .xlsm 或 .xlsb;這次實際使用的活頁簿就是 .xlsb。如果另存成一般 .xlsx,Excel 會警告該格式無法保存 VBA 專案,因此不能直接把含有巨集的工作成果當成普通 .xlsx 儲存。也正因為兩個模組同名巨集會並列在清單中,執行前務必看清楚選到的是 Module2,選錯會直接跑到 Module1 的舊邏輯,卻不會跳出任何錯誤提示。
這種「舊版保留、新版另測」的方式,也讓後續發現「刪除第二列」可能影響真正匯率資料時,仍有原始版本可以對照,不必在已經覆蓋的程式裡反推問題。



六、一次自動產生原始報表與每日匯率紀錄
巨集執行完成後,「原始報表」已經自動更新為新的臺灣銀行匯率資料,美金、港幣、英鎊、澳幣等欄位全部重新寫入。畫面同時可以確認 G1 已寫入 2026/08/25,訊息框顯示「臺灣銀行匯率取得完成!原始報表:已更新,執行日期:2026/08/25,每日匯率表:已新增今天匯率資料。」一次執行已經同時完成原本分散的多項工作。
贊贊小屋再切換到「每日匯率表」,第 4 列已經新增 2026/08/25、星期二,以及美元即期買入 31.8350、美元即期賣出 31.9350、日元即期買入 0.1982、日元即期賣出 0.2022。這是對訊息框結果的實際驗證,訊息框告訴贊贊小屋新增完成,資料表則確認紀錄真的存在。
這裡其實同時使用了兩種不同的資料更新方式:「原始報表」每次執行都重新整理,目的在維持最新狀態;「每日匯率表」則採逐筆追加,目的在保存不同日期的歷史紀錄。因此程式還要先檢查當天日期是否已經存在,避免同一天重複執行巨集時產生兩筆相同日期的資料。前者解決的是「現在是多少」,後者解決的是「過去每天是多少」,兩種資料放在不同工作表,後續做期間比較或趨勢分析時才不會互相干擾。



七、AI 寫完程式後,還要檢查資料邏輯與實際結果
後續檢查程式邏輯時,贊贊小屋再次向 ChatGPT 確認「刪除第二列」應該如何處理。ChatGPT 特別提醒,整理後的匯率資料是從 ws.Range("A2").Resize(dataCount, 5).Value = arr 開始寫入,如果這時再加入 ws.Rows(2).Delete,反而會把第一筆真正的美元匯率資料刪除。AI 理解自然語言需求,不代表第一次產出的程式邏輯一定完全符合實際資料結構,「刪除第二列」這種描述看起來很明確,但必須進一步確認到底是在抓取原始網頁資料前刪除、寫入陣列時排除,還是整理完成後再刪除 Excel 的第二列,三種做法的結果完全不同。
最後贊贊小屋開啟臺灣銀行牌告匯率網站,畫面顯示「2026/08/25 本行營業時間牌告匯率」,牌價最新掛牌時間為 2026/08/25 15:06,核對美金即期買入 31.835、即期賣出 31.935,日圓即期買入 0.1981、即期賣出 0.2021。這一步負責文章最後的人工驗證,AI 回覆成功、Excel 顯示成功,還要回到原始官方資料確認,不能只看到訊息框執行完成就認定所有數值一定正確。
由於這次是在臺灣銀行營業時間內執行程式,牌告匯率仍可能隨市場變動重新掛牌,因此稍後回到官網核對時,日圓即期匯率出現 0.0001 的些微差異,是不同掛牌時間下可能出現的正常波動,這裡主要確認的是 VBA 是否抓到正確的幣別與即期買入、賣出欄位。



從每天更新一次,變成一份可以累積的資料
能夠取得最新資料、把資料整理乾淨,是報表可以自動產生的前提;這一篇要處理的,是資料的時間軸——每天重新抓一次最新匯率,本來只會得到一份新的現在,把其中的重要欄位另外追加保存之後,Excel 裡才真正開始形成一段歷史。
自動產生報表的價值,不只在於省下手動複製貼上的時間,更在於讓每一次執行都成為長期資料的一部分。原始報表持續呈現當下狀態,每日匯率表則安靜地往下累積,兩者互不干擾,各自完成自己的任務。
如果希望連巨集都不必手動執行,也可以利用 VBA 開啟檔案 的 Workbook_Open 事件,讓 Excel 開啟時自動更新報表。每日匯率累積之後,接著可以進行期間比較,利用 外匯圖表教學 將歷史資料做成折線圖,再找出最高最低值,逐步往更完整的資料分析前進。
學會計、學Excel、學習AI工具,歡迎加入贊贊小屋社群。
Claude Code 教學:從安裝到 Excel、PPT 與網頁實戰
Claude Code 教學、ChatGPT怎麼用?、ChatGPT Excel教學、ChatGPT寫ExcelVBA、Gemini是什麼?、Notion教學、AI對會計的影響。
贊贊小屋AI課程:OpenClaw AI 代理、Codex 網站、Claude Code 實戰、ChatGPT課程、AI工具全攻略、Notion課程。
相關文章:

