ExcelのREGISTER.ID関数は、すでに登録されているDLLやXLLの関数IDを返す、上級者向けの特殊な関数です。CALL関数とセットで使うことで、Excelの外側にあるC/C++製のライブラリの関数を、ワークシートから直接呼び出せるようになります。
普段のExcel業務ではまず触ることがない関数ですが、古いマクロブックの保守や、レガシーなアドイン開発の現場では今も登場します。この記事では、構文と引数、CALL関数とのセットでの使い方、そして「現代のExcelでは何を使えばいいのか」までをまとめて解説します。
ExcelのREGISTER.ID関数とは?
REGISTER.ID関数(読み方:レジスター・アイディー)は、すでに登録されているDLL(ダイナミックリンクライブラリ)またはXLL(Excel拡張アドイン)の関数の、登録済みIDを返す関数です。関数名は「REGISTER(登録)+ ID(識別子)」に由来します。
DLLやXLLには、Excelの外側で動作するC/C++製のプログラム部品が入っています。それをワークシート関数のように使うためには、まずExcelに「この関数を使います」と登録する手順が必要です。REGISTER.IDはこの登録済みのIDを取得する役割を担います。
ポイントは、対象の関数がまだ未登録の場合は自動的に登録した上でIDを返してくれる点です。そのため、CALL関数と組み合わせれば「登録 → 実行」を1セットで行えます。
NOTE
REGISTER.IDは Excel 4.0 マクロ(XLM)時代に作られた古い関数です。現代のExcelには互換性のために残されていますが、新規利用は推奨されていません。後述する代替手段の利用を強くおすすめします。
REGISTER.ID関数の構文と引数
REGISTER.ID関数の構文は次のとおりです。
=REGISTER.ID(module_text, procedure, [type_text])
| 引数 | 必須 | 内容 |
|---|---|---|
| module_text | 必須 | DLLまたはXLLのファイル名(フルパスまたはファイル名)を文字列で指定します |
| procedure | 必須 | DLL/XLL内の関数名(C/C++のエクスポート名)または序数を文字列で指定します |
| type_text | 省略可 | 戻り値と引数の型を表す型コード文字列を指定します(例: “JC”) |
戻り値は登録IDを表す整数値です。関数の登録に失敗した場合は #VALUE! エラーが返ります。
type_text の型コード
type_text は、戻り値と各引数のデータ型をアルファベット1文字で並べた文字列です。最初の文字が戻り値の型、それ以降の文字が引数の型を順に表します。
| コード | 意味 |
|---|---|
| A | 論理値(FALSE/TRUE) |
| B | IEEE 8バイト浮動小数点数 |
| C | NULL終端文字列(C文字列) |
| H | 符号なし2バイト整数 |
| I | 符号付き2バイト整数 |
| J | 符号付き4バイト整数 |
| L | 論理値の参照 |
| O | 配列 |
| R | XLOPER データ構造体 |
たとえば、引数なしで4バイト整数を返す関数なら "J"、文字列を1つ受け取って4バイト整数を返す関数なら "JC" のように指定します。
REGISTER.ID関数の使い方(CALL関数とのセット利用)
REGISTER.ID単体では何もできません。取得したIDをCALL関数に渡してはじめて、外部DLLの関数を実行できます。基本の流れは次のとおりです。
- REGISTER.IDで対象DLL関数のIDを取得する
- そのIDをCALL関数の第1引数に渡す
- CALLが実際の関数を呼び出して結果を返す
概念例:Windows APIの GetTickCount を呼び出す
たとえば Windows の kernel32.dll に含まれる GetTickCount(システム起動からの経過ミリ秒を返す関数)を呼び出す場合は、次のようなイメージになります。
A1: =REGISTER.ID("KERNEL32.DLL", "GetTickCount", "J")
A2: =CALL(A1)
A1で GetTickCount の登録IDを取得し、A2でそのIDを使って関数を実行します。"J" は「引数なし、戻り値は4バイト整数」を意味します。
REGISTER関数・CALL関数との役割分担
REGISTER.IDは似た名前の関数が複数あり、混乱しやすいので役割を整理しておきます。
| 関数 | 役割 |
|---|---|
| REGISTER | DLL関数を登録し、エイリアス(別名)を作成する |
| REGISTER.ID | 登録済みの関数IDを返す(未登録なら自動登録) |
| CALL | IDまたは登録情報経由で外部関数を実行する |
| UNREGISTER | 登録を解除する |
ざっくり言うと、REGISTERは「登録して名前をつける」、REGISTER.IDは「IDだけ返す」、CALLは「IDで実行する」と覚えておけば十分です。
REGISTER.ID関数を使う前に知っておきたい注意点
REGISTER.ID関数は強力ですが、扱いを誤るとExcel自体が落ちる危険があります。利用前に必ず次の点を確認してください。
1. type_text を間違えるとExcelがクラッシュする
型コードと実際のDLL関数のシグネチャ(引数・戻り値の型)が一致しないと、メモリ破壊が起きてExcelごと強制終了することがあります。保存していない作業内容も失われるため、検証は必ず別ブックで行ってください。
2. 32bit/64bit の整合性
32bit版のExcelは32bit DLLを、64bit版のExcelは64bit DLLしか呼び出せません。同じファイル名のDLLでも、ビット数が合っていないと #VALUE! エラーやクラッシュの原因になります。
3. セキュリティリスク
任意のDLLを読み込めるということは、悪意あるDLLを指定された場合に任意コードが実行されるリスクがあるということです。出所不明のブックでREGISTER.IDが使われている場合は、内容を必ず確認してから開きましょう。
4. マクロ有効ブック(.xlsm / .xlam)でのみ使える
REGISTER.IDはマクロ機能の一部として扱われます。通常の .xlsx ファイルでは保存できません。.xlsm または .xlam、あるいは Excel 4.0 マクロシート(.xlm)から利用してください。
REGISTER.ID関数の代替手段(現代Excelでの推奨)
ここまで読んでお気づきのとおり、REGISTER.IDはとてもクセが強い関数です。Excel 2016 以降では、ほとんどのケースで次のいずれかの代替手段を使うほうが安全で生産的です。
代替1: VBAの Declare 文
VBA の Declare 文を使えば、DLL関数をモジュール内で宣言して使えます。型のチェックも比較的わかりやすく、現代的なエラー処理が組めます。
'--- Windows APIの GetTickCount を宣言 ---
Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
Sub ShowTick()
Dim lngTick As Long ' --- 経過ミリ秒を受け取る変数 ---
lngTick = GetTickCount()
MsgBox "起動からの経過ミリ秒: " & lngTick
End Sub
64bit Excelでは PtrSafe キーワードが必須です。古いVBAコードを引き継ぐときも、まずDeclare文への置き換えを検討するのがおすすめです。
代替2: Office Scripts(Microsoft 365 / Excel for the Web)
Office Scripts は Microsoft 365 環境で動く TypeScript ベースのスクリプト機能です。クラウド連携やチーム共有が前提のため、現代的な業務自動化には Office Scripts が適しています。
代替3: Office アドイン(JavaScript API)
ブラウザでもデスクトップでも動くアドインを作りたい場合は、Office アドインの JavaScript API を使います。Web技術ベースなので保守人材も確保しやすい利点があります。
代替4: Power Query / Power Automate
外部APIや外部データソースと連携したいだけであれば、Power Query や Power Automate のほうが適しています。GUIで構築でき、メンテナンスも容易です。
TIP
「DLLを呼び出したい」という要件のうち、9割以上は上記4つのいずれかで解決できます。REGISTER.IDを新規導入する前に、まず代替手段を検討してください。
CALL関数・EUROCONVERT関数との違い
REGISTER.IDと混同しやすい特殊関数の違いを整理しておきます。
| 関数 | 主な役割 | 利用シーン |
|---|---|---|
| REGISTER.ID | 登録済みDLL/XLL関数のIDを返す | CALL関数とセットで利用 |
| CALL | IDまたは登録情報を使って外部関数を実行する | DLL/XLL内の関数の実行 |
| EUROCONVERT | 旧EU加盟国通貨をユーロに換算する | 為替・通貨変換(過去用途) |
CALL関数の使い方や互換性については ExcelのCALL関数の使い方 を、EUROCONVERT関数については ExcelのEUROCONVERT関数の使い方 を、それぞれ参照してください。同じく特殊な統計関数として ExcelのNORMSDIST関数の使い方 も並べて読むと、互換性のために残されている関数群の全体像がつかみやすくなります。
まとめ
ExcelのREGISTER.ID関数は、登録済みのDLL/XLLの関数IDを返す上級者向けの特殊関数です。CALL関数と組み合わせて外部ライブラリを呼び出すための中間ステップとして使われます。Excel 2016 以降では VBA の Declare 文・Office Scripts・Office アドイン・Power Query などの代替手段が用意されており、新規利用はほぼ推奨されません。
この記事のポイントを振り返ります。
- REGISTER.IDは登録済みのDLL/XLL関数のIDを返す関数で、CALL関数とセットで使う
- 構文は
=REGISTER.ID(module_text, procedure, [type_text])の3引数 - type_text を間違えるとExcelごとクラッシュするため検証は別ブックで行う
- 32bit/64bitの整合性とセキュリティリスクに注意する
- 現代のExcelでは VBA Declare 文や Office Scripts などの代替手段の利用を推奨
レガシー資産の保守で出会う機会はあっても、新規開発で選ぶ場面はまずありません。「こういう関数があった」と仕組みを理解しておけば、古いブックを開いたときに慌てずに済みます。代替手段への置き換えを進めて、保守しやすい環境を整えていきましょう。
