ExcelのREGISTER.ID関数の使い方|DLL/XLLのIDを返す

スポンサーリンク

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)
BIEEE 8バイト浮動小数点数
CNULL終端文字列(C文字列)
H符号なし2バイト整数
I符号付き2バイト整数
J符号付き4バイト整数
L論理値の参照
O配列
RXLOPER データ構造体

たとえば、引数なしで4バイト整数を返す関数なら "J"、文字列を1つ受け取って4バイト整数を返す関数なら "JC" のように指定します。

REGISTER.ID関数の使い方(CALL関数とのセット利用)

REGISTER.ID単体では何もできません。取得したIDをCALL関数に渡してはじめて、外部DLLの関数を実行できます。基本の流れは次のとおりです。

  1. REGISTER.IDで対象DLL関数のIDを取得する
  2. そのIDをCALL関数の第1引数に渡す
  3. 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は似た名前の関数が複数あり、混乱しやすいので役割を整理しておきます。

関数役割
REGISTERDLL関数を登録し、エイリアス(別名)を作成する
REGISTER.ID登録済みの関数IDを返す(未登録なら自動登録)
CALLIDまたは登録情報経由で外部関数を実行する
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関数とセットで利用
CALLIDまたは登録情報を使って外部関数を実行する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 などの代替手段の利用を推奨

レガシー資産の保守で出会う機会はあっても、新規開発で選ぶ場面はまずありません。「こういう関数があった」と仕組みを理解しておけば、古いブックを開いたときに慌てずに済みます。代替手段への置き換えを進めて、保守しやすい環境を整えていきましょう。

タイトルとURLをコピーしました