Day 28 / 自動化作業實務

資產規模 AUM
統計實務

大型文字報表解析效率

解析如何處理 ABC123 庫存報表
利用自動化腳本與 VBA 高效彙整統計

何謂 AUM?

AUM (Assets Under Management),即「資產管理規模」,是衡量金融機構或理財部門業務體量的重要指標。

  • 反映客戶委託管理的資金總額
  • 是計算管理費與績效的重要基準
  • 需每日精確掌握變動狀況

本日聚焦兩大數據

1. 基金資產規模

2. 信託本金統計

舊系統報表的挑戰

核心系統產出的 ABC123 庫存報表格式,通常面臨以下困境:

龐大的純文字檔

動輒數十 MB 的 `.txt` 檔案,包含數十萬筆客戶庫存明細,難以直接閱讀。

固定寬度與斷行

非 CSV 或 Excel 格式,而是為點陣印表機設計的排版,充滿表頭、表尾與分頁符號。

人工處理耗時

若依賴人工匯入 Excel 進行資料剖析與樞紐分析,每天需耗費大量時間且易出錯。

解析效率比較

比較項目 傳統人工匯入 Excel VBA 文字流解析
記憶體消耗 極大 (常導致當機) 極小 (逐行讀取)
處理時間 10 - 20 分鐘 3 - 5 秒
人為介入 多步驟操作 一鍵執行

解決方案架構

核心系統

產生原始報表

run.bat

批次檔自動下載

VBA 模組

高效過濾與運算

統計報表

產出 AUM 總表

技術亮點 1:自動化取檔

透過執行 run.bat,完全免除人工登入系統下載檔案的繁瑣步驟,實現排程或一鍵取檔。


@ECHO OFF
ECHO =========================================
ECHO 開始下載 ABC123 庫存報表...
ECHO =========================================

:: 使用 FTP 或內部 API 指令自動擷取
ftp -s:ftp_script.txt 

ECHO 檔案下載完成:ABC123.txt
ECHO 準備啟動 Excel VBA 處理程序...
                

實務上會搭配排程工作,在每日營業日結束後自動執行。

解析目標:ABC123 結構解析

大型列印報表通常具有特定的規律,我們需要跳過無用資訊,只抓取「明細行」。

--- 表頭區塊 (需跳過) ---
REPORT ID: ABC123              基金庫存餘額明細表              PAGE: 1
日期: 2023/10/25                                             TIME: 18:30
------------------------------------------------------------------------
帳號         基金代碼   信託本金          單位數           資產規模
------------------------------------------------------------------------
--- 明細區塊 (提取目標) ---
1234567890 1001       500,000.00       12,500.55        550,200.00
9876543210 2005       100,000.00        2,100.00         95,000.00

技術亮點 2:Line Input

  • 不使用 Excel 的「匯入字檔」功能。
  • 使用 VBA 的 Open ... For Input 語法。
  • 透過 Line Input 逐行讀取文字。
  • 記憶體中永遠只有「一行」的資料,即使檔案有 100 萬行也不會卡頓。

Dim textLine As String
Dim fileNum As Integer

fileNum = FreeFile
Open "C:\ABC123.txt" For Input As fileNum

Do Until EOF(fileNum)
    Line Input #fileNum, textLine
    ' 針對每一行 textLine 進行判斷與切割
Loop

Close fileNum
                        

萃取與辨識邏輯

由於是固定寬度的報表,我們依賴字串函數來判斷該行是否為有效資料,並精準切割欄位:

  • 特徵判斷: 檢查字串長度或特定位置是否有數字,例如 IsNumeric(Left(textLine, 10)) 判斷是否為帳號開頭。
  • 欄位擷取: 使用 Mid(textLine, start, length) 擷取特定欄位。
  • 資料清理: 使用 Trim() 去除空白,Replace(val, ",", "") 去除千分位符號以利運算。

統計目標一:基金資產規模

管理階層需要知道「每一檔基金」目前的總規模。

演算法思維

使用 VBA 的 Dictionary (字典) 物件。

以「基金代碼」為 Key,將擷取到的「資產規模」數值累加到對應的 Item 中。


' fundDict 為 Dictionary 物件
fundCode = Trim(Mid(textLine, 12, 4))
aumVal = CDbl(Replace(Mid(textLine, 50, 15), ",", ""))

If fundDict.Exists(fundCode) Then
    ' 已存在則累加
    fundDict(fundCode) = fundDict(fundCode) + aumVal
Else
    ' 不存在則新增
    fundDict.Add fundCode, aumVal
End If
                    

統計目標二:信託本金

除了市價(規模),同時也需要掌握客戶投入的原始「信託本金」總額,甚至計算帳戶數。


' 擷取本金數值
principalVal = CDbl(Replace(Mid(textLine, 20, 15), ",", ""))

' 計算總計
totalPrincipal = totalPrincipal + principalVal
totalAccounts = totalAccounts + 1

' 亦可依分行代號(帳號前幾碼)進行 Dictionary 分組統計
branchCode = Left(textLine, 3)
                    

商業價值

透過比對「信託本金」與「資產規模」,可快速推算出整體客戶庫存的未實現損益率,提供給業務單位重要決策參考。

VBA 效能終極優化

在處理百萬筆資料寫回 Excel 儲存格時,必須加上以下設定,速度可提升 100 倍以上:


' --- 處理開始前關閉耗能功能 ---
Application.ScreenUpdating = False        ' 關閉螢幕刷新
Application.Calculation = xlCalculationManual ' 改為手動計算
Application.EnableEvents = False          ' 關閉事件觸發

' ... 執行讀檔、Dictionary 計算、陣列寫入儲存格 ...

' --- 處理結束後恢復設定 ---
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
                

自動化產出成果

執行完畢後,原本雜亂的文字檔,瞬間轉換為乾淨、可直接作為報告的 Excel 彙整表:

基金代碼 總帳戶數 信託本金總額 資產規模總計
10011,245125,000,000138,500,200
200589085,600,00081,200,000
30123,102450,200,000510,800,500
總計5,237660,800,000730,500,700

導入自動化的核心效益

效率極大化

從檔案下載到報表產出,作業時間由數十分鐘縮減至 幾秒鐘。

零人為錯誤

消除人工複製貼上、公式拖曳錯誤的風險,確保資料 100% 準確。

釋放人力資源

將同仁從無聊的庶務中解放,專注於 數據分析與業務推廣。

自動化工具開發:實務心法

  • 解耦思維: 將「下載 (bat)」、「解析 (VBA)」與「呈現 (Excel)」分離,系統若改版只需修改對應模組。
  • 防呆機制: 在 VBA 中加入檔案是否存在、日期是否正確的檢查,避免錯誤執行。
  • 模組化共用: 讀取固定寬度文字檔的函數可包裝起來,未來開發其他報表(如:對帳單、手續費明細)可直接重複使用。

Q & A

感謝聆聽!
有關於文字報表解析或自動化腳本的疑問嗎?