發票自動記帳:用 Gemini AI 產生 VBA,把發票整理成會計分錄

發票自動記帳是透過 Gemini AI 產生的 VBA,把整理好的發票明細表自動轉換成會計日記簿分錄的做法。本文會從資料表設計、Prompt 撰寫方式,到第一次執行失敗後的修正過程,完整整理這套流程,讓讀者理解 AI 產生 VBA 的關鍵,不是程式能力,而是有沒有把資料結構講清楚。

發票自動記帳:用 Gemini AI 產生 VBA,把發票整理成會計分錄

一、發票自動記帳怎麼做?先把資料結構設計清楚

發票自動記帳並不是打開 Excel 就直接請 AI 寫一段程式碼,而是要先把資料流程設計清楚,VBA 才有辦法穩定運作。贊贊小屋這次實測的做法,是先在 Excel 裡建立三張工作表:發票明細表、會科主檔、日記簿。這三張表分別扮演不同角色:發票明細表是原始交易資料,把每一張發票的日期、金額、費用類別整理進去;會科主檔是分類規則,負責把「汽油費」「文具用品」這類原始類別,對應到正式的會計科目與科目代碼;日記簿則是最終輸出結果,也就是 VBA 執行完成後,實際寫入的會計分錄。

這種先定義資料結構、再進行自動化設計的方式,可以讓後續流程更加穩定。當資料來源、分類規則與輸出結果都有清楚定義後,AI 才能依照這些條件協助產生適合的 VBA 程式,這也是這篇文章從頭到尾最重要的一個觀念。

一、發票自動記帳怎麼做?先把資料結構設計清楚 9

二、先把 Google 試算表下載成 Excel 檔

如果發票資料已經透過 發票自動辨識 的方式整理成 Google 試算表,第一步就是先把這份試算表下載成 Excel 檔,因為 VBA 必須在 Excel 環境才能執行。操作方式是在 Google 試算表裡點選「檔案」,接著選擇「下載」,再選「Microsoft Excel(.xlsx)」,系統就會把整份發票明細表匯出成一個 .xlsx 檔案,下載完成後用 Excel 開啟即可。

這裡有一個容易被忽略的細節:如果之後要在這個檔案裡保留 VBA 程式碼,必須另存成 .xlsm 格式,一般的 .xlsx 檔案是無法儲存巨集的。贊贊小屋建議下載完成、確認資料完整之後,就先做這個另存動作,避免後面寫完 VBA 才發現存不進去,還要重新來一次。

二、先把 Google 試算表下載成 Excel 檔
二、先把 Google 試算表下載成 Excel 檔 9

三、先建立 3 張工作表,VBA 才能運作

檔案準備好之後,接下來要在同一個活頁簿裡整理出三張工作表,VBA 才有明確的讀寫對象。第一張是發票明細表,欄位依序為「日期」「發票號碼」「賣方名稱」「統編」「摘要」「金額」「費用類別」「備註」,畫面上已經先填入六筆範例資料,方便對照後續 VBA 執行的結果,這張表可以作為 VBA 讀取的來源資料。

第二張是會科主檔,欄位是「原始類別」「會計科目」「科目代碼」,另外還帶有「財報類別」「財報項目」「說明」欄位補充。這張表的功能是建立費用類別與正式會計科目之間的對照規則,例如「汽油費」對應到「旅費」,科目代碼是 6113;「雜項費用」對應到「其他費用」,科目代碼是 6188,這部分的欄位規劃可以參考 AI 會計科目整理 這篇文章的做法。

第三張則是日記簿,欄位包含「傳票日期」「傳票編號」「會計科目」「科目代碼」「傳票摘要」「借方金額」「貸方金額」,這張表在還沒執行 VBA 之前是完全空白的,是整個流程最後要被寫入資料的地方。

發票明細表、會科主檔、日記簿三者缺一不可,來源資料、分類規則、輸出結果各自獨立,AI 產生的 VBA 才知道該去哪裡讀資料、依照什麼規則轉換、又該把結果寫到哪裡,少了任何一張表,後面的程式邏輯都無法完整運作。

三、先建立 3 張工作表,VBA 才能運作
三、先建立 3 張工作表,VBA 才能運作 2
三、先建立 3 張工作表,VBA 才能運作 3
三、先建立 3 張工作表,VBA 才能運作 9

四、不是叫 AI 寫 VBA,而是把需求講清楚

很多人問 AI 寫程式時,只會說「幫我寫一個發票自動記帳 VBA」,這種問法資訊量太少,AI 只能用猜的。贊贊小屋這次實際下的 Prompt,先明確設定角色「你是一位 Excel VBA 與會計自動化專家」,接著說明情境「我要建立一個小公司簡易記帳工具」,並依序列出目前 Excel 裡的工作表與欄位,例如發票明細表列出「日期、發票號碼、摘要、金額、費用類別」,會科主檔列出「原始類別、會計科目、科目代碼」,同時也一併帶到日記簿這張表,讓 Gemini 一次掌握三張表的全貌,這部分的提問方式其實跟 Prompt engineering 範例 這篇文章示範的結構是一致的。

依照這個 Prompt,Gemini 回覆了「VBA 完整程式碼,請按 Alt + F11 開啟 VBA 編輯器,點選選單插入 -> 模組,並將以下程式碼完整貼上」,並附上一段完整程式碼,開頭註解寫著「程式名稱:發票明細自動轉日記簿分錄」「適用版本:Excel 2013 及以上」,主體是一個名為 AutoGenerateJournalEntries 的巨集。

一個真正有效的 Prompt,至少要包含四個要素:角色、工作表、欄位、輸出要求。角色決定 AI 用什麼專業角度回答;工作表與欄位讓 AI 知道資料實際長什麼樣子,不用憑空猜測;輸出要求則是明確講清楚需要一份完整、可執行、適用特定 Excel 版本的 VBA 程式碼。不過這份看似完整的 Prompt,欄位描述其實還不夠細,這個問題會在後面兩節逐漸顯現出來。

四、不是叫 AI 寫 VBA,而是把需求講清楚
四、不是叫 AI 寫 VBA,而是把需求講清楚 2
四、不是叫 AI 寫 VBA,而是把需求講清楚 9

五、實際操作 4 步驟,把 Gemini 產生的 VBA 放進 Excel

拿到 Gemini 產生的 VBA 之後,贊贊小屋按下 Alt + F11 開啟 VBA 編輯器,在專案總管裡對著「VBAProject(發票明細表.xlsm)」按右鍵插入模組,把完整程式碼貼進 Module 視窗。接著點選選單「執行(R)」,選擇「執行 Sub 或 UserForm」,快速鍵是 F5,選好 AutoGenerateJournalEntries 這個巨集名稱後執行。

執行完成,畫面卻跳出一個「成功」的提示視窗,內容寫著「轉入完成!共成功產生 0 筆發票的分錄(共 0 行日記簿資料)。」,底下的日記簿工作表裡,「傳票日期」「傳票編號」「會計科目」「科目代碼」「傳票摘要」「借方金額」「貸方金額」這些欄位標題都還在,但整個表格是空的,一筆資料都沒寫進去。

程式確實有執行、也沒有跳出任何錯誤訊息,這一點反而讓人更容易誤以為問題出在 Excel 版本或設定上。然而,執行沒有出錯跟結果是否正確,其實是兩件事,真正的原因要從上一節那份 Prompt 重新檢視才找得到答案。

五、實際操作 4 步驟,把 Gemini 產生的 VBA 放進 Excel
五、實際操作 4 步驟,把 Gemini 產生的 VBA 放進 Excel 2
五、實際操作 4 步驟,把 Gemini 產生的 VBA 放進 Excel 9

六、為什麼第一次執行失敗?關鍵是欄位沒有講清楚

AI 不怕使用者不會寫程式,怕的是使用者沒有把欄位講清楚。贊贊小屋重新檢視上一節的 Prompt,發現發票明細表的欄位描述只寫了「日期、發票號碼、摘要、金額、費用類別」,漏掉了「賣方名稱」跟「統編」這兩欄,於是把 Prompt 修正成「你是一位 Excel VBA 與會計自動化專家。我要建立一個小公司簡易記帳工具。目前 Excel 有三張工作表:1. 發票明細表 欄位:日期、發票號碼、賣方名稱、統編、摘要、金額、費用類別 2. 會科主檔 欄位:原始類別、會計科目、科目代碼」,並接續列出日記簿的欄位,把三張表的完整欄位順序一次交代清楚。

依照補齊後的 Prompt,Gemini 這次回覆的 VBA 程式碼裡多了一段註解「2. 逐行讀取發票明細表(從第 2 列開始,第 1 列為標題)」,並且明確寫出「讀取資料欄位(依序為:A 日期,B 發票號碼,C 賣方名稱,D 統編,E 摘要,F 金額,G 費用類別)」,逐欄用 wsInvoice.Cells(i, 1) 到 Cells(i, 7) 讀取對應資料,還加了一段「組合摘要內容(結合賣方名稱與原始摘要,提升備查效益)」的邏輯,把賣方名稱跟原始摘要串在一起。

原因其實很單純:AI 完全看不到 Excel 實際畫面,它能依賴的只有文字說明,一旦欄位描述有落差,寫入邏輯自然對不上,程式即使能執行,也找不到對的資料可以寫。同一個需求,只差在欄位描述完不完整,第一次是 0 筆、第二次就能對上所有欄位,這正是這篇文章最想讓讀者理解的一件事:AI 產生 VBA 能不能用,關鍵不是 AI 聰不聰明,而是使用者有沒有把資料結構交代清楚。

六、為什麼第一次執行失敗?關鍵是欄位沒有講清楚
六、為什麼第一次執行失敗?關鍵是欄位沒有講清楚 2
六、為什麼第一次執行失敗?關鍵是欄位沒有講清楚 9

七、自動記帳完成後,要檢查 4 件事

拿著修正後的 VBA,贊贊小屋回到 Module2 重新確認程式碼,這次的巨集改用 GenerateJournalEntries 這個名稱,一開始就宣告了 wsInvoice、wsAccount、wsJournal 三個工作表物件,以及 invDate、invNum、invVendor、invSummary、invAmount、invCategory 這些對應發票明細欄位的變數,確認宣告無誤後,同樣從「執行(R)」選單選擇「執行 Sub 或 UserForm」執行。

這次跳出的視窗變成「執行成功」,內容寫著「日記簿分錄已成功轉換並寫入!共處理 6 筆發票。」,日記簿裡也確實出現了從 2026/08/01 到 2026/08/06 共 6 張發票、12 筆分錄,例如傳票編號 V0001 對應「旅費」科目代碼 6113 借方 1,023 元、同一張傳票的「現金」科目代碼 1101 貸方 1,023 元,其餘幾筆分別對應到「旅費」與「其他費用」科目,每張發票都是一借一貸成對出現。

VBA 執行成功、日記簿也寫入資料之後,並不代表可以直接拿去用,贊贊小屋建議至少檢查四件事:第一,每張發票是否都產生了 2 筆分錄,一借一貸才能形成一張完整的傳票;第二,借貸是否平衡,也就是借方金額加總要等於貸方金額加總,這部分的基本邏輯可以參考 會計分錄怎麼寫 這篇文章;第三,科目是否正確,發票明細表裡的費用類別,是否都依照會科主檔的規則對應到正確的會計科目與科目代碼;第四,日記簿本身是否完整寫入,傳票日期、傳票編號、傳票摘要與金額有沒有缺漏。AI 能幫忙加快記帳整理的速度,但最後的驗收與判斷,仍然需要人工把關。

七、自動記帳完成後,要檢查 4 件事
七、自動記帳完成後,要檢查 4 件事 2
七、自動記帳完成後,要檢查 4 件事 9

從資料結構到自動記帳,AI 協作的關鍵是什麼

整理完這次的實測過程,會發現自動記帳能不能成功,不是取決於 VBA 寫得多複雜,而是取決於資料結構有沒有先講清楚。發票明細表、會科主檔、日記簿三張表的分工先確立好,Prompt 裡把角色、工作表、欄位、輸出要求四件事交代完整,AI 才有辦法產生真正可以執行的程式碼;第一次因為欄位描述不夠完整而寫出 0 筆分錄,正好說明了這一點。對小公司或個人工作室來說,這種方式雖然還稱不上正式的 ERP 系統,但已經是一個實用、低門檻的自動化練習,讀者若手邊也有整理好的發票明細,不妨照著這篇文章的順序,自己試著讓 AI 幫忙產生第一版 VBA。


贊贊小屋會計學入門

會計學什麼?銀行調節表是什麼應收帳款追蹤表負債及股東權益成本會計概念營業收入調節表IFRS15懶人包

贊贊小屋會計課程:Excel會計實務會計課程3合1會計自學大全集

會計自學大全集:從5大分類建立財報觀念,完整掌握會計實務