ExcelのCALL関数は、DLLやXLLの中にある外部関数をワークシートから直接呼び出すための特殊関数です。DLLとはWindowsで共有して使えるコンパイル済みコード、XLLはそれをExcel専用に拡張したファイルを指します。
正直に言うと、一般の業務でCALL関数を使う場面はほぼありません。アドイン開発者やレガシーExcelファイルの保守担当者など、限られた上級者向けの関数です。
ただ、古いファイルを開いたら見慣れない =CALL(...) が出てきた、という方もいるはずです。この記事ではExcel CALL関数の構文・type_textの型コード・REGISTER.IDとの関係・現代では非推奨である理由までを誠実に解説します。読み終えるころには「読めるが書かない」関数として、CALL関数を正しく扱えるようになります。
ExcelのCALL関数とは?DLL/XLLの外部関数を呼び出す特殊関数
ExcelのCALL関数は、DLLやXLLというExcel外部のコンパイル済みライブラリに含まれる関数を呼び出すための特殊関数です。SUM関数やIF関数のようなExcel内蔵関数とは性質が違います。C/C++などで書かれた外部コードをワークシートから実行できる、いわば「橋渡し」の役割を担います。
DLLとは、Windowsで複数のプログラムから共有して使えるようコンパイル済みコードをまとめたファイルのことです。user32.dll や kernel32.dll などWindows標準のものから、業務システム独自のものまで種類はさまざまです。XLLはこのDLLをExcel専用に拡張したもので、Excelに直接組み込んで関数として登録できます。
CALL関数は古いExcel(Excel 4.0時代のXLM 4.0マクロ言語)から残る互換機能です。現在も互換性のために維持されていますが、現代の業務利用では原則使うべきでない関数である点を、最初にお伝えしておきます。理由は記事後半で詳しく解説します。
ExcelのCALL関数の書き方(構文と引数)
CALL関数には2つの呼び出し形式があります。直接DLLを指定する形式と、REGISTER関数で登録済みのIDから呼ぶ形式です。
形式1:DLLを直接指定する
=CALL(module_text, procedure, type_text, argument1, argument2, ...)
| 引数 | 説明 |
|---|---|
| module_text | DLL/XLLのファイル名またはフルパス(例: “user32″、”C:\MYLIB.DLL”) |
| procedure | 呼び出す関数名(文字列)またはエクスポート序数 |
| type_text | 戻り値・引数の型を表すコード文字列(例: “JJB”) |
| argument1, … | DLL関数に渡す実引数 |
module_text は拡張子 .dll を省略できます。Windows標準DLLなら "user32" のように関数名だけで指定可能です。
形式2:REGISTER関数で登録したIDから呼ぶ
=CALL(register_id, argument1, argument2, ...)
REGISTER関数(またはREGISTER.ID関数)でDLL関数を一度Excelに登録すると、戻り値としてID番号が返ります。次回以降は module_text や procedure を毎回書く必要がありません。IDと引数だけでCALLを実行できるため、実用上ほとんどのケースでこちらの形式が使われます。
type_textの型コード一覧(戻り値・引数の型を指定する記号)
CALL関数で最も理解が難しいのが type_text の型コードです。1文字の記号でC言語の型を指定する独自ルールで、慣れないと暗号のように見えます。
ルールはシンプルです。先頭1文字が戻り値の型、2文字目以降が引数の型を順番に並べるという決まりになっています。
主要な型コードを以下の表にまとめます。
| コード | 型の意味 | C言語型 | 備考 |
|---|---|---|---|
| A | 論理値(FALSE=0, TRUE=1) | short int | |
| B | 倍精度浮動小数点数 | double | Excelの数値の標準型 |
| C | NULL終端文字列(バイト列) | char * | 最大255文字 |
| D | バイトカウント文字列 | unsigned char * | 先頭1バイトに長さを格納 |
| E | 倍精度浮動小数点ポインタ | double * | |
| F | NULL終端文字列を返す(modify用) | char * | |
| G | バイトカウント文字列を返す(modify用) | unsigned char * | |
| H | 符号なし2バイト整数 | unsigned short int | |
| I | 符号付き2バイト整数 | short int | |
| J | 符号付き4バイト整数 | long int | |
| K | XLOPER配列 | FP * | XLLで配列を扱う |
| L | 論理値ポインタ | unsigned short int * | |
| N | 符号付き4バイト整数ポインタ | long int * | |
| P | XLOPER(汎用Excelデータ型) | XLOPER * | XLLで使われる |
| R | XLOPER参照型 | XLOPER * | 参照渡し |
たとえば "JJB" と書くと、戻り値が long int で、引数が long int と double のC関数を意味します。"BBB" なら倍精度の引数2つを取って倍精度を返す関数です。
64bit版のExcelではポインタ型(C/D/E/F/G/L/N/P/R)の扱いに違いがあります。そのため同じ型コードでも、32bit/64bitでDLLの再コンパイルや書き換えが必要になることがあります。
REGISTER.ID関数との関係(CALL関数の実用パターン)
CALL関数を実用する場面では、ほぼ必ずREGISTER関数(またはREGISTER.ID関数)とセットで使います。3つの関数の役割を整理します。
| 関数 | 役割 |
|---|---|
| REGISTER | DLL関数をExcelに登録し、ID(数値)を戻り値で返す |
| REGISTER.ID | 登録済み関数のIDを取得する(再登録なし) |
| CALL | 取得したIDと引数だけでDLL関数を実行する |
実用上のパターンはこうです。
A1: =REGISTER("MYLIB.DLL", "MyFunc", "BB")
→ 登録成功でID(例: 1)を返す
A2: =CALL(A1, 100)
→ MyFunc(100) を実行し、倍精度浮動小数点を返す
A3: =CALL(A1, 200)
→ 同じMyFunc(200) を実行
REGISTERでDLL関数を一度Excelに登録しておけば、以降はIDを使い回してCALLで何度でも呼び出せる仕組みです。module_text/procedure/type_text を毎回繰り返す必要がなく、数式が短く保守しやすくなります。
なおREGISTERとCALLは「マクロ関数(XLM 4.0マクロ言語)」のグループに属します。互換性のために残されている古いマクロ言語で、後述するセキュリティ警戒の対象でもあります。
CALL関数の代替手段(VBA・XLLアドイン・Office Scripts)
「DLLの関数を呼びたい」という目的だけなら、現代のExcelではCALL関数より優れた選択肢が複数あります。
VBAのDeclareステートメント
VBAコード内で Declare PtrSafe Function ... と書いてDLL関数を宣言する方法です。CALL関数と同じくDLLを呼べますが、エラー処理・型チェック・デバッグのしやすさが格段に上です。既存のDLLを呼ぶだけなら、まず候補に挙がります。
Declare PtrSafe Function MessageBoxA Lib "user32" _
(ByVal hWnd As LongPtr, ByVal lpText As String, _
ByVal lpCaption As String, ByVal uType As Long) As Long
XLLアドイン(C API / Excel-DNA)
DLLをExcelの「カスタム関数」として登録する方法です。XLLとして関数を提供すれば、利用者はCALL関数ではなく =MyFunc(100) のように通常の関数として呼び出せます。Excel-DNAというオープンソースフレームワークを使えば、C#でもXLLアドインを開発できます。
Office Scripts(クラウド/Excel for Web)
TypeScriptでExcelを自動化する仕組みで、Excel for WebやMicrosoft 365で利用できます。クロスプラットフォームで動き、クラウド連携にも強いのが特徴です。Windows専用DLLは呼べませんが、API連携やデータ処理ならこちらが現代的な選択肢になります。
Power Automate / Power Query
データ統合やAPIアクセスが目的なら、Power AutomateやPower Queryで対応できる範囲が広がっています。「CALLでなにかを呼びたい」という要件の多くは、これらのツールで代替可能です。
CALL関数を使うべきでない理由とセキュリティリスク
CALL関数を新規に書くことが推奨されない理由は、大きく3つあります。
理由1:セキュリティリスクが高い
CALL関数は任意のDLLの任意の関数を実行できます。これは便利な反面、過去にマクロウイルスや遠隔コード実行(RCE)の手段として悪用された歴史があります。
最近のExcelは、インターネット経由のファイルやメール添付ファイルでマクロやXLM 4.0関数を既定でブロックする仕様に変わりました。Microsoft Defender SmartScreenやマクロブロック機能が、不審なファイルでのCALL実行を防いでくれます。
裏を返すと、信頼できないファイルでCALL関数を見かけたら警戒すべきです。そのファイル自体がマクロウイルスの可能性も視野に入れるのが正しい態度になります。安易に「コンテンツの有効化」をクリックしないことを強くおすすめします。
理由2:保守性が低い
type_text の型コードを1文字でも間違えると、Excelごとクラッシュすることがあります。デバッガでステップ実行することもできず、原因切り分けが困難です。VBAのDeclareなら型不整合をある程度検出できますが、CALL関数にはそうした安全弁がありません。
理由3:ポータビリティが低い
32bit Excelと64bit Excelで、ポインタ型のサイズが異なります。同じ type_text の数式でも、32bit版では動いても64bit版で動かないケースが頻繁に起こります。VBAのDeclareでは PtrSafe キーワードで64bit対応を明示できますが、CALL関数には同等の仕組みがありません。
加えて、MicrosoftはXLM 4.0マクロを「将来的に廃止される可能性がある機能」と位置づけています。新規プロジェクトでの採用は推奨されていません。
まとめ:CALL関数は「読めるが書かない」関数
ExcelのCALL関数は、DLLやXLLの外部関数をワークシートから直接呼び出せる強力な特殊関数です。一方で、現代の業務利用ではセキュリティ・保守性・ポータビリティのいずれも代替手段の方が優れています。VBA Declare・XLLアドイン・Office Scriptsが充実した現在、新規に書くべき関数ではありません。
整理すると、押さえるべきポイントは以下の3点です。
- 構文:
=CALL(module_text, procedure, type_text, ...)で外部DLLの関数を呼べる - type_text:先頭1文字が戻り値、2文字目以降が引数の型(B=double, J=long, C=char* など)
- 現代Excelでは非推奨:セキュリティ・保守性・ポータビリティの観点でVBAやXLLが推奨される
不審なファイルでCALL関数を見かけた場合は、安易に有効化せず、ファイルの出所を確認してください。逆に既存資産の保守でCALL関数のメンテナンスが必要な場合は、可能な範囲でVBAのDeclareやXLLアドインへの移行を検討するのが安全です。
Excelの旧式・特殊関数つながりでは、互換性関数のVARP関数(母分散)、現代では新関数推奨のTTEST関数(t検定)、旧式のNORMSDIST関数(標準正規分布)もあわせて押さえておくと、Excelの「過去と現在」が立体的に見えてきます。CALL関数は読めるが書かない、これが正しい付き合い方です。
