<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CALL関数 &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/call%e9%96%a2%e6%95%b0/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Sat, 09 May 2026 10:27:31 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>CALL関数 &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ExcelのCALL関数の使い方｜DLL/XLLの関数呼び出し</title>
		<link>https://mashukabu.com/excel-call/</link>
					<comments>https://mashukabu.com/excel-call/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sat, 09 May 2026 10:27:31 +0000</pubDate>
				<category><![CDATA[Excel関数]]></category>
		<category><![CDATA[CALL関数]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[REGISTER関数]]></category>
		<category><![CDATA[XLL]]></category>
		<category><![CDATA[XLM]]></category>
		<category><![CDATA[アドイン]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=6696</guid>

					<description><![CDATA[ExcelのCALL関数はDLLやXLLの外部関数を呼び出す特殊関数です。構文・type_textの型コード一覧・REGISTER.IDとの連携・現代Excelで非推奨とされる理由とセキュリティリスクまで、上級者向けに誠実に解説します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ExcelのCALL関数は、DLLやXLLの中にある外部関数をワークシートから直接呼び出すための特殊関数です。DLLとはWindowsで共有して使えるコンパイル済みコード、XLLはそれをExcel専用に拡張したファイルを指します。</p>



<p class="wp-block-paragraph">正直に言うと、一般の業務でCALL関数を使う場面はほぼありません。アドイン開発者やレガシーExcelファイルの保守担当者など、限られた上級者向けの関数です。</p>



<p class="wp-block-paragraph">ただ、古いファイルを開いたら見慣れない <code>=CALL(...)</code> が出てきた、という方もいるはずです。この記事ではExcel CALL関数の構文・type_textの型コード・REGISTER.IDとの関係・現代では非推奨である理由までを誠実に解説します。読み終えるころには「読めるが書かない」関数として、CALL関数を正しく扱えるようになります。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ExcelのCALL関数とは？DLL/XLLの外部関数を呼び出す特殊関数</a></li><li><a href="#toc2" tabindex="0">ExcelのCALL関数の書き方（構文と引数）</a><ol><li><a href="#toc3" tabindex="0">形式1：DLLを直接指定する</a></li><li><a href="#toc4" tabindex="0">形式2：REGISTER関数で登録したIDから呼ぶ</a></li></ol></li><li><a href="#toc5" tabindex="0">type_textの型コード一覧（戻り値・引数の型を指定する記号）</a></li><li><a href="#toc6" tabindex="0">REGISTER.ID関数との関係（CALL関数の実用パターン）</a></li><li><a href="#toc7" tabindex="0">CALL関数の代替手段（VBA・XLLアドイン・Office Scripts）</a><ol><li><a href="#toc8" tabindex="0">VBAのDeclareステートメント</a></li><li><a href="#toc9" tabindex="0">XLLアドイン（C API / Excel-DNA）</a></li><li><a href="#toc10" tabindex="0">Office Scripts（クラウド/Excel for Web）</a></li><li><a href="#toc11" tabindex="0">Power Automate / Power Query</a></li></ol></li><li><a href="#toc12" tabindex="0">CALL関数を使うべきでない理由とセキュリティリスク</a><ol><li><a href="#toc13" tabindex="0">理由1：セキュリティリスクが高い</a></li><li><a href="#toc14" tabindex="0">理由2：保守性が低い</a></li><li><a href="#toc15" tabindex="0">理由3：ポータビリティが低い</a></li></ol></li><li><a href="#toc16" tabindex="0">まとめ：CALL関数は「読めるが書かない」関数</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ExcelのCALL関数とは？DLL/XLLの外部関数を呼び出す特殊関数</span></h2>



<p class="wp-block-paragraph">ExcelのCALL関数は、DLLやXLLというExcel外部のコンパイル済みライブラリに含まれる関数を呼び出すための特殊関数です。SUM関数やIF関数のようなExcel内蔵関数とは性質が違います。C/C++などで書かれた外部コードをワークシートから実行できる、いわば「橋渡し」の役割を担います。</p>



<p class="wp-block-paragraph">DLLとは、Windowsで複数のプログラムから共有して使えるようコンパイル済みコードをまとめたファイルのことです。<code>user32.dll</code> や <code>kernel32.dll</code> などWindows標準のものから、業務システム独自のものまで種類はさまざまです。XLLはこのDLLをExcel専用に拡張したもので、Excelに直接組み込んで関数として登録できます。</p>



<p class="wp-block-paragraph">CALL関数は古いExcel（Excel 4.0時代のXLM 4.0マクロ言語）から残る互換機能です。現在も互換性のために維持されていますが、<strong>現代の業務利用では原則使うべきでない関数</strong>である点を、最初にお伝えしておきます。理由は記事後半で詳しく解説します。</p>



<h2 class="wp-block-heading"><span id="toc2">ExcelのCALL関数の書き方（構文と引数）</span></h2>



<p class="wp-block-paragraph">CALL関数には2つの呼び出し形式があります。直接DLLを指定する形式と、REGISTER関数で登録済みのIDから呼ぶ形式です。</p>



<h3 class="wp-block-heading"><span id="toc3">形式1：DLLを直接指定する</span></h3>



<pre class="wp-block-code"><code>=CALL(module_text, procedure, type_text, argument1, argument2, ...)</code></pre>



<figure class="wp-block-table"><table><thead><tr><th>引数</th><th>説明</th></tr></thead><tbody><tr><td>module_text</td><td>DLL/XLLのファイル名またはフルパス（例: &#8220;user32&#8243;、&#8221;C:\MYLIB.DLL&#8221;）</td></tr><tr><td>procedure</td><td>呼び出す関数名（文字列）またはエクスポート序数</td></tr><tr><td>type_text</td><td>戻り値・引数の型を表すコード文字列（例: &#8220;JJB&#8221;）</td></tr><tr><td>argument1, &#8230;</td><td>DLL関数に渡す実引数</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><code>module_text</code> は拡張子 <code>.dll</code> を省略できます。Windows標準DLLなら <code>"user32"</code> のように関数名だけで指定可能です。</p>



<h3 class="wp-block-heading"><span id="toc4">形式2：REGISTER関数で登録したIDから呼ぶ</span></h3>



<pre class="wp-block-code"><code>=CALL(register_id, argument1, argument2, ...)</code></pre>



<p class="wp-block-paragraph">REGISTER関数（またはREGISTER.ID関数）でDLL関数を一度Excelに登録すると、戻り値としてID番号が返ります。次回以降は <code>module_text</code> や <code>procedure</code> を毎回書く必要がありません。IDと引数だけでCALLを実行できるため、実用上ほとんどのケースでこちらの形式が使われます。</p>



<h2 class="wp-block-heading"><span id="toc5">type_textの型コード一覧（戻り値・引数の型を指定する記号）</span></h2>



<p class="wp-block-paragraph">CALL関数で最も理解が難しいのが <code>type_text</code> の型コードです。1文字の記号でC言語の型を指定する独自ルールで、慣れないと暗号のように見えます。</p>



<p class="wp-block-paragraph">ルールはシンプルです。<strong>先頭1文字が戻り値の型、2文字目以降が引数の型を順番に並べる</strong>という決まりになっています。</p>



<p class="wp-block-paragraph">主要な型コードを以下の表にまとめます。</p>



<figure class="wp-block-table"><table><thead><tr><th>コード</th><th>型の意味</th><th>C言語型</th><th>備考</th></tr></thead><tbody><tr><td>A</td><td>論理値（FALSE=0, TRUE=1）</td><td>short int</td><td>&nbsp;</td></tr><tr><td>B</td><td>倍精度浮動小数点数</td><td>double</td><td>Excelの数値の標準型</td></tr><tr><td>C</td><td>NULL終端文字列（バイト列）</td><td>char *</td><td>最大255文字</td></tr><tr><td>D</td><td>バイトカウント文字列</td><td>unsigned char *</td><td>先頭1バイトに長さを格納</td></tr><tr><td>E</td><td>倍精度浮動小数点ポインタ</td><td>double *</td><td>&nbsp;</td></tr><tr><td>F</td><td>NULL終端文字列を返す（modify用）</td><td>char *</td><td>&nbsp;</td></tr><tr><td>G</td><td>バイトカウント文字列を返す（modify用）</td><td>unsigned char *</td><td>&nbsp;</td></tr><tr><td>H</td><td>符号なし2バイト整数</td><td>unsigned short int</td><td>&nbsp;</td></tr><tr><td>I</td><td>符号付き2バイト整数</td><td>short int</td><td>&nbsp;</td></tr><tr><td>J</td><td>符号付き4バイト整数</td><td>long int</td><td>&nbsp;</td></tr><tr><td>K</td><td>XLOPER配列</td><td>FP *</td><td>XLLで配列を扱う</td></tr><tr><td>L</td><td>論理値ポインタ</td><td>unsigned short int *</td><td>&nbsp;</td></tr><tr><td>N</td><td>符号付き4バイト整数ポインタ</td><td>long int *</td><td>&nbsp;</td></tr><tr><td>P</td><td>XLOPER（汎用Excelデータ型）</td><td>XLOPER *</td><td>XLLで使われる</td></tr><tr><td>R</td><td>XLOPER参照型</td><td>XLOPER *</td><td>参照渡し</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">たとえば <code>"JJB"</code> と書くと、戻り値が <code>long int</code> で、引数が <code>long int</code> と <code>double</code> のC関数を意味します。<code>"BBB"</code> なら倍精度の引数2つを取って倍精度を返す関数です。</p>



<p class="wp-block-paragraph">64bit版のExcelではポインタ型（C/D/E/F/G/L/N/P/R）の扱いに違いがあります。そのため同じ型コードでも、32bit/64bitでDLLの再コンパイルや書き換えが必要になることがあります。</p>



<h2 class="wp-block-heading"><span id="toc6">REGISTER.ID関数との関係（CALL関数の実用パターン）</span></h2>



<p class="wp-block-paragraph">CALL関数を実用する場面では、ほぼ必ずREGISTER関数（またはREGISTER.ID関数）とセットで使います。3つの関数の役割を整理します。</p>



<figure class="wp-block-table"><table><thead><tr><th>関数</th><th>役割</th></tr></thead><tbody><tr><td>REGISTER</td><td>DLL関数をExcelに登録し、ID（数値）を戻り値で返す</td></tr><tr><td>REGISTER.ID</td><td>登録済み関数のIDを取得する（再登録なし）</td></tr><tr><td>CALL</td><td>取得したIDと引数だけでDLL関数を実行する</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">実用上のパターンはこうです。</p>



<pre class="wp-block-code"><code>A1: =REGISTER(&quot;MYLIB.DLL&quot;, &quot;MyFunc&quot;, &quot;BB&quot;)
    → 登録成功でID（例: 1）を返す
A2: =CALL(A1, 100)
    → MyFunc(100) を実行し、倍精度浮動小数点を返す
A3: =CALL(A1, 200)
    → 同じMyFunc(200) を実行</code></pre>



<p class="wp-block-paragraph">REGISTERでDLL関数を一度Excelに登録しておけば、以降はIDを使い回してCALLで何度でも呼び出せる仕組みです。<code>module_text</code>/<code>procedure</code>/<code>type_text</code> を毎回繰り返す必要がなく、数式が短く保守しやすくなります。</p>



<p class="wp-block-paragraph">なおREGISTERとCALLは「マクロ関数（XLM 4.0マクロ言語）」のグループに属します。互換性のために残されている古いマクロ言語で、後述するセキュリティ警戒の対象でもあります。</p>



<h2 class="wp-block-heading"><span id="toc7">CALL関数の代替手段（VBA・XLLアドイン・Office Scripts）</span></h2>



<p class="wp-block-paragraph">「DLLの関数を呼びたい」という目的だけなら、現代のExcelではCALL関数より優れた選択肢が複数あります。</p>



<h3 class="wp-block-heading"><span id="toc8">VBAのDeclareステートメント</span></h3>



<p class="wp-block-paragraph">VBAコード内で <code>Declare PtrSafe Function ...</code> と書いてDLL関数を宣言する方法です。CALL関数と同じくDLLを呼べますが、エラー処理・型チェック・デバッグのしやすさが格段に上です。既存のDLLを呼ぶだけなら、まず候補に挙がります。</p>



<pre class="wp-block-code"><code>Declare PtrSafe Function MessageBoxA Lib &quot;user32&quot; _
    (ByVal hWnd As LongPtr, ByVal lpText As String, _
     ByVal lpCaption As String, ByVal uType As Long) As Long</code></pre>



<h3 class="wp-block-heading"><span id="toc9">XLLアドイン（C API / Excel-DNA）</span></h3>



<p class="wp-block-paragraph">DLLをExcelの「カスタム関数」として登録する方法です。XLLとして関数を提供すれば、利用者はCALL関数ではなく <code>=MyFunc(100)</code> のように通常の関数として呼び出せます。Excel-DNAというオープンソースフレームワークを使えば、C#でもXLLアドインを開発できます。</p>



<h3 class="wp-block-heading"><span id="toc10">Office Scripts（クラウド/Excel for Web）</span></h3>



<p class="wp-block-paragraph">TypeScriptでExcelを自動化する仕組みで、Excel for WebやMicrosoft 365で利用できます。クロスプラットフォームで動き、クラウド連携にも強いのが特徴です。Windows専用DLLは呼べませんが、API連携やデータ処理ならこちらが現代的な選択肢になります。</p>



<h3 class="wp-block-heading"><span id="toc11">Power Automate / Power Query</span></h3>



<p class="wp-block-paragraph">データ統合やAPIアクセスが目的なら、Power AutomateやPower Queryで対応できる範囲が広がっています。「CALLでなにかを呼びたい」という要件の多くは、これらのツールで代替可能です。</p>



<h2 class="wp-block-heading"><span id="toc12">CALL関数を使うべきでない理由とセキュリティリスク</span></h2>



<p class="wp-block-paragraph">CALL関数を新規に書くことが推奨されない理由は、大きく3つあります。</p>



<h3 class="wp-block-heading"><span id="toc13">理由1：セキュリティリスクが高い</span></h3>



<p class="wp-block-paragraph">CALL関数は任意のDLLの任意の関数を実行できます。これは便利な反面、過去にマクロウイルスや遠隔コード実行（RCE）の手段として悪用された歴史があります。</p>



<p class="wp-block-paragraph">最近のExcelは、インターネット経由のファイルやメール添付ファイルでマクロやXLM 4.0関数を<strong>既定でブロックする仕様</strong>に変わりました。Microsoft Defender SmartScreenやマクロブロック機能が、不審なファイルでのCALL実行を防いでくれます。</p>



<p class="wp-block-paragraph">裏を返すと、信頼できないファイルでCALL関数を見かけたら警戒すべきです。<strong>そのファイル自体がマクロウイルスの可能性も視野に入れる</strong>のが正しい態度になります。安易に「コンテンツの有効化」をクリックしないことを強くおすすめします。</p>



<h3 class="wp-block-heading"><span id="toc14">理由2：保守性が低い</span></h3>



<p class="wp-block-paragraph"><code>type_text</code> の型コードを1文字でも間違えると、Excelごとクラッシュすることがあります。デバッガでステップ実行することもできず、原因切り分けが困難です。VBAのDeclareなら型不整合をある程度検出できますが、CALL関数にはそうした安全弁がありません。</p>



<h3 class="wp-block-heading"><span id="toc15">理由3：ポータビリティが低い</span></h3>



<p class="wp-block-paragraph">32bit Excelと64bit Excelで、ポインタ型のサイズが異なります。同じ <code>type_text</code> の数式でも、32bit版では動いても64bit版で動かないケースが頻繁に起こります。VBAのDeclareでは <code>PtrSafe</code> キーワードで64bit対応を明示できますが、CALL関数には同等の仕組みがありません。</p>



<p class="wp-block-paragraph">加えて、MicrosoftはXLM 4.0マクロを「将来的に廃止される可能性がある機能」と位置づけています。新規プロジェクトでの採用は推奨されていません。</p>



<h2 class="wp-block-heading"><span id="toc16">まとめ：CALL関数は「読めるが書かない」関数</span></h2>



<p class="wp-block-paragraph">ExcelのCALL関数は、DLLやXLLの外部関数をワークシートから直接呼び出せる強力な特殊関数です。一方で、現代の業務利用ではセキュリティ・保守性・ポータビリティのいずれも代替手段の方が優れています。VBA Declare・XLLアドイン・Office Scriptsが充実した現在、新規に書くべき関数ではありません。</p>



<p class="wp-block-paragraph">整理すると、押さえるべきポイントは以下の3点です。</p>



<ul class="wp-block-list"><li><strong>構文</strong>：<code>=CALL(module_text, procedure, type_text, ...)</code> で外部DLLの関数を呼べる</li><li><strong>type_text</strong>：先頭1文字が戻り値、2文字目以降が引数の型（B=double, J=long, C=char* など）</li><li><strong>現代Excelでは非推奨</strong>：セキュリティ・保守性・ポータビリティの観点でVBAやXLLが推奨される</li></ul>



<p class="wp-block-paragraph">不審なファイルでCALL関数を見かけた場合は、安易に有効化せず、ファイルの出所を確認してください。逆に既存資産の保守でCALL関数のメンテナンスが必要な場合は、可能な範囲でVBAのDeclareやXLLアドインへの移行を検討するのが安全です。</p>



<p class="wp-block-paragraph">Excelの旧式・特殊関数つながりでは、互換性関数の<a href="https://mashukabu.com/excel-varp/">VARP関数（母分散）</a>、現代では新関数推奨の<a href="https://mashukabu.com/excel-ttest/">TTEST関数（t検定）</a>、旧式の<a href="https://mashukabu.com/excel-normsdist/">NORMSDIST関数（標準正規分布）</a>もあわせて押さえておくと、Excelの「過去と現在」が立体的に見えてきます。CALL関数は<strong>読めるが書かない</strong>、これが正しい付き合い方です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-call/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ExcelのREGISTER.ID関数の使い方｜DLL/XLLのIDを返す</title>
		<link>https://mashukabu.com/excel-registerid/</link>
					<comments>https://mashukabu.com/excel-registerid/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sat, 09 May 2026 10:20:45 +0000</pubDate>
				<category><![CDATA[Excel関数]]></category>
		<category><![CDATA[CALL関数]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[REGISTER.ID]]></category>
		<category><![CDATA[XLL]]></category>
		<category><![CDATA[アドイン]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=6697</guid>

					<description><![CDATA[ExcelのREGISTER.ID関数は、登録済みのDLL/XLLの関数IDを返す上級者向けの特殊関数です。CALL関数とのセットで使われる構文・引数・実例を解説し、現代のVBAやOffice Scriptsでの代替方法も紹介します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ExcelのREGISTER.ID関数は、すでに登録されているDLLやXLLの関数IDを返す、上級者向けの特殊な関数です。CALL関数とセットで使うことで、Excelの外側にあるC/C++製のライブラリの関数を、ワークシートから直接呼び出せるようになります。</p>



<p class="wp-block-paragraph">普段のExcel業務ではまず触ることがない関数ですが、古いマクロブックの保守や、レガシーなアドイン開発の現場では今も登場します。この記事では、構文と引数、CALL関数とのセットでの使い方、そして「現代のExcelでは何を使えばいいのか」までをまとめて解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ExcelのREGISTER.ID関数とは？</a></li><li><a href="#toc2" tabindex="0">REGISTER.ID関数の構文と引数</a><ol><li><a href="#toc3" tabindex="0">type_text の型コード</a></li></ol></li><li><a href="#toc4" tabindex="0">REGISTER.ID関数の使い方（CALL関数とのセット利用）</a><ol><li><a href="#toc5" tabindex="0">概念例：Windows APIの GetTickCount を呼び出す</a></li><li><a href="#toc6" tabindex="0">REGISTER関数・CALL関数との役割分担</a></li></ol></li><li><a href="#toc7" tabindex="0">REGISTER.ID関数を使う前に知っておきたい注意点</a><ol><li><a href="#toc8" tabindex="0">1. type_text を間違えるとExcelがクラッシュする</a></li><li><a href="#toc9" tabindex="0">2. 32bit/64bit の整合性</a></li><li><a href="#toc10" tabindex="0">3. セキュリティリスク</a></li><li><a href="#toc11" tabindex="0">4. マクロ有効ブック（.xlsm / .xlam）でのみ使える</a></li></ol></li><li><a href="#toc12" tabindex="0">REGISTER.ID関数の代替手段（現代Excelでの推奨）</a><ol><li><a href="#toc13" tabindex="0">代替1: VBAの Declare 文</a></li><li><a href="#toc14" tabindex="0">代替2: Office Scripts（Microsoft 365 / Excel for the Web）</a></li><li><a href="#toc15" tabindex="0">代替3: Office アドイン（JavaScript API）</a></li><li><a href="#toc16" tabindex="0">代替4: Power Query / Power Automate</a></li></ol></li><li><a href="#toc17" tabindex="0">CALL関数・EUROCONVERT関数との違い</a></li><li><a href="#toc18" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ExcelのREGISTER.ID関数とは？</span></h2>



<p class="wp-block-paragraph">REGISTER.ID関数（読み方：レジスター・アイディー）は、すでに登録されているDLL（ダイナミックリンクライブラリ）またはXLL（Excel拡張アドイン）の関数の、登録済みIDを返す関数です。関数名は「REGISTER（登録）+ ID（識別子）」に由来します。</p>



<p class="wp-block-paragraph">DLLやXLLには、Excelの外側で動作するC/C++製のプログラム部品が入っています。それをワークシート関数のように使うためには、まずExcelに「この関数を使います」と登録する手順が必要です。REGISTER.IDはこの登録済みのIDを取得する役割を担います。</p>



<p class="wp-block-paragraph">ポイントは、対象の関数がまだ未登録の場合は自動的に登録した上でIDを返してくれる点です。そのため、CALL関数と組み合わせれば「登録 → 実行」を1セットで行えます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong><br>REGISTER.IDは Excel 4.0 マクロ（XLM）時代に作られた古い関数です。現代のExcelには互換性のために残されていますが、新規利用は推奨されていません。後述する代替手段の利用を強くおすすめします。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc2">REGISTER.ID関数の構文と引数</span></h2>



<p class="wp-block-paragraph">REGISTER.ID関数の構文は次のとおりです。</p>



<pre class="wp-block-code"><code>=REGISTER.ID(module_text, procedure, [type_text])</code></pre>



<figure class="wp-block-table"><table><thead><tr><th>引数</th><th>必須</th><th>内容</th></tr></thead><tbody><tr><td>module_text</td><td>必須</td><td>DLLまたはXLLのファイル名（フルパスまたはファイル名）を文字列で指定します</td></tr><tr><td>procedure</td><td>必須</td><td>DLL/XLL内の関数名（C/C++のエクスポート名）または序数を文字列で指定します</td></tr><tr><td>type_text</td><td>省略可</td><td>戻り値と引数の型を表す型コード文字列を指定します（例: &#8220;JC&#8221;）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">戻り値は登録IDを表す整数値です。関数の登録に失敗した場合は <code>#VALUE!</code> エラーが返ります。</p>



<h3 class="wp-block-heading"><span id="toc3">type_text の型コード</span></h3>



<p class="wp-block-paragraph">type_text は、戻り値と各引数のデータ型をアルファベット1文字で並べた文字列です。最初の文字が戻り値の型、それ以降の文字が引数の型を順に表します。</p>



<figure class="wp-block-table"><table><thead><tr><th>コード</th><th>意味</th></tr></thead><tbody><tr><td>A</td><td>論理値（FALSE/TRUE）</td></tr><tr><td>B</td><td>IEEE 8バイト浮動小数点数</td></tr><tr><td>C</td><td>NULL終端文字列（C文字列）</td></tr><tr><td>H</td><td>符号なし2バイト整数</td></tr><tr><td>I</td><td>符号付き2バイト整数</td></tr><tr><td>J</td><td>符号付き4バイト整数</td></tr><tr><td>L</td><td>論理値の参照</td></tr><tr><td>O</td><td>配列</td></tr><tr><td>R</td><td>XLOPER データ構造体</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">たとえば、引数なしで4バイト整数を返す関数なら <code>"J"</code>、文字列を1つ受け取って4バイト整数を返す関数なら <code>"JC"</code> のように指定します。</p>



<h2 class="wp-block-heading"><span id="toc4">REGISTER.ID関数の使い方（CALL関数とのセット利用）</span></h2>



<p class="wp-block-paragraph">REGISTER.ID単体では何もできません。取得したIDをCALL関数に渡してはじめて、外部DLLの関数を実行できます。基本の流れは次のとおりです。</p>



<ol class="wp-block-list"><li>REGISTER.IDで対象DLL関数のIDを取得する</li><li>そのIDをCALL関数の第1引数に渡す</li><li>CALLが実際の関数を呼び出して結果を返す</li></ol>



<h3 class="wp-block-heading"><span id="toc5">概念例：Windows APIの GetTickCount を呼び出す</span></h3>



<p class="wp-block-paragraph">たとえば Windows の <code>kernel32.dll</code> に含まれる <code>GetTickCount</code>（システム起動からの経過ミリ秒を返す関数）を呼び出す場合は、次のようなイメージになります。</p>



<pre class="wp-block-code"><code>A1: =REGISTER.ID(&quot;KERNEL32.DLL&quot;, &quot;GetTickCount&quot;, &quot;J&quot;)
A2: =CALL(A1)</code></pre>



<p class="wp-block-paragraph">A1で <code>GetTickCount</code> の登録IDを取得し、A2でそのIDを使って関数を実行します。<code>"J"</code> は「引数なし、戻り値は4バイト整数」を意味します。</p>



<h3 class="wp-block-heading"><span id="toc6">REGISTER関数・CALL関数との役割分担</span></h3>



<p class="wp-block-paragraph">REGISTER.IDは似た名前の関数が複数あり、混乱しやすいので役割を整理しておきます。</p>



<figure class="wp-block-table"><table><thead><tr><th>関数</th><th>役割</th></tr></thead><tbody><tr><td>REGISTER</td><td>DLL関数を登録し、エイリアス（別名）を作成する</td></tr><tr><td>REGISTER.ID</td><td>登録済みの関数IDを返す（未登録なら自動登録）</td></tr><tr><td>CALL</td><td>IDまたは登録情報経由で外部関数を実行する</td></tr><tr><td>UNREGISTER</td><td>登録を解除する</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ざっくり言うと、REGISTERは「登録して名前をつける」、REGISTER.IDは「IDだけ返す」、CALLは「IDで実行する」と覚えておけば十分です。</p>



<h2 class="wp-block-heading"><span id="toc7">REGISTER.ID関数を使う前に知っておきたい注意点</span></h2>



<p class="wp-block-paragraph">REGISTER.ID関数は強力ですが、扱いを誤るとExcel自体が落ちる危険があります。利用前に必ず次の点を確認してください。</p>



<h3 class="wp-block-heading"><span id="toc8">1. type_text を間違えるとExcelがクラッシュする</span></h3>



<p class="wp-block-paragraph">型コードと実際のDLL関数のシグネチャ（引数・戻り値の型）が一致しないと、メモリ破壊が起きてExcelごと強制終了することがあります。保存していない作業内容も失われるため、検証は必ず別ブックで行ってください。</p>



<h3 class="wp-block-heading"><span id="toc9">2. 32bit/64bit の整合性</span></h3>



<p class="wp-block-paragraph">32bit版のExcelは32bit DLLを、64bit版のExcelは64bit DLLしか呼び出せません。同じファイル名のDLLでも、ビット数が合っていないと <code>#VALUE!</code> エラーやクラッシュの原因になります。</p>



<h3 class="wp-block-heading"><span id="toc10">3. セキュリティリスク</span></h3>



<p class="wp-block-paragraph">任意のDLLを読み込めるということは、悪意あるDLLを指定された場合に任意コードが実行されるリスクがあるということです。出所不明のブックでREGISTER.IDが使われている場合は、内容を必ず確認してから開きましょう。</p>



<h3 class="wp-block-heading"><span id="toc11">4. マクロ有効ブック（.xlsm / .xlam）でのみ使える</span></h3>



<p class="wp-block-paragraph">REGISTER.IDはマクロ機能の一部として扱われます。通常の <code>.xlsx</code> ファイルでは保存できません。<code>.xlsm</code> または <code>.xlam</code>、あるいは Excel 4.0 マクロシート（.xlm）から利用してください。</p>



<h2 class="wp-block-heading"><span id="toc12">REGISTER.ID関数の代替手段（現代Excelでの推奨）</span></h2>



<p class="wp-block-paragraph">ここまで読んでお気づきのとおり、REGISTER.IDはとてもクセが強い関数です。Excel 2016 以降では、ほとんどのケースで次のいずれかの代替手段を使うほうが安全で生産的です。</p>



<h3 class="wp-block-heading"><span id="toc13">代替1: VBAの Declare 文</span></h3>



<p class="wp-block-paragraph">VBA の Declare 文を使えば、DLL関数をモジュール内で宣言して使えます。型のチェックも比較的わかりやすく、現代的なエラー処理が組めます。</p>



<pre class="wp-block-code"><code>'--- Windows APIの GetTickCount を宣言 ---
Declare PtrSafe Function GetTickCount Lib &quot;kernel32&quot; () As Long

Sub ShowTick()
    Dim lngTick As Long  ' --- 経過ミリ秒を受け取る変数 ---
    lngTick = GetTickCount()
    MsgBox &quot;起動からの経過ミリ秒: &quot; &amp; lngTick
End Sub</code></pre>



<p class="wp-block-paragraph">64bit Excelでは <code>PtrSafe</code> キーワードが必須です。古いVBAコードを引き継ぐときも、まずDeclare文への置き換えを検討するのがおすすめです。</p>



<h3 class="wp-block-heading"><span id="toc14">代替2: Office Scripts（Microsoft 365 / Excel for the Web）</span></h3>



<p class="wp-block-paragraph">Office Scripts は Microsoft 365 環境で動く TypeScript ベースのスクリプト機能です。クラウド連携やチーム共有が前提のため、現代的な業務自動化には Office Scripts が適しています。</p>



<h3 class="wp-block-heading"><span id="toc15">代替3: Office アドイン（JavaScript API）</span></h3>



<p class="wp-block-paragraph">ブラウザでもデスクトップでも動くアドインを作りたい場合は、Office アドインの JavaScript API を使います。Web技術ベースなので保守人材も確保しやすい利点があります。</p>



<h3 class="wp-block-heading"><span id="toc16">代替4: Power Query / Power Automate</span></h3>



<p class="wp-block-paragraph">外部APIや外部データソースと連携したいだけであれば、Power Query や Power Automate のほうが適しています。GUIで構築でき、メンテナンスも容易です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong><br>「DLLを呼び出したい」という要件のうち、9割以上は上記4つのいずれかで解決できます。REGISTER.IDを新規導入する前に、まず代替手段を検討してください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc17">CALL関数・EUROCONVERT関数との違い</span></h2>



<p class="wp-block-paragraph">REGISTER.IDと混同しやすい特殊関数の違いを整理しておきます。</p>



<figure class="wp-block-table"><table><thead><tr><th>関数</th><th>主な役割</th><th>利用シーン</th></tr></thead><tbody><tr><td>REGISTER.ID</td><td>登録済みDLL/XLL関数のIDを返す</td><td>CALL関数とセットで利用</td></tr><tr><td>CALL</td><td>IDまたは登録情報を使って外部関数を実行する</td><td>DLL/XLL内の関数の実行</td></tr><tr><td>EUROCONVERT</td><td>旧EU加盟国通貨をユーロに換算する</td><td>為替・通貨変換（過去用途）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">CALL関数の使い方や互換性については <a href="https://mashukabu.com/excel-call/">ExcelのCALL関数の使い方</a> を、EUROCONVERT関数については <a href="https://mashukabu.com/excel-euroconvert/">ExcelのEUROCONVERT関数の使い方</a> を、それぞれ参照してください。同じく特殊な統計関数として <a href="https://mashukabu.com/excel-normsdist/">ExcelのNORMSDIST関数の使い方</a> も並べて読むと、互換性のために残されている関数群の全体像がつかみやすくなります。</p>



<h2 class="wp-block-heading"><span id="toc18">まとめ</span></h2>



<p class="wp-block-paragraph">ExcelのREGISTER.ID関数は、登録済みのDLL/XLLの関数IDを返す上級者向けの特殊関数です。CALL関数と組み合わせて外部ライブラリを呼び出すための中間ステップとして使われます。Excel 2016 以降では VBA の Declare 文・Office Scripts・Office アドイン・Power Query などの代替手段が用意されており、新規利用はほぼ推奨されません。</p>



<p class="wp-block-paragraph">この記事のポイントを振り返ります。</p>



<ul class="wp-block-list"><li>REGISTER.IDは登録済みのDLL/XLL関数のIDを返す関数で、CALL関数とセットで使う</li><li>構文は <code>=REGISTER.ID(module_text, procedure, [type_text])</code> の3引数</li><li>type_text を間違えるとExcelごとクラッシュするため検証は別ブックで行う</li><li>32bit/64bitの整合性とセキュリティリスクに注意する</li><li>現代のExcelでは VBA Declare 文や Office Scripts などの代替手段の利用を推奨</li></ul>



<p class="wp-block-paragraph">レガシー資産の保守で出会う機会はあっても、新規開発で選ぶ場面はまずありません。「こういう関数があった」と仕組みを理解しておけば、古いブックを開いたときに慌てずに済みます。代替手段への置き換えを進めて、保守しやすい環境を整えていきましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-registerid/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
