在 Excel 中,CALL 函數屬於早期的 XLM 宏語言,用於直接呼叫外部 DLL(動態連結程式庫)中的函數。由於安全性與相容性問題,CALL 函數在現代 Excel 中已預設停用,且不支援 64 位元環境。若需呼叫 DLL,應改用 VBA 的 Declare 語法。
🔹快速摘要(語法、用途、常見場景)
- 用途:呼叫外部 DLL 中的函數(僅限 XLM 宏語言)
- 語法:
=CALL("Library","Function","TypeText",Argument1,Argument2,...) - 常見場景:舊版 Excel 的系統整合、API 呼叫、硬體控制(現已不建議使用)
一、CALL 函數語法與用途
語法:
=CALL("Library","Function","TypeText",Arg1,Arg2,...)
- "Library":DLL 檔案名稱(例如 "user32")
- "Function":DLL 中的函數名稱(例如 "MessageBoxA")
- "TypeText":參數與回傳值的型別定義(例如 "JJJC")
- Arg1, Arg2,...:傳入的參數值
=CALL("user32","MessageBoxA","JJJC",0,"警告","標題",0)
此範例會呼叫 Windows API 顯示訊息框,但在現代 Excel 中通常會被阻擋。
二、範例教學:五個基礎 + 五個進階範例
🔸基礎範例
範例一:呼叫 Windows 訊息框(MessageBoxA)
=CALL("user32","MessageBoxA","JJJC",0,"Hello","Title",0)
範例二:呼叫自訂 DLL 中的函數
=CALL("mydll","MyFunction","JJ",100,200)
範例三:傳入字串參數
=CALL("user32","MessageBoxA","JJJC",0,"測試訊息","標題",0)
範例四:回傳整數結果
=CALL("kernel32","GetTickCount","J")
範例五:處理錯誤型別定義
=CALL("user32","MessageBoxA","JJJX",0,"錯誤","標題",0)
回傳 #VALUE! 或導致 Excel 異常。
🔸進階範例(僅供理解,不建議實作)
範例六:搭配 REGISTER 函數註冊 DLL 函數
=REGISTER("user32","MessageBoxA","JJJC","警告","標題",0)
範例七:搭配 XLM 宏語言建立自動化流程
=CALL("mydll","AutoProcess","JJJ",A1,B1,C1)
範例八:呼叫硬體控制 DLL(如 COM 埠)
=CALL("serial.dll","OpenPort","J",1)
範例九:處理多型別參數(整數 + 字串)
=CALL("mydll","SendCommand","JC",100,"CMD")
範例十:搭配 GET.CELL 擷取儲存格資訊後傳入 DLL
=CALL("mydll","ProcessCell","J",GET.CELL(1,A1))
三、常見問題解答(FAQ)
Q1:CALL 為什麼會被停用?
因為它可直接呼叫外部程式庫,可能造成安全風險或執行惡意程式碼。
Q2:CALL 可以在 VBA 中使用嗎?
不行,VBA 使用 Declare PtrSafe Function 搭配 Lib 來呼叫 DLL,不使用 CALL 函數。
Q3:CALL 是否支援 64 位元 Excel?
不支援,CALL 屬於 XLM 宏語言,與 64 位元環境不相容。
Q4:CALL 是否可用於一般函數設計?
不建議,現代 Excel 開發應使用 VBA 或 Office JavaScript API。
Q5:CALL 是否可在 Excel 365 使用?
預設為停用,需啟用 XLM 宏支援,且仍有安全風險。
四、注意事項與錯誤排除
- CALL 函數屬於高風險函數,可能遭防毒軟體或 Excel 安全性機制阻擋
- 若 DLL 或函數不存在,會回傳
#VALUE!或導致 Excel 異常 - 若型別定義錯誤,可能造成記憶體錯誤或系統崩潰
- 若需進行 DLL 呼叫,請改用 VBA 的
Declare語法 - CALL 函數無法在 Excel Web 或 Mac 版本使用
五、延伸技巧與相關函數
若你有 DLL 整合或系統呼叫需求,以下是比 CALL 函數更安全、現代化的替代方案:
首先,VBA 的 Declare Function 語法是目前最推薦的方式。它能安全地呼叫 DLL 函數,支援 64 位元環境,並可明確定義參數型別與錯誤處理邏輯。這是 CALL 函數在 VBA 中的正式替代方案。
其次,若你正在開發 Excel Online 或跨平台應用程式,Office JavaScript API 提供了更現代化的整合方式。它支援網頁端執行,並能與 Excel、Outlook、Teams 等 Office 元件互動,適合雲端與企業級開發。
若你的目的是資料整合與轉換,Power Query(M 語言)是更合適的工具。它不需呼叫外部 DLL,就能完成複雜的資料清理、合併與轉換流程,並支援多種資料來源。
最後,若你想在 Excel 中建立自訂邏輯或批次處理,Lambda 函數與 MAP 函數是現代 Excel 的首選。它們能在儲存格中建立可重複使用的邏輯,並批次處理整欄資料,完全不需依賴外部程式庫。
這些工具不僅更安全,也更符合現代 Excel 的設計理念,建議全面取代 CALL 函數的使用。
六、結語與延伸閱讀推薦
CALL 函數是 Excel 中極少數可直接呼叫外部程式庫的函數,但因安全性與相容性問題,已不建議使用。若你有 DLL 整合需求,請改用 VBA 的 Declare Function 或探索 Office JavaScript API。
延伸閱讀:
- [Declare Function 教學]:VBA 呼叫 DLL 的安全做法
- [Excel Lambda 函數教學]:現代自訂邏輯設計工具
- [Power Query 教學]:資料整合與轉換的首選工具












