一份清單同時有美元、日圓與台幣,金額不能直接加總。我會先保留原始金額與幣別,再逐列列出「每一單位外幣可換多少台幣」,最後才換算。
這篇延伸方格子 MAP 舊文的匯率案例。這次把匯率和金額拆兩欄,錯誤時看得出是哪一步,也讓原本就是台幣的列直接乘 1。
這是一份依目前可取得匯率更新的估值表,適合練習或觀察,不是歷史成交記帳、銀行結匯或交易報價表。需要保存實際支出時,另存成交日、實際匯率、費用與來源,不能讓今天的新匯率回頭改寫舊帳。
準備金額與幣別
在空白工作表的 A1 貼這份合成資料。保留第 7 列的空金額、第 8 列的空幣別與第 9 列的全空列;第 10 列「文字」刻意不是數字。
金額 幣別
50 USD
500 JPY
100 TWD
0 TWD
20 ZZZ
JPY
12
文字 USDUSD 是美元、JPY 是日圓、TWD 是新台幣。ZZZ 是故意放的無效代碼,不能因為看起來是三個字母就認定有資料。金額 0 是有效數值,和空白不同。
在 C1 寫「每 1 單位換 TWD」、D1 寫「台幣估值」,先清空 C2:D10,讓兩條公式各自往下展開。
第一條 MAP:每列取得匯率
C2 貼這條:
幣碼先清一般空格並轉大寫;TWD 為 1,其餘查外幣兌台幣
=MAP(
B2:B10,
LAMBDA(
code,
LET(
ccy, UPPER(TRIM(code)),
IF(
ccy="",
"",
IF(
ccy="TWD",
1,
IFERROR(
GOOGLEFINANCE("CURRENCY:"&ccy&"TWD"),
"匯率不可用"
)
)
)
)
)
)MAP 每次拿到一格幣碼,讓 LAMBDA 逐列處理。UPPER(TRIM(code)) 把一般首尾空格與大小寫整理好,因此 usd 可以組成 CURRENCY:USDTWD;它不是完整的 Unicode 清理,複製來的怪空格仍要另查。
三種分支各有用途:
- 幣別空白就不查資料,回空字串。
- 幣別是
TWD就回數字 1,不必查台幣兌台幣。 - 其他代碼組成
CURRENCY:加來源幣別與TWD;查不到或服務出錯,回「匯率不可用」。
這個提示不只代表打錯字,也可能是服務、連線或標的支援問題。不要把它替換成 0,否則加總時會把無法估值的支出當成零。
想先熟悉單一幣別的寫法,可以看 GOOGLEFINANCE 匯率與股價。
第二條 MAP:金額、幣別、匯率一起讀
D2 貼這條。三個範圍都是第 2 到第 10 列,不能少選一列:
逐列核對欄位與型態,有有效數值匯率才換算成兩位小數
=MAP(
A2:A10, B2:B10, C2:C10,
LAMBDA(
amount, code, fx,
LET(
ccy, UPPER(TRIM(code)),
IF(
AND(amount="", ccy=""),
"",
IF(
OR(amount="", ccy=""),
"缺金額或幣別",
IF(
NOT(ISNUMBER(amount)),
"金額非數值",
IF(
NOT(ISNUMBER(fx)),
"匯率不可用",
ROUND(amount*fx, 2)
)
)
)
)
)
)
)這次 MAP 同時讀三欄。amount、code、fx 依序對應金額、幣別、匯率,每一列各自跑一次 AND/OR 條件,不會把整欄合成一個條件結果。LAMBDA 與 LET 基礎有這些名稱的寫法。
先檢查欄位,再檢查金額型態,最後才乘匯率。文字形式的「100」即使看起來像數字,也應先查明來源並轉成數值,這裡不偷偷代轉。
結果怎麼核對?
匯率會隨時間變動(GOOGLEFINANCE 的報價最多延遲 20 分鐘),不能寫死成教學答案。外部資料載入完成後,依當下 C 欄核對:
| 列 | 原始資料 | D 欄應有的結果 |
|---|---|---|
| 2 | 50 USD | 50*C2 四捨五入至兩位小數;C2 應為可用匯率 |
| 3 | 500 JPY | 500*C3 四捨五入至兩位小數;C3 應為可用匯率 |
| 4 | 100 TWD | 100,C4 為 1 |
| 5 | 0 TWD | 0,保留有效的零金額 |
| 6 | 20 ZZZ | 匯率不可用 |
| 7 | 空金額、JPY | 缺金額或幣別 |
| 8 | 12、空幣別 | 缺金額或幣別 |
| 9 | 全空列 | 空白 |
| 10 | 文字、USD | 金額非數值 |
如果 C2 仍在載入,先等待並確認外部資料狀態,再判斷公式結果。若回錯誤,先看 C 欄,不要只看最後的台幣金額。
估值表的幾個界線
GOOGLEFINANCE 官方文件提醒,資料來源與支援不完整,資訊可能延遲最多 20 分鐘,提供的是資訊用途;專業使用另有授權限制。這不保證每個貨幣對都能查到,也不是銀行買入/賣出含手續費的成交價。
GOOGLEFINANCE 是 Google 試算表的函式,Excel 沒有同名函式;用 Excel 的同事要改用股票/貨幣資料類型或 STOCKHISTORY(需付費的 Microsoft 365)。
這份公式沒有傳日期,所以是會隨資料更新的當前估值。歷史資料有不同的展開格式與限制,不能直接在本式末尾加日期,就以為仍會逐列回單一匯率。保留帳務快照時,要連原始金額、匯率與取得時間一起貼成值,並確認來源符合用途。
ROUND(...,2) 改的是數值;若要顯示成 100.00,再把儲存格數字格式設為兩位小數。每列取兩位小數是本篇的計算規則,不代表所有帳務都應逐筆四捨五入。逐筆先取小數再加總,可能和先加總再取小數不同;請按用途訂規則,參考 四捨五入函式。
大量重複幣別時,本式每一列都各自查一次匯率,沒有先做共用匯率表。先用小量資料確認;若同一幣別很多列,下一步可將「每種幣別只查一次」獨立成表,再查找匯率。不要把無限整欄查詢當成免費且穩定的服務。
確認這是台幣,不呼叫外幣換算
把 A2 改成 50、B2 改成 twd。C2 與 D2 應是多少?若幣碼改成 ZZZ,為什麼不該回 0?
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章GOOGLEFINANCE 抓股價與匯率:台股代號、歷史收盤價、USDTWD 一次講完
GOOGLEFINANCE 的語法、常用屬性、歷史資料的寫法,台股(TPE:2330)與匯率(CURRENCY:USDTWD)怎麼填,以及資料延遲、抓不到資料時要注意什麼。依官方說明整理,文中不放任何即時價格,也不構成投資建議。
LAMBDA 與 LET 基礎:自訂函式、MAP 與 REDUCE
用 LET 幫重複出現的算式取名字,用 LAMBDA 自己定義函式並存成具名函式,再搭配 MAP 一格一格套用、用 REDUCE 一路累計成一個值,附 BYROW、BYCOL、SCAN、MAKEARRAY 的最短介紹。
拿掉輔助欄:用 MAP、SCAN、BYROW 重寫一張訂單表
一張手搖飲訂單表原本有小計、折扣、折扣後金額三個輔助欄,改用 MAP 搭配 LET 一條公式算完,再用 SCAN 做累計、用 BYROW 找每列最大值、用 SCAN 與 REDUCE 模擬補貨庫存。附何時還是留輔助欄的取捨。
留言討論
共 0 則留言
