VBA 自動輸入可以把銀行對帳單的交易資料,直接填進企業原有的 Excel 日報表,不必再逐筆複製貼上。贊贊小屋用免費版 ChatGPT 說明需求、取得程式,成功把台北富邦銀行 19 筆交易轉入日報表,也整理了貼上程式時遇到的編譯錯誤。
一、台北富邦銀行查詢交易明細
要讓 VBA 有資料可以搬,第一步是從網路銀行取得原始的交易明細。贊贊小屋在台北富邦銀行的網路銀行,從上方選單進入「存款/外匯/轉帳」,再依序點選「存款交易查詢」與「臺外幣交易明細查詢」。頁面上方的說明寫得很清楚:提供最近一年的交易明細查詢,每次選擇的查詢範圍不可超過六個月。
進入查詢頁後,「查詢項目」維持預設的「交易明細」,另外兩個選項分別是「國內匯入款」與「國外匯入款」。查詢期間可以用「快速查詢」選近 1 個月、近 3 個月等區間,也可以在「自訂查詢」輸入起訖日期。這次贊贊小屋查詢的期間是 2026/10/01 至 2026/11/01,確認帳號與期間之後,按下頁面下方的「開始查詢」,銀行就會列出這段期間的交易明細。
這裡有一個值得先分清楚的觀念:銀行提供的交易明細,和企業內部使用的銀行存款日報表,是兩份用途不同的文件。交易明細是銀行依每一筆收支產生的原始紀錄,欄位與版面由銀行決定;銀行存款日報表則是企業依自己的管理需求整理出來的報表,可能加上固定的標題、期間、合計與核對資訊。兩者的金額來源相同,但格式通常不一樣,這正是需要把資料「轉入」日報表的原因。
另外,銀行的交易明細和企業自己的會計帳簿,也不一定完全相同。例如公司已經開出支票但銀行尚未兌現,或是銀行已經扣除手續費而公司還沒入帳,兩邊的餘額就會暫時對不起來。會計上會用銀行調節表處理這類差異,不過這次的重點是資料搬移,不展開調節的做法。
二、下載 Excel 格式的銀行對帳單
選擇下載之後,畫面會跳出「檔案下載格式」視窗,提供「TXT」「EXCEL」「PDF」三種「檔案格式」。因為這次要用 VBA 處理資料,贊贊小屋選擇「EXCEL」,再按下藍色的「確認」按鈕,銀行就會產生一份可以在 Excel 開啟的對帳單檔案。
三種格式各有適合的用途。Excel 格式保留欄與列的結構,方便用公式或 VBA 整理計算;TXT 是純文字,使用前要先確認欄位的分隔方式與編碼,比較適合批次匯入或交給程式處理;PDF 重視版面與閱讀,適合保存、列印與人工查閱,但資料要再擷取出來,處理起來也比較麻煩。
要特別提醒的是,不是每一家銀行都提供 Excel 格式。這次剛好台北富邦銀行有提供,原始資料可以直接在 Excel 開啟,用 VBA 處理相當方便。如果手上只有 PDF,或是對帳資料是透過電子郵件寄來的附件,就需要先把資料擷取出來,也可能要搭配 Python、Power Automate 等其他工具,不一定只能靠 VBA。
最後補充檔案格式的差異。銀行下載的檔案是舊版的 XLS 格式,這類 Excel 97-2003 格式的檔案,用新版 Excel 開啟時會自動進入「相容模式」,贊贊小屋的檔案標題列也出現了這三個字。一般的 XLSX 可以保存資料與公式,但不能保存 VBA 巨集;如果要把程式一起存起來,必須另存成 XLSM 這類支援巨集的格式,各種格式能否保存巨集,可以查看 Microsoft 的Excel 中支援的檔案格式。這一點在後面貼上程式時會再用到。
三、認識銀行對帳單的 Excel 欄位
下載後打開檔案,會看到內容並不是一張從第一列就開始的標準表格。贊贊小屋看到的第 1 列到第 6 列,是銀行附上的查詢資訊,包含「存款/外匯/轉帳 > 存款交易查詢 > 臺外幣交易明細查詢」的路徑、查詢說明、帳號、查詢項目與「2026/10/01~2026/11/01」的查詢期間,第 6 列則標示「查詢結果」。
真正的欄位名稱在第 7 列,依序是「帳務日期」「交易時間」「摘要」「支出金額」「存入金額」「即時餘額」與「附註」,從第 8 列開始才是一筆一筆的交易。像第一筆是 2026/10/05 的「電費」,支出 598.00 元,交易後的即時餘額是 66,982.00 元。這份對帳單一共有 19 筆交易,有存入也有支出。
了解這個結構,對寫程式很重要。因為資料從第 8 列才開始,VBA 就不能從第 1 列處理,而是要設定成從第 8 列開始、處理到最後一筆交易為止。後面的程式中,For i = 8 To 最後列 就是在做這件事。至於「最後一筆在哪一列」,程式用的是 ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row:它從 A 欄的最底端往上找,遇到的第一個有內容的儲存格,就是最後一列,相當於在 Excel 裡先按 End 鍵、再按 ↑。這樣不管交易是 19 筆還是更多,程式都不需要事先寫死列數。
不過這個方法有前提,就是 A 欄必須是整齊的交易資料。它並不是能自動辨識所有銀行格式的通用工具,換成別家銀行或欄位位置不同的檔案,就要重新確認欄位與起始列。另外,部分金額儲存格的左上角有綠色三角形,這是 Excel 錯誤檢查的提示,常見原因之一是數字以文字形式儲存,直接計算可能出問題。所以程式在轉入金額時,先用 Replace 去掉千分位逗號,再用 Val 轉成數值;Val 遇到逗號就不再往下讀,也只認句點作為小數點,因此這種寫法適合這份資料的格式,不是能處理所有數字格式的通用做法。還有一個容易混淆的地方:「即時餘額」是每筆交易完成之後的銀行餘額,不是收入或支出的合計,後面核對時會用到這個觀念。
四、準備企業原有的銀行存款日報表
這次的需求和「請 AI 設計一張新報表」不同,贊贊小屋的企業本來就有自己的銀行存款日報表格式,只是希望把對帳單裡的金額自動寫進去,不必再逐筆手動輸入。所以同一個活頁簿裡有兩張工作表:一張叫「銀行對帳單」,放銀行下載的原始資料;另一張叫「銀行存款日報表」,是已經排好版的報表。
打開「銀行存款日報表」,最上方是深藍色底的標題「銀行存款日報表」,下方是銀行名稱、銀行帳號與報表期間等基本資訊,第 7 列則是深藍色的欄位名稱,由左到右為「日期」「摘要」「收入」「支出」「餘額」「備註」。第 8 列以下還沒有交易資料,只有預先設定好的格式,金額欄位會顯示「-」。這些標題、顏色與框線都是企業原本就做好的。這次使用 VBA 自動輸入資料,目的只是將銀行交易明細填進企業原有的日報表,不需要重新設計整張報表。
為什麼要把原始資料和報表分成兩張工作表?因為銀行下載的資料是查核的依據,不應該被程式修改或覆蓋;報表出問題時,也能回到原始資料重新執行一次。這種做法可以稱為「原始資料與報表呈現分離」,是用 Excel 做自動化時很基本的好習慣。
另一個值得介紹的是 ClearContents。後面的程式在填入資料前,會先用 ws2.Range("A8:F" & 最後列2).ClearContents 清掉日報表舊的資料。ClearContents 只清除儲存格裡的內容,格式會保留;如果改用 Clear,內容與格式會一起清掉,企業原有的樣式也就跟著消失。這次選擇 ClearContents,目的就是讓既有的日報表格式可以重複使用。
五、使用 ChatGPT 產生 VBA 自動輸入程式
接下來是這篇文章最核心的部分。贊贊小屋打開免費版 ChatGPT,把包含兩張工作表的「VBA 測試.xlsx」上傳,再用平常說話的方式輸入需求,沒有指定任何程式語法:
傳給ChatGPT的問題檔案裡面有兩個工作表,「銀行對帳單」是從網站上下載下來的資料。我希望把這個原始的對帳單資料,將裡面的交易資料寫入到另一張工作表,是有固定格式的「銀行存款日報表」。請幫我設計VBA程式。
這段提示詞是贊贊小屋刻意寫成一般學員會輸入的樣子:先說明檔案裡有哪兩張工作表,再說明哪一張是來源、哪一張是目標,最後才提出「請幫我設計 VBA 程式」。送出後,ChatGPT 先花了約 29 秒分析檔案,接著回覆已經檢查過 Excel 檔案,兩張工作表的欄位都很清楚,這個需求可以使用 VBA 自動完成,不需要複雜的樞紐分析表或公式。隨後它提供了下面這段程式:
VBA程式|製作銀行存款日報表()Sub 製作銀行存款日報表()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim 最後列 As Long
Dim 最後列2 As Long
Dim i As Long
Dim 目標列 As Long
'指定來源及目標工作表
Set ws1 = Worksheets("銀行對帳單")
Set ws2 = Worksheets("銀行存款日報表")
'取得原始資料最後一列
最後列 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
'確認是否有交易資料
If 最後列 < 8 Then
MsgBox "沒有銀行交易資料!"
Exit Sub
End If
'清除日報表舊資料
最後列2 = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row
If 最後列2 < 8 Then 最後列2 = 8
ws2.Range("A8:F" & 最後列2).ClearContents
'更新報表期間
ws2.Range("C4").Value = Replace(ws1.Range("B5").Value, "~", " ~ ")
'逐筆轉入銀行交易資料
For i = 8 To 最後列
目標列 = i
'複製日報表原有格式
If 目標列 > 8 Then
ws2.Range("A8:F8").Copy
ws2.Range("A" & 目標列).PasteSpecial xlPasteFormats
End If
'日期
ws2.Cells(目標列, "A").Value = CDate(ws1.Cells(i, "A").Value)
'摘要
ws2.Cells(目標列, "B").Value = ws1.Cells(i, "C").Value
'收入(原始存入金額)
ws2.Cells(目標列, "C").Value = _
Val(Replace(ws1.Cells(i, "E").Value, ",", ""))
'支出(原始支出金額)
ws2.Cells(目標列, "D").Value = _
Val(Replace(ws1.Cells(i, "D").Value, ",", ""))
'餘額
ws2.Cells(目標列, "E").Value = _
Val(Replace(ws1.Cells(i, "F").Value, ",", ""))
'備註
ws2.Cells(目標列, "F").Value = ws1.Cells(i, "G").Value
Next i
Application.CutCopyMode = False
MsgBox "銀行存款日報表製作完成!" & vbCrLf & _
"共轉入 " & 最後列 - 7 & " 筆交易資料。"
End Sub
這段程式沒有用到太深的技巧,主要工作其實只有幾件:指定來源與目標工作表、找出最後一列、清掉舊資料、逐筆把欄位對應填進去,最後顯示完成訊息。欄位的對應關係是:銀行對帳單的「帳務日期」填入日報表的「日期」,「摘要」填入「摘要」,「存入金額」填入「收入」,「支出金額」填入「支出」,「即時餘額」填入「餘額」,「附註」填入「備註」。
這個過程帶出一個觀念,就是「自然語言程式設計」:使用者先用白話說明資料來源與想要的結果,再由 AI 轉換成程式碼。贊贊小屋的提示詞裡沒有提到 For 迴圈、End(xlUp) 或 PasteSpecial,ChatGPT 仍然能自行選擇適合的 VBA 方法。對初學者來說,明確指出來源工作表、目標工作表與預期結果,往往比使用大量技術術語更重要。
當然,白話的需求也可能有不夠明確的地方。例如提示詞沒有說要不要依日期彙總、要不要保留摘要、沒有交易的日期要不要列出,AI 就可能做出不同的設計。比較實際的做法,是先用簡單的提示詞取得第一版程式,再依執行結果補充需求,而不是一開始就追求一份完美的長篇規格。使用 AI 產生程式時,程式碼也需要人工檢查,不能因為它是 AI 寫的就直接相信;想看更完整的貼上、啟用巨集與存檔流程,可以參考ChatGPT 寫 Excel VBA。
六、將 VBA 程式貼入 Excel 並排除錯誤
拿到程式後,贊贊小屋回到 Excel,開啟 VBA 編輯器(Microsoft Visual Basic for Applications),可以從功能表的「開發人員」進入,也可以按 Alt+F11。在左側「專案」視窗中可以看到這個活頁簿的結構:「Microsoft Excel 物件」底下有對應「銀行對帳單」與「銀行存款日報表」的兩張工作表,另外用「插入」建立了一個標準「模組」,名稱是 Module1。程式要貼在這個模組的程式碼視窗裡。
貼上之後,贊贊小屋直接從功能表選擇「執行」,卻跳出了一個警告視窗,標題是「Microsoft Visual Basic for Applications」,訊息是「編譯錯誤:不正確的字元」。回頭看程式碼視窗,問題一眼就看得出來:程式的第一行不是 Sub 製作銀行存款日報表(),而是多了一行 ```vb。
這行字元是 Markdown 程式碼區塊的開頭標記,不是 VBA 語法。ChatGPT 為了讓回答容易閱讀,常會用程式碼框把程式包起來,並在開頭標示程式語言;複製時如果連框線的標記一起選進去,貼到 VBA 編輯器就會變成不合法的字元。排除方法很簡單:只複製框內真正的 VBA 程式,從 Sub 開始、到 End Sub 結束,不要包含前後的三個反引號與語言名稱,或者把貼進去的標記行直接刪掉,再重新執行即可。
這個小插曲也順便說明了「編譯錯誤」的意思。編譯錯誤代表程式在還沒開始執行前,就已經被檢查出語法不合法,例如這次的不正確字元。另一種是「執行階段錯誤」,程式本身語法沒問題,但執行過程中遇到狀況而中斷,例如工作表名稱和程式裡寫的不一致,或是資料無法轉換。遇到錯誤訊息時,先分辨是哪一類,再回頭看訊息指出的位置,通常比較容易找到原因。
七、執行 VBA,自動完成銀行日報表
排除錯誤後再次執行巨集,贊贊小屋看到銀行存款日報表已經填滿了資料。程式從第 8 列開始,把銀行對帳單的 19 筆交易依序轉入:日期、摘要、收入、支出、餘額與備註各自落在對應的欄位,金額使用日報表原有的千分位格式,沒有存入或支出的欄位則顯示為「-」。10 月 5 日的電費 598.00 元、10 月 6 日的 CD 轉收 21,888.00 元,一路排到 10 月 27 日的手續費 600.00 元,餘額欄最後停在 50,306.00 元。依程式的設計,完成時還會跳出訊息,告訴使用者共轉入幾筆交易。
要看懂這個結果,先要分清楚「資料搬移」和「資料計算」的差別。這段 VBA 做的是搬移:把日期、摘要、金額與備註從對帳單搬到日報表,並複製第 8 列原有的格式,讓每一列都有一致的外觀;它並沒有重新計算期初餘額,也沒有按日彙總,更不是自己設計出一份新報表。報表最下方黃色的「驗算」列,是這份日報表原本就有的,不是 VBA 新增的功能。
驗算列顯示收入合計 58,006.00 元、支出合計 75,280.00 元、餘額 50,306.00 元。這三個數字的關係是:第一筆交易發生前的餘額,加上全部收入、再扣除全部支出,會等於最後一筆交易之後的餘額。第一筆是 10 月 5 日支出 598 元、交易後餘額 66,982 元,所以交易前的餘額是 67,580 元,計算起來就是 67,580 + 58,006 - 75,280 = 50,306,和最後一筆的即時餘額完全一致。
這裡也能看出「餘額」和「發生額」的不同。收入與支出是一段期間內發生的金額,可以直接加總;銀行餘額則是某個時間點的存款結存,把不同日期的餘額全部加起來沒有意義。贊贊小屋選取餘額欄的 19 個儲存格時,Excel 右下角的狀態列顯示「項目個數: 19」、「加總: 1,515,538.00」,這個加總就只是 19 個不同時間點餘額的相加,並不代表任何存款總額。真正有用的核對方式,是比對交易筆數、收支合計與期末餘額。
最後要說明這次驗證的範圍。目前確認的是這份 19 筆交易的資料轉入正確,收支與餘額能夠勾稽;程式用 End(xlUp) 找最後一列,理論上可以配合不同筆數,但這次沒有另外測試不同筆數、空白資料或其他銀行格式,所以不能據此說程式已經通過所有情況。程式也是以第 8 列對應第 8 列的方式逐列填入,換用不同版面的日報表時,同樣需要先確認列的位置。
免費版 ChatGPT 也能協助完成 VBA 自動輸入
回頭看這次的經驗,原本只是銀行網站下載的一份 Excel,和一張公司已經排好版的日報表。以前要把資料填進去,得逐筆複製日期、摘要與金額;筆數少時還可以忍受,一旦資料變多,重複輸入不僅耗時,也容易看錯或漏填。這次贊贊小屋用免費版 ChatGPT,只用一般學員會說的白話描述需求,就拿到可以執行的 VBA 程式,中間雖然因為多貼了程式碼框的標記而出現編譯錯誤,但排除之後,順利把 19 筆銀行交易填進企業原有的日報表。
這並不表示每次輸入相同的提示詞,都會得到一模一樣或完全正確的程式。AI 的回答會變,程式也要經過實際執行與核對才能相信;這次的收獲,是確實測試成功了一次,而且過程裡的提示詞、錯誤與解決方式,都有參考價值。如果你手邊也有固定格式的報表,不妨先從簡單的需求開始,讓 ChatGPT 提供第一版程式,再一邊測試一邊調整。

