XLL を作成する

適用対象: Excel 2013 | Office 2013 | Visual Studio

DLL が自己完結型であるか、他のライブラリのみに依存する場合、Microsoft Excel を有効にしてその関数とコマンドにアクセスする方法について把握しておく必要があります。 詳細については、「Excel で DLL にアクセスする」を参照してください。

ただし、DLL が Excel の機能にアクセスする必要がある場合 (たとえば、セルの内容を取得するときや、ワークシート関数を呼び出すとき、または Excel を照会してワークスペース情報を取得するときなど) は、コードから Excel へのコールバックが可能でなければなりません。

Excel C API には、DLL を Excel に呼び戻す機能がいくつか用意されています。 これらにアクセスするには、コンパイル時に DLL を Excel 32 ビット ライブラリ xlcall32.lib と静的にリンクする必要があります。 静的ライブラリは、このライブラリの 32 ビットバージョンと 64 ビット バージョンの両方を含む、Microsoft Excel 2013 XLL SDK の一部として Microsoft からダウンロードできます。

Dll から Excel へのコールバックを可能にする

DLL が Excel の機能にアクセスしてワークスペース情報を取得および設定できるようにするためには、まず Excel のコールバック関数 Excel4Excel4vExcel12、および Excel12v のアドレスを取得する必要があります。 最後の 2 つは Excel 2007 で導入され、以降のバージョンで使用できます。 これらのすべてにアクセスするには、DLL プロジェクトに Excel 2013 XLL SDK の次のファイルへの参照を含める必要があります。 (どのバージョンの Excel にも含まれる) 最初の 2 つのコールバックのみにアクセスする場合は、最初の 2 つのファイルのみをプロジェクトに含める必要があります。

Xlcall.h

Xlcall.h ファイルには、次の項目が含まれます。

  • すべてのコールバック関数の関数プロトタイプ。

  • DLL/XLL と ExcelDLL 間でのデータ交換にコールバックが使用するデータ構造の定義、データ型定数の定義。

  • ワークシート関数、マクロ シート関数、およびサポートされている Excel コマンドに相当する C API 関数とコマンドの定義。

  • コールバック関数の戻り値の定義。

このファイルでは、C API にアクセスするすべてのファイル、または C API が使用するデータ型を処理するすべてのファイルにおいて、このファイルの #include ディレクティブを (直接、あるいは別のヘッダー ファイルを介して間接的に) 使用する必要があります。

Xlcall32.lib

Xlcall32.lib ライブラリは、Excel4 と Excel4v の最初の 2 つのコールバックと XlCallVer 関数もエクスポートします。 プロジェクトでこのライブラリを参照しないと、コードでこれらのコールバックのいずれかを使用している場合、リンカーは XLL を作成できません。 (これらの関数のアドレスを取得するには、通常の Excel インストールの一部としてシステムにコピーされる同等の Xlcall32.dll に動的にリンクします)。

Xlcall.cpp

Excel コールバック Excel12Excel12v は Xlcall32.lib ではエクスポートされません。 これにより、Excel 2007 以降で作成した XLL プロジェクトは、以前のバージョンの Excel でも動作します。 Xlcall.cpp モジュールには、Excel 12 および Excel12v 関数のコードが含まれています。Excel 2007 以降の Excel エントリ ポイントを呼び出すか、以前のバージョンの Excel を実行している場合は安全なエラー値を返します。 Excel 2007 以降で実行され、より大きなグリッドと長い Unicode 文字列を処理する新しいデータ型を使用できる XLL を作成する場合は、このモジュールをプロジェクトに含める必要があります。

注:

Excel 2010 SDK 以降では、このファイルは 32 ビットと 64 ビットの両方の XLL にコンパイルできます。

DLL を XLL に変換する: アドイン マネージャー インターフェイス関数

An XLL is a DLL that exports several procedures that are called by Excel or the Excel Add-in Manager. These procedures are described briefly here and discussed in detail in Add-in Manager and XLL Interface Functions. All of these DLL callbacks start with the prefix xlAuto. Only one of these, the command xlAutoOpen, is required. It is called when the add-in is activated, and it is typically used to register XLL functions and commands with Excel and to do other initialization tasks. The function signatures and example implementations of all of the xlAuto functions are provided in later sections.

これらのコールバックの中で必須なのは xlAutoOpen だけですが、アドインの動作によっては、他のコマンドもエクスポートする必要がある可能性があります。

Excel 2007 では、より大きなグリッドに対応し、長い Unicode 文字列をサポートするために、 XLOPER12新しいデータ型が導入されました。 XLOPER12 については、このトピックの後半で説明します。 xlAuto 関数が古いデータ型 XLOPER を受け取るか返すのに対し、これらの関数の新しいバージョンは、XLOPER12データ型を使用する Excel 2007 で導入されました。 XLOPER12メモリ リークを回避するために実装する必要がある xlAutoFree12 を除き、バージョン 12 xlAuto 関数をすべて安全に省略できます。この場合、Excel 2007 以降では、Excel は XLOPER バージョンを呼び出します。

xlAutoOpen

Excel は、XLL がアクティブ化されるたびに xlAutoOpen 関数を呼び出します。 アドインは、正常に終了した最後の Excel セッションでアクティブであった場合、Excel セッションの開始時にアクティブになります。 アドインは、Excel セッション中に読み込まれた場合にアクティブ化されます。 アドインは Excel セッション中に非アクティブ化および再アクティブ化でき、再アクティブ化時に関数が呼び出されます。

XLL の関数とコマンドの登録、データ構造の初期化、ユーザー インターフェイスのカスタマイズなどを行うには、xlAutoOpen を使用する必要があります。

アドインが xlAutoRegister 関数や xlAutoRegister12 関数を実装およびエクスポートする場合、Excel が先に xlAutoOpen 関数を呼び出さずに関数やコマンドをアクティブにして登録しようとすることがあります。 この場合は、関数またはコマンドが正しく機能するように、アドインが十分に初期化されていることを確認する必要があります。 そうなっていない場合、関数やコマンドの登録や、必要な初期化の実行が失敗します。

xlAutoClose

XLL が非アクティブ化されると、Excel は xlAutoClose 関数を呼び出します。 Excel セッションが正常に終了すると、アドインは非アクティブ化されます。 Excel セッション中にユーザーがアドインを非アクティブ化すると、関数が呼び出されます。

関数とコマンドの登録解除、リソースの解放、カスタマイズの解除などを行うには、xlAutoClose を使用する必要があります。

注:

関数とコマンドの登録解除に関しては、既知の問題があります。 詳しくは、「Excel XLL 開発での既知の問題」をご覧ください。

xlAutoAdd

Excel calls the xlAutoAdd function whenever the user activates the XLL during an Excel session by using the Add-In Manager. This function is not called when Excel starts and loads a preinstalled add-in.

この関数を使用して、アドインがアクティブになっていることをユーザーに通知するカスタム ダイアログ ボックスの表示、レジストリに対する読み書き、またはライセンス情報の確認を行うことができます。

xlAutoRemove

Excel calls the xlAutoRemove function whenever the user deactivates the XLL during an Excel session by using the Add-In Manager. This function is not called when an Excel session closes, normally or abnormally, with the add-in installed.

この関数を使用して、アドインが非アクティブになっていることをユーザーに通知するカスタム ダイアログ ボックスを表示したり、レジストリへの読み書きを行うことができます。

xlAddInManagerInfo/xlAddInManagerInfo12

Excel では、Excel セッションでアドイン マネージャーが初めて呼び出されたときに xlAddInManagerInfo 関数が呼び出されます。 ��Ԃ��K�v������܂��B

Excel 2007 以降、Excel は xlAddInManagerInfo12 関数を xlAddInManagerInfo 関数が XLL によってエクスポートされた場合に優先して呼び出します。 バージョンによって XLL の動作に違いが生じることを避けるために、xlAddInManagerInfo12 関数と xlAddInManagerInfo 関数は同じ動作をする必要があります。 xlAddInManagerInfo12 関数は XLOPER12 データ型を返す必要があり、xlAddInManagerInfo 関数は XLOPER データ型を返す必要があります。

xlAutoRegister/xlAutoRegister12

XLM 関数 REGISTER またはそれと同等の C API 関数 xlfRegister が呼び出されたとき、登録対象の関数の戻り値と引数の型が指定されていないと、Excel は xlAutoRegister 関数を呼び出します。 xlAutoRegister 関数により、XLL はその内部にあるエクスポートされた関数とコマンドのリストを検索してその関数を引数とともに登録し、指定された型を返すことができます。

Excel 2007 以降では、xlAddInRegister12 関数が XLL によってエクスポートされている場合、Excel はこの関数を xlAddInRegister 関数よりも優先して呼び出します。

注:

引数と戻り値の型の指定がないままで xlAddInRegister/ xlAddInRegister12 が関数を登録しようとすれば、再帰的な呼び出しのループが発生し、最終的にはコール スタックがオーバーフローして Excel が終了するか、応答しなくなります。

xlAutoFree/xlAutoFree12

XLL が開放する必要があるメモリがまだあることを Excel に通知するフラグが設定された XLOPER/ XLOPER12 データ型が XLL ワークシート関数から返されると、Excel は xlAutoFree/xlAutoFree12 関数を呼び出します。 これにより、動的に割り当てられた配列、文字列および外部参照をメモリ リークなしに XLL でワークシートに返せるようになります。 XLOPER12 データ型は、Excel 2007 以降でサポートされています。 詳細については、「Excel でのメモリ管理」を参照してください。

注:

Excel 2007 以降では、Excel がマルチ スレッドのワークシートの再計算を使用するように構成されている場合、xlAutoFree/ xlAutoFree12 関数は、それを返した関数を呼び出すために使用されたスレッドと同じスレッドで呼び出されます。 xlAutoFree/ xlAutoFree12 の呼び出しは、常に、そのスレッドで後続のワークシートのセルが評価される前に行われます。 これにより、XLL でのスレッド セーフな設計が簡単になります。 詳細については、「Excel でのマルチ スレッドの再計算」をご参照ください。

64 ビット XLL の作成

Excel およびユーザー定義関数は、32 ビット オペレーティング システムよりも優れたパフォーマンスを期待できる 64 ビット オペレーティング システムで実行可能です。 Excel は、データの型に関する情報を含む XLOPER12 構造の値を渡します。 XLOPER12 構造とネイティブ型 (int またはより大きい型に値を保持するポインターなど) の間で値を変換する場合はご注意ください。

関連項目

関数ウィザードまたは [置換] ダイアログ ボックスから XLL 関数を呼び出す

アドイン マネージャーと XLL インターフェイス関数

Excel XLL の開発