次の方法で共有


Excel4、Excel12

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

Microsoft Excel ワークシートの内部関数、マクロ シート関数やコマンド、または XLL 専用の特殊関数やコマンドを DLL、XLL、またはコード リソース内部から呼び出します。

Excel のすべての最新バージョンは、Excel4 をサポートしています。 Excel 2007 以降では、Excel12 がサポートされています。

これらの関数は、Excel が DLL または XLL に制御を渡している場合にのみ、呼び出すことができます。 これらの関数は、Excel が Visual Basic for Applications (VBA) への呼び出しを介して間接的に制御を渡したときにも呼び出せます。 それ以外の時に、これらの関数を呼び出すことはできません。 たとえば、 DllMain 関数の呼び出し中、またはオペレーティング システムが DLL を呼び出した場合、または DLL によって作成されたスレッドから呼び出すことはできません。

Excel4v 関数と Excel12v 関数は引数を配列として受け入れますが、Excel4 関数と Excel12 関数は、スタック上の可変長リストとして引数を受け入れます。 その他のすべての点で、 Excel4Excel4v と同じように動作し、 Excel12Excel12v と同じように動作します。

int Excel4(int iFunction, LPXLOPER pxRes, int iCount, LPXLOPER argument1, ...);
int Excel12(int iFunction, LPXLOPER12 pxRes, int iCount, LPXLOPER12 argument1, ...);

パラメーター

iFunction (int)

呼び出すコマンド、関数、または特殊関数を示す数値。 iFunction の有効な値の一覧は、次の解説を参照してください。

pxRes (LPXLOPER または LPXLOPER12)

評価された関数の結果を保持する、XLOPER (Excel4 の場合) または XLOPER12 (Excel12 の場合) へのポインター。

iCount (int)

関数へ渡される後続の引数の数。 Excel 2003 までのバージョンでは、0 から 30 までの任意の数です。 Excel 2007 以降は、0 から 255 までの任意の数です。

argument1, ... (LPXLOPER または LPXLOPER12)

省略可能な、関数の引数。 すべての引数が XLOPER または XLOPER12 の値へのポインターである必要があります。

戻り値

次の整数値 (int) の 1 つを返します。

リターン コード 説明
0 xlretSuccess 関数は正常に呼び出されました。 これは、関数が Excel エラー値を返さなかったことを意味するものではありません。そのことを確認するには、結果として得られる pxRes パラメーターの型と値を確認する必要があります。
1 xlretAbort コマンドまたは関数が異常終了しました (内部アボート)。 これは、XLM マクロ シートが CLOSE を呼び出すことによってそれ自体を閉じた場合、またはExcel がメモリ不足になる場合に起こります。 Excel がこのエラーを返す場合、呼び出し元の関数は即座に終了する必要があります。 DLL が xlFree を呼び出すことが許可されるのは、終了前のみです。 C API に対するそれ以外のすべての呼び出しは許可されません。 ユーザーは、[ファイル] メニューの [保存] コマンドを使用して、対話形式で任意の作業を保存できます。
2 xlretInvXlfn 指定された関数の数が正しくありません。 Xlcall.h ヘッダー ファイルの定数を使用している場合、実行中の Excel のバージョンでサポートされていない何かを呼び出さない限り、これが起こることはありません。
4 xlretInvCount 入力された引数の数が正しくありません。 Excel 2003 までのバージョンでは、すべての関数の引数の最大数は 30 です。 Excel 2007 以降では、最大数は 255 です。 引数の数が固定されている場合もありますし、最小値が必要な場合もあります。
8 xlretInvXloper 関数に渡された XLOPER または XLOPER12 が正しくないか、使用された引数の種類が間違っています。
16 xlretStackOvfl スタック オーバーフローが発生しました。 xlStack を使用して、スタックに残っている部屋の量を監視します。 可能な限り、スタックに非常に大きなローカル (自動) 配列と構造体を割り当てないでください。静的にします。 (スタック オーバーフローが検出されずに発生する可能性があることに注意してください)。
32 xlretFailed コマンドと等価の関数が失敗しました。 これは、[マクロ エラーの警告] ダイアログボックスを表示するマクロ コマンドと等価です。
64 xlretUncalced 現在のセルの後に再計算するようスケジュールされているために、まだ計算されていないセルを逆参照しようとしました。 この場合、DLL は制御を即時に Excel に戻す必要があります。 DLL が xlFree を呼び出すのが許可されるのは、終了する前のみです。 C API に対するそれ以外のすべての呼び出しは許可されません。 再計算されていないセルの値にアクセスできる関数とできない関数についての詳細は、「Excel のコマンド、関数、および状態」を参照してください。
128 xlretNotThreadSafe ブックの再計算がマルチ スレッドで実行中に、スレッド セーフではない、あるいはスレッド セーフでない可能性がある関数を呼び出そうとしました。 Excel 2007 以降、この値が返されるようになり、XLL ワークシート関数内でのみ、スレッド セーフとして宣言されます。
256 xlRetInvAsynchronousContext 非同期関数のハンドルが無効です。 この値は、Excel 2010 でのみ使用されます。
512 xlRetNotClusterSafe クラスターでは、呼び出しはサポートされていません。 この値は、Excel 2010 でのみ使用されます。

備考

有効な iFunction の値

有効な iFunction の値は、Xlcall.h ヘッダー ファイルまたは次の特殊関数のいずれかで定義される、任意の xlf... または xlc... 定数です。

  • xlAbort
  • xlEnableXLMsgs
  • xlGetInst
  • xlSheetNm
  • xlCoerce
  • xlFree
  • xlGetName
  • xlStack
  • xlDefineBinaryName
  • xlGetBinaryName
  • xlSet
  • xlUDF
  • xlDisableXLMsgs
  • xlGetHwnd
  • xlSheetId

関数のさまざまな種類

Excel4Excel12 は、関数の 3 つのクラスを識別します。 関数は、Excel が DLL を呼び出す際の 3 種類の状態に基づいて分類されます。

  • クラス 1 は、DLL が再計算の結果としてワークシートから呼び出された場合に適用されます。
  • クラス 2 は、DLL が関数マクロ内部から呼び出された場合、またはタイプ テキストで番号記号 (#) を付けて登録されたワークシートから呼び出された場合に適用されます。
  • クラス 3 は、オブジェクト、マクロ、メニュー、ツール バー、ショートカット キー、 ExecuteExcel4Macro メソッド、または Tools/Macro/Run コマンドから DLL が呼び出されたときに適用されます。 詳細については、「 Excel コマンド、関数、および状態」を参照してください。

次の表は、各クラスでどの関数が有効かを示しています。

Class 1 Class 2 Class 3
任意のワークシート関数
xlSet を除く、任意の XLL 専用の xl... 関数。 xlfCaller
任意のワークシート関数
xlSet を除く、任意の xl... 関数。
ワークスペースまたは開いているどのブックにも影響する操作を実行せずに値を返す、マクロ シート関数 (xlfCaller を含む)。
任意の関数 (xlSet を含む) およびコマンド等価関数。

Command-Equivalent 関数のダイアログ ボックスを表示する

コマンドと等価の関数がダイアログ ボックスと関連付けられている場合、iFunctionxlPrompt ビットを設定できます。 これは、コマンドを実行する前に、Excel が適切なダイアログ ボックスを表示することを意味します。

国際 DLL の書き込み

iFunctionxlIntl ビットを設定する場合、その関数またはコマンドは、インターナショナル マクロ シートから呼び出されている場合と同様に実行されます。 これは、そのコマンドが国際バージョン (ローカライズされたバージョン) で実行されているとしても、Excel の米国バージョンと同様に動作するという意味です。

xlretUncalced または xlretAbort

戻り値の 1 つを受け取った後、DLL は直ちにクリーンアップを行い、制御を Excel に返す必要があります。 xlFree 以外では、戻り値の 1 つを受け取った後、C API 経由での Excel へのコールバックはできなくなります。

次の例は、呼び出し元のセルを選択するために、Excel12 関数を使用します。

このコード例は、Excel 2010 XLL SDK で提供されている、より大きな例の一部です。例は、SDK がインストールされている場所の次の位置にあります:

\Samples\Example\Example.c。

注:

この関数は、コマンド マクロ (xlcSelect) を呼び出し、それゆえに、それが XLM マクロ シートから呼び出された場合にのみ動作します。

short WINAPI Excel12Example(void)
{
    XLOPER12 xRes;
    Excel12(xlfCaller, &xRes, 0);
    Excel12(xlcSelect, 0, 1, (LPXLOPER12)&xRes);
    Excel12(xlFree, 0, 1, (LPXLOPER12)&xRes);
    return 1;
}

関連項目

Excel4v/Excel12v