Excel アドイン (XLL) 開発における既知の問題
適用対象: Excel 2013 | Office 2013 | Visual Studio
このトピックでは、Microsoft Excel での XLL 開発で遭遇する可能性のある既知の問題について説明します。
XLL のコマンドおよび関数を登録解除する
XLL で関数やコマンドを登録すると、Excel 上で新しいリソース名が作成され、そのリソース名を持つ DLL 関数の参照と関連付けられます。 名前は、xlfRegister 関数の 4 番目の引数 pxFunctionText から取得されます。 また、このリソース名は、ワークシート名を管理する標準のダイアログ ボックスからは非表示になっています。 関数やコマンドを登録解除するには、xlfSetName 関数を使用してリソース名を削除する必要があります。この際、リソース名を渡しますが、定義は渡しません。 ただし、バグがあると、この関数ウィザードの一覧からリソース名を削除することができません。
関数ウィザードにおける引数の説明文字列の切り捨て
pxArgumentHelp1 パラメーターと xlfRegister 関数の後続のすべてのパラメーターは、XLL 関数の引数に対応する省略可能な文字列です。 引数作成ダイアログ ボックスにヘルプを表示するために、関数ウィザードにはこれらのパラメータが表示されます。 ダイアログ ボックスに表示する際、最後の引数に相当する文字列が Excel 上で 1 文字または 2 文字切り捨てられる場合があります。 これを回避するために、関数登録の最後の「引数ヘルプ」パラメーターとして付加的な「空の文字列」を追加できます。
バイナリ名のスコープ制限
バイナリ名とそのデータは、作成された時点でアクティブだったワークシートが再度アクティブになったときにのみ取得できます。 ワークシート関数では、ワークブック内のワークシートをアクティブにすることはできないため (コマンドでのみ可能)、バイナリ名の適用は非常に制限されています。 特定のワークシートからのみ呼び出されるコマンドがあれば、バイナリ名を使用してコマンドに関するデータを格納することもできます。
xlSet と配列数式を含むワークブック
Excel 2003 以前のバージョンにおいて、作業中ではないワークシートの範囲に値を割り当てようとすると、xlSet 関数 はエラーになり、作業中のシート上の同等範囲に配列数式が入ります。 この場合、Excel は "配列の一部を変更できません" というメッセージを表示します。これは Excel 2007 で修正されました。
データ テーブルで循環参照が可能
Excel では現在、データ テーブルのベースとなる計算において、同テーブル上の値を参照している場合でもエラーになりません。 このようなシナリオはまれなことですが、データ テーブルの値を計算する数式の作成や変更には注意が必要です。
整数 XLOPER12 を XLOPER に変換する
整数型 xltypeInt は、XLOPER12 データ型では 32 ビットの符号付き整数ですが、XLOPER データ型では 16 ビット符号付き整数であるため、整数 XLOPER12 の値の中には、整数 XLOPER に含められないものがあり得ます。 Excel 内部でこのデータ型を変換する場合は、データ型を浮動小数点 xltypeNumXLOPER に変換してこの問題を回避します。
Framework XLOper12ToXLOper 関数は、この動作を Excel と内部的に一致するようにミラー化します。 この関数を呼び出すときは、返された XLOPER が常に xltypeInt であるとは想定しないでください。my_xloper型が xltypeNum の場合、my_xloper.val.w を読み取ると false 値が返されます。
引数をインプレースで変更して XLOPER または XLOPER12 を返す
Excel では引数をインプレースで変更して、XLOPER または XLOPER12 を返すように関数を登録することができます。 ただし、 XLOPER/ XLOPER12 引数がメモリを指していて、ポインターが DLL 関数の戻り値によって上書きされた場合、Excel はメモリをリークする可能性があります。 Excel でエラーは表示されませんが、結果的にクラッシュする恐れがあります。 また、DLL で戻り値用のメモリが割り当てられている場合、Excel はそのメモリを解放しようとするため、すぐにアプリケーションがクラッシュする恐れがあります。 そのため、 XLOPER/ XLOPER12 引数を変更しないでください。 XLOPER 引数や XLOPER12 引数はすべて、必ず読み取り専用として扱ってください。
詳細については、「Excel のメモリ管理」を参照してください。
関連項目
XLOper12ToXLOperExcel XLLs の開発
Excel XLL SDK API 関数リファレンス
Excel のメモリ管理