DLL または XLL から Excel に呼び出すCalling into Excel from the DLL or XLL

適用されますExcel 2013 |。Office 2013 |Visual StudioApplies to: Excel 2013 | Office 2013 | Visual Studio

Microsoft Excel を使用すると、DLL は組み込みの Excel コマンド、ワークシート関数、マクロ シート関数にアクセスできます。こうしたコマンドや関数は、Visual Basic for Applications (VBA) で呼び出される DLL コマンドと関数から、および Excel によって直接呼び出される登録済み XLL コマンドと関数から使用できます。Microsoft Excel enables your DLL to access built-in Excel commands, worksheet functions, and macro sheet functions. These are available both from DLL commands and functions called from Visual Basic for Applications (VBA), and from registered XLL commands and functions called directly by Excel.

Excel4、Excel4v、Excel12、Excel12v 関数Excel4, Excel4v, Excel12, and Excel12v Functions

Excel では、 Excel4Excel4vExcel12、およびExcel12vのコールバック関数を使用してコマンドや機能にアクセスするのには、DLL を使用できます。Excel enables your DLL to access the commands and functions through the callback functions Excel4, Excel4v, Excel12, and Excel12v.

Excel4Excel4v関数は、Excel バージョン 4 で導入されました。The Excel4 and Excel4v functions were introduced in Excel version 4. XLOPERデータ構造で動作します。They work with the XLOPER data structure. Excel 2007 には、2 つ新しいコールバック関数、 Excel12Excel12vXLOPER12のデータ構造体の使用が導入されています。Excel 2007 introduced two new callback functions, Excel12 and Excel12v, which work with the XLOPER12 data structure. Excel4Excel4v関数は、ライブラリ、DLL や XLL プロジェクトに含める必要があります Xlcall32.lib でエクスポートされます。The Excel4 and Excel4v functions are exported by the library Xlcall32.lib, which must be included in your DLL or XLL project. XLOPER12構造体を使用して、Excel の機能にアクセスする場合に、プロジェクトに含める必要があります Xlcall.cpp SDK の C++ ソース ファイルには、 Excel12Excel12vが含まれます。Excel12 and Excel12v are included in the SDK C++ source file Xlcall.cpp, which must be included in your project if you want to access Excel functionality by using XLOPER12 structures.

次のコードは、これら 4 つの関数の関数プロトタイプを示します。The following code shows the function prototypes for these four functions. 最初の 3 つの引数は、2 番目の引数は、最初のペアでは、 XLOPERへのポインターと 2 番目のペアで、 XLOPER12へのポインターが同じです。The first three arguments are the same except that the second argument is a pointer to an XLOPER in the first pair and a pointer to an XLOPER12 in the second pair. 呼び出し規約は、可変個引数リストを許可するには、 Excel4Excel12 に従って _cdeclです。The calling convention is _cdecl in Excel4 and Excel12 to permit the variable argument lists. 省略記号は、 Excel4XLOPERの値とExcel12XLOPER12の値へのポインターを表します。The ellipsis represents pointers to XLOPER values for Excel4 and XLOPER12 values for Excel12. _Count_パラメーターの値をポインターの数に等しくなります。The number of pointers equals the value of the count parameter.

Excel のすべてのバージョンAll versions of Excel

int _cdecl Excel4(int xlfn, LPXLOPER operRes, int count,... );

int pascal Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER opers[]);

Excel 2007 の起動Starting in Excel 2007

int _cdecl Excel12(int xlfn, LPXLOPER12 operRes, int count,... );

int pascal Excel12v(int xlfn, LPXLOPER12 operRes, int count, LPXLOPER12 opers[]);

Excel4Excel4vExcel12、またはExcel12vを呼び出すことができる DLL、Excel は、DLL に制御を渡す必要があります。For the DLL to be able to call Excel4, Excel4v, Excel12, or Excel12v, Excel must pass control to the DLL. これは、次のシナリオでのみこれらの API のコールバックを呼び出すことができることを意味します。This means that these C API callbacks can be called only in the following scenarios:

  • Excel が直接または VBA を介して呼び出した XLL コマンドから。From within an XLL command that Excel has called directly or via VBA.

  • Excel が直接または VBA を介して呼び出した XLL ワークシート関数またはマクロ シート関数から。From within an XLL worksheet or macro sheet function that Excel has called directly or via VBA.

次のシナリオでは、Excel C API を呼び出すことはできません。You cannot call the Excel C API in the following scenarios:

  • ( DllMain関数) からでは、オペレーティング システム イベント。From an operating system event (for example, from the DllMain function).

  • DLL が作成したバックグラウンド スレッドから。From a background thread that your DLL created.

戻り値Return values

これら 4 つの関数はいずれも整数値を返します。この値によって、呼び出し元に対して、関数またはコマンドが正常に呼び出されたかどうかが知らされます。次のいずれかの値が返されます。All four of these functions return an integer value that informs the caller whether the function or command was called successfully. The values returned can be any of the following:

戻り値Return value として Xlcall.h で定義されています。Defined in Xlcall.h as 説明Description
00
xlretSuccessxlretSuccess
関数やコマンドが正常に実行します。The function or command executed successfully. 実行が正常にエラーがないことはありません。This does not mean that the execution was error free. たとえば、 Excel4を返すxlretSuccess 検索をには、関数を呼び出すときに評価されることも #VALUE!For example, Excel4 could return xlretSuccess when calling the function FIND, even though it evaluated to #VALUE! 検索文字列が見つかりませんでした。because the search text could not be found. 種類と返されるXLOPER/XLOPER12の値を検査する必要がありますこの可能性については。You should inspect the type and value of the returned XLOPER/XLOPER12 where this is a possibility.
11
xlretAbortxlretAbort
コマンド マクロは、 [キャンセル] ボタンをクリックするか、ESC キーを押すと、ユーザーによって停止されました。A command macro was stopped by the user clicking the CANCEL button or pressing the ESC key.
22
xlretInvXlfnxlretInvXlfn
指定された関数コードまたはコマンド コードが無効です。このエラーは、呼び出し元の関数に関数またはコマンドを呼び出すアクセス許可がない場合に生じます。たとえば、ワークシート関数は、マクロ シート情報関数またはコマンド関数を呼び出すことはできません。The supplied function or command code is not valid. This error can occur when the calling function does not have permission to call the function or command. For example, a worksheet function cannot call a macro sheet information function or a command function.
44
xlretInvCountxlretInvCount
呼び出しで指定した引数の数が正しくありません。The number of arguments supplied in the call is not correct.
88
xlretInvXloperxlretInvXloper
XLOPERまたはXLOPER12の引数の値の 1 つ以上が正しく形成、または設定します。One or more of the argument XLOPER or XLOPER12 values are not properly formed or populated.
1616
xlretStackOvflxlretStackOvfl
Excel によって、操作でスタックがオーバーフローする危険が検出され、関数が呼び出されませんでした。Excel detected a risk that the operation might overflow its stack and, therefore, did not call the function.
3232
xlretFailedxlretFailed
コマンドまたは関数は、他の戻り値のいずれかで記述されていないため失敗しました。The command or function failed for a reason not described by one of the other return values. たとえば、大量のメモリを必要とする操作はこのエラーで失敗します。An operation that would require too much memory, for example, would fail with this error. XlCoerce関数を使用して、非常に大きな配列への参照をxltypeMultiに変換しようとしたらこれでした。This could happen during an attempt to convert a very large reference to an xltypeMulti array by using the xlCoerce function.
6464
xlretUncalcedxlretUncalced
計算されていないセルの値を取得しようとする操作が行われました。Excel で再計算整合性を保持するため、ワークシート関数ではこれを行うことができません。ただし、マクロ シート関数として登録された XLL コマンドおよび関数は、計算されていないセル値にアクセスできます。The operation attempted to retrieve the value of an uncalculated cell. To preserve recalculation integrity in Excel, worksheet functions are not permitted to do this. However, XLL commands and functions registered as macro sheet functions are permitted to access uncalculated cell values.
128128
xlretNotThreadSafexlretNotThreadSafe
(Excel 2007 で開始)スレッド セーフとして登録されている XLL ワークシート関数は、スレッド セーフではない C API 関数を呼び出すしようとしました。(Starting in Excel 2007) An XLL worksheet function registered as thread safe attempted to call a C API function that is not thread safe. たとえば、スレッド セーフでない関数では、XLM 関数xlfGetCellを呼び出すことはできません。For example, a thread-safe function cannot call the XLM function xlfGetCell.
256256
xlRetInvAsynchronousContextxlRetInvAsynchronousContext
(Excel 2010 年に開始)非同期関数のハンドルが有効ではありません。(Starting in Excel 2010) The asynchronous function handle is invalid.
512512
xlretNotClusterSafexlretNotClusterSafe
(Excel 2010 年に開始)クラスターでは、呼び出しはサポートされていません。(Starting in Excel 2010) The call is not supported on clusters.

返しますエラー値のいずれかのテーブルで (つまり、それを返さないxlretSuccess)、 XLOPERまたはXLOPER12の戻り値も設定する #VALUE! です。If the function returns one of the failure values in the table (that is, it does not return xlretSuccess), the XLOPER or XLOPER12 return value will also be set to #VALUE!. チェックの成功のための十分なテストがありますが、呼び出しが両方のxlretSuccessを返すことに注意してください、特定の状況で、 #VALUE! です。In certain circumstances, checking for this might be a sufficient test of success, but you should note that a call can return both xlretSuccess and #VALUE!.

XlretUncalcedまたはxlretAbortのいずれかで、C API を呼び出し、DLL や XLL コードはコントロールに戻ります Excel (Excel で割り当てられたメモリを解放するxlfree関数の呼び出し以外の他の C API の呼び出しを行う前にリソースのXLOPERおよびXLOPER12の値)。If a call to the C API results in either xlretUncalced or xlretAbort, your DLL or XLL code should return control to Excel before making any other C API calls (other than calls to the xlfree function to release Excel-allocated memory resources in XLOPER and XLOPER12 values).

コマンドまたは関数の列挙型引数: xlfnCommand or Function Enumeration Argument: xlfn

_Xlfn_引数は、コールバックを最初の引数が機能し、32 ビット符号付き整数です。The xlfn argument is the first argument to the callback functions and is a 32-bit signed integer. 次の例のようには、その値は Xlcall.h、SDK のヘッダー ファイルで定義されている関数やコマンドの列挙値のいずれかでなければなりません。Its value should be one of the function or command enumerations defined in the SDK header file Xlcall.h, as shown in the following example.

// Excel function numbers. 
#define xlfCount 0
#define xlfIsna 2
#define xlfIserror 3
#define xlfSum 4
#define xlfAverage 5
#define xlfMin 6
#define xlfMax 7
#define xlfRow 8
#define xlfColumn 9
#define xlfNa 10
...
// Excel command numbers. 
#define xlcBeep (0 | xlCommand)
#define xlcOpen (1 | xlCommand)
#define xlcOpenLinks (2 | xlCommand)
#define xlcCloseAll (3 | xlCommand)
#define xlcSave (4 | xlCommand)
#define xlcSaveAs (5 | xlCommand)
#define xlcFileDelete (6 | xlCommand)
#define xlcPageSetup (7 | xlCommand)
#define xlcPrint (8 | xlCommand)
#define xlcPrinterSetup (9 | xlCommand)
...

関数は、0x0fff の 16 進数、0 (xlfCount) から最高 Excel 2013 での番号が割り当てられますが、すべてのワークシートとマクロ シートは、547 10 進数、0x0223 16 進数 (xlfFloor_precise) です。All worksheet and macro sheet functions are in the range from 0 (xlfCount) through 0x0fff hexadecimal, although the highest assigned number in Excel 2013 is 547 decimal, 0x0223 hexadecimal (xlfFloor_precise).

0x8000 16 進数 (xlcBeep) から 0x8fff の 16 進数、使用の範囲のコマンドのすべての機能は、Excel 2013 での最高の割り当てられた番号は、16 進数の 0x8328 (xlcHideallInkannots)。All command functions are in the range from 0x8000 hexadecimal (xlcBeep) through 0x8fff hexadecimal, although the highest assigned number in Excel 2013 is 0x8328 hexadecimal (xlcHideallInkannots). としてヘッダー ファイルでこれらの定義は、 (n | xlCommand)nの 10 進数は 0 以上、およびxlCommandが 0x8000 を 16 進数として定義されています。These are defined in the header file as (n | xlCommand) where n is a decimal number greater than or equal to 0 and xlCommand is defined as 0x8000 hexadecimal.

ダイアログ ボックスを使用した Excel コマンドの起動Invoking Excel Commands that Use Dialog Boxes

コマンド コードのいくつかは、ダイアログ ボックスを使用する Excel での操作に対応しています。Some of the command codes correspond to actions in Excel that use dialog boxes. たとえば、 xlcFileDeleteでは、1 つの引数: ファイル名またはマスク。For example, xlcFileDelete takes a single argument: a file name or mask. ユーザーがキャンセルまたは削除操作を変更する機会を持ってできるようにダイアログ ボックスを起動できます。This can be invoked with the dialog box so that the user has the opportunity to cancel or modify the delete operation. それもなしで呼び出される] ダイアログ ボックスでは、存在して、呼び出し元がアクセス許可を持つと仮定した場合、それ以上の介入なしのファイルまたはファイルを削除する場合。It can also be called without the dialog box, in which case the file or files are deleted without any further interaction, assuming they exist and the caller has permission. このようなコマンドを呼び出すと、ダイアログ ボックスの形式で、コマンドの列挙体を 0x1000 (xlPrompt) のビットごとの OR 演算を使用して組み合わせる必要があります。To call such commands in their dialog box form, the command enumeration must be combined by using the bitwise OR operation with 0x1000 (xlPrompt).

マスク my_data に一致する現在のディレクトリ内のファイルを削除するコード例を次に示します*.bak、引数が true の場合にのみ、ダイアログ ボックスを表示します。The following code example deletes files in the current directory matching the mask my_data*.bak, displaying a dialog box only if the argument is true.

bool delete_my_backup_files(bool show_dialog)
{
    XLOPER12 xResult, xFilter;
    xFilter.xltype = xltypeStr;
    xFilter.val.str = L"\014my_data*.bak"; // String length: 14 octal
    int cmd;
    if(show_dialog)
        cmd = xlcFileDelete | xlPrompt;
    else
        cmd = xlcFileDelete;
// xResult should be Boolean TRUE if successful, in which
// case return true; otherwise, false.
    return (Excel12(cmd, &xResult, 1, &xFilter) == xlretSuccess
        && xResult.xltype == xltypeBool
        && xResult.val.xbool == 1);
}

インターナショナル バージョンの関数およびコマンドの呼び出しCalling Functions and Commands in International Versions

関数およびコマンド名の XLM をさまざまな言語で表示するのには Excel を設定できます。You can configure Excel to display functions and XLM command names in a variety of languages. いくつかの C API コマンドおよび関数は、関数やコマンド名として解釈される文字列を操作します。Some C API commands and functions operate on strings that are interpreted as function or command names. たとえば、 xlcFormulaでは、指定したセルに配置することは意図されている文字列引数を受け取ります。For example, xlcFormula takes a string argument that is intended to be placed in a specified cell. アドインのすべての言語設定を使用するのには、英語の文字列名を指定し、関数やコマンドの列挙に含まれるビット 0x2000 (xlIntl) を設定できます。For your add-in to work with all language settings, you can supply the English string names and set the bit 0x2000 (xlIntl) in the function or command enumeration.

コード例を次の配置のと同じ=SUM(X1:X100)作業中のシートのセル A2 に。The following code example places the equivalent of =SUM(X1:X100) in cell A2 on the active sheet. Framework 関数、 TempActiveRefを使用してXLOPERの一時的な外部参照を作成することに注意してください。Note that it uses the Framework function, TempActiveRef, to create a temporary external reference XLOPER. 数式は A2 に含まれる適切なロケールが指定した言語で表示されます (たとえば、=SOMME(X1:X100)の言語がフランス語の場合)。The formula will appear in A2 in the correct locale-determined language (for example, =SOMME(X1:X100) if the language is French).

int WINAPI InternationlExample(void)
{
    XLOPER12 xSum, xResult;
    xSum.xltype = xltypeStr;
    xSum.val.str = L"\015=SUM(X1:X100)";
    Excel12(xlcFormula | xlIntl, &xResult, 2,
        &xSum, TempActiveRef(2,2,1,1));
    return 1;
}

注意

Excel12への呼び出しの結果が必要ないので、0 (NULL) はxResultのアドレスではなく 2 番目の引数として渡すことができます。Because the result of the call to Excel12 is not required, zero (NULL) could be passed as the second argument instead of the address of xResult. これについては次のセクションで詳細説明します。This is discussed more in the next section.

DLL 専用の関数とコマンドDLL-Only Functions and Commands

Excel には、DLL や xll ファイルからアクセスできる機能の数が少ないがサポートされています。Excel supports a small number of functions that are only accessible from a DLL or XLL. としてヘッダー ファイルで定義されているこれらは(n | xlSpecial)nよりも大きい値または 0 に等しい 10 進数では、 xlSpecial 0x4000 16 進数として定義されています。These are defined in the header file as (n | xlSpecial) where n is a decimal number greater than or equal to 0 and xlSpecial is defined as 0x4000 hexadecimal. これらの関数は次の表に記載されているし、 API 関数のリファレンスに記載されています。These functions are listed in the following table and documented in the API Function Reference.

xlFreexlFree
00 xlSpecialxlSpecial
Excel によって割り当てられたメモリ リソースを解放します。Frees Excel-allocated memory resources.
xlStackxlStack
11 xlSpecialxlSpecial
Excel スタック上の空き領域を返します。Returns the free space on the Excel stack.
xlCoercexlCoerce
22 xlSpecialxlSpecial
XLOPERおよびXLOPER12型間の変換します。Converts between XLOPER and XLOPER12 types
xlSetxlSet
33 xlSpecialxlSpecial
セル値の設定のための高速なメソッドを提供します。Provides a fast method of setting cell values.
xlSheetIdxlSheetId
44 xlSpecialxlSpecial
内部 ID からワークシート名を取得します。Obtains a worksheet name from its internal ID.
xlSheetNmxlSheetNm
55 xlSpecialxlSpecial
名前から、ワークシートの内部 ID を取得します。Obtains a worksheet internal ID from its name.
xlAbortxlAbort
66 xlSpecialxlSpecial
ユーザーが [キャンセル] ボタンがクリックされたか、ESC キーが押されたかどうかを確認します。Verifies whether the user clicked the CANCEL button or pressed the ESC key.
xlGetInstxlGetInst
77 xlSpecialxlSpecial
Excel インスタンス ハンドルを取得します。Gets the Excel instance handle.
xlGetHwndxlGetHwnd
88 xlSpecialxlSpecial
Excel のメイン ウィンドウ ハンドルを取得します。Gets the Excel main window handle.
xlGetNamexlGetName
99 xlSpecialxlSpecial
DLL のパスとファイル名を取得します。Gets the path and file name of the DLL.
xlEnableXLMsgsxlEnableXLMsgs
1010 xlSpecialxlSpecial
���̊֐��͎g�p����Ă��炸�A�Ăяo�����K�v��Ȃ��Ȃ�܂����BThis function is deprecated and no longer needs to be called.
xlDisableXLMsgsxlDisableXLMsgs
1111 xlSpecialxlSpecial
���̊֐��͎g�p����Ă��炸�A�Ăяo�����K�v��Ȃ��Ȃ�܂����BThis function is deprecated and no longer needs to be called.
xlDefineBinaryNamexlDefineBinaryName
1212 xlSpecialxlSpecial
永続バイナリ ストレージ名を定義します。Defines a persistent binary storage name.
xlGetBinaryNamexlGetBinaryName
1313 xlSpecialxlSpecial
バイナリ ストレージが永続的な名前のデータを取得します。Gets a persistent binary storage name's data.

XLOPER/XLOPER12 の値を返す: operResReturn value XLOPER/XLOPER12: operRes

_OperRes_引数では、コールバックには、2 番目の引数では、 XLOPER (Excel4およびExcel4v) またはXLOPER12 (Excel12およびExcel12v) へのポインターします。The operRes argument is the second argument to the callbacks and is a pointer to an XLOPER (Excel4 and Excel4v) or XLOPER12 (Excel12 and Excel12v). 呼び出しが成功すると、関数やコマンドの戻り値が含まれます。After a successful call, it contains the return value of the function or command. operResは、戻り値が必要ない場合、0 (NULL ポインター) に設定できます。operRes can be set to zero (NULL pointer) if no return value is required. 以前が指すメモリは、メモリ リークを回避するのには呼び出しをする前に解放する必要がありますように、 operResの以前の内容が上書きされます。The previous contents of operRes are overwritten so that any memory previously pointed to must be freed before to the call to avoid memory leaks.

OperResがエラーに設定されている場合は (たとえば、引数が適切ではありません) 場合は、関数やコマンドを呼び出すことができない、 #VALUE! です。If the function or command cannot be called (for example, if the arguments are incorrect), operRes is set to the error #VALUE!. コマンドは、成功すると、 FALSEに失敗した場合や、ユーザーのキャンセルにより、またはブール値****は TRUE常に返します。A command always returns Boolean TRUE if it is successful, or FALSE if it failed or the user canceled it.

2 回目以降の引数の数: countNumber of Subsequent Arguments: count

引数_count_はコールバックには、3 番目の引数では、32 ビット符号付き整数です。The count argument is the third argument to the callbacks and is a 32-bit signed integer. 1 から数えて、それ以降の引数の数を設定します。It should be set to the number of subsequent arguments, counting from 1. 関数やコマンドの引数をとらない場合は、0 に設定する必要があります。If a function or command takes no arguments, it should be set to zero. ほとんどを実行するよりも少ない、Microsoft Office Excel 2003 では、任意の関数が取ることができる引数の最大数、30、です。In Microsoft Office Excel 2003, the maximum number of arguments that any function can take is 30, although most take fewer than this. Excel 2007 以降では、任意の関数が取ることができる引数の最大数は 255 に増加させました。Starting in Excel 2007, the maximum number of arguments that any function can take was increased to 255.

Excel4Excel12、_カウント_は、渡されるXLOPERまたはXLOPER12の値へのポインターの数です。With Excel4 and Excel12, count is the number of pointers to XLOPER or XLOPER12 values that are being passed. その_数_の値より少ない引数を渡すには十分に注意する必要があります] に設定されています。You should be very careful not to pass fewer arguments than the value that count is set to. Excel スタックに先読みし、無効なXLOPERまたはXLOPER12の値、アプリケーション クラッシュが発生する可能性がありますを処理しようとしていますが発生します。This would result in Excel reading ahead into the stack and trying to process invalid XLOPER or XLOPER12 values, which could cause an application crash.

Excel4vExcel12vは、_カウント_は、次と最後の引数として渡されるXLOPERまたはXLOPER12の値へのポインターの配列のサイズです。With Excel4v and Excel12v, count is the size of the array of pointers to XLOPER or XLOPER12 values that is being passed as the next and final argument. もう一度、このオーバーランが発生している配列の境界になります、サイズ、_数_の要素よりも小さく、配列を渡すには十分に注意する必要があります。Again, you should be very careful not to pass a smaller array than count elements in size, as this will result in the bounds of the array being overrun.

C API 関数への引数の引き渡しPassing Arguments to C API Functions

両方Excel4およびExcel12を可変長引数リストでは、カウント、それぞれXLOPERおよびXLOPER12の値へのポインターとして解釈されます。Both Excel4 and Excel12 take variable length argument lists, after count, which are interpreted as pointers to XLOPER and XLOPER12 values, respectively. Excel4vExcel12v _カウント_ポインターの場合はExcel4vXLOPERの値、 Excel12vの場合XLOPER12の値の配列へのポインターである 1 つの引数がかかります。Excel4v and Excel12v take a single argument, after count, which is a pointer to an array of pointers to XLOPER values in the case of Excel4v, and to XLOPER12 values in the case of Excel12v.

配列フォーム、 Excel4v Excel12vでは、引数の数が変数の場合、C API への呼び出しを正常にコードを有効にします。The array forms, Excel4v and Excel12v, enable you to code a call to the C API cleanly when the number of arguments is variable. 次の例では、数値の可変サイズの配列を受け取るし、c 言語の API を使用して、Excel のワークシート関数を使用して、合計、平均、最小、および最大を計算する関数を示します。The following example shows a function that takes a variable-sized array of numbers and uses Excel worksheet functions, via the C API, to calculate the sum, average, minimum, and maximum.

void Excel12v_example(double *dbl_array, int size, double &sum, double &average, double &min, double &max)
{
// 30 is the limit in Excel 2003. 255 is the limit in Excel 2007.
// Use the lower limit to be safe, although it is better to make
// the function version-aware and use the correct limit.
    if(size < 1 || size > 30)
        return;
// Create an array of XLOPER12 values.
    XLOPER12 *xOpArray = (XLOPER12 *)malloc(size * sizeof(XLOPER12));
// Create an array of pointers to XLOPER12 values.
    LPXLOPER12 *xPtrArray =
        (LPXLOPER12 *)malloc(size * sizeof(LPXLOPER12));
// Initialize and populate the array of XLOPER12 values
// and set up the pointers in the pointer array.
    for(int i = 0; i < size; i++)
    {
        xOpArray[i].xltype = xltypeNum;
        xOpArray[i].val.num = dbl_array[i];
        xPtrArray[i] = xOpArray + i;
    }
    XLOPER12 xResult;
    int retval;
    int fn[4] = {xlfSum, xlfAverage, xlfMin, xlfMax};
    double *result_ptr[4] = {&sum, &average, &min, &max};
    for(i = 0; i < 4; i++)
    {
        retval = Excel12v(fn[i], &xResult, size, xPtrArray);
        if(retval == xlretSuccess && xResult.xltype == xltypeNum)
            *result_ptr[i] = xResult.val.num;
    }
    free(xPtrArray);
    free(xOpArray);
}

XLOPER12の値への参照をXLOPER、およびExcel4vExcel12vに置き換えて、上記のコードになりますすべてのバージョンの Excel で動作する関数。Replacing references to XLOPER12 values with XLOPER, and Excel12v with Excel4v, in the preceding code would result in a function that would work with all versions of Excel. 合計平均最小、および最大値は、Excel の関数には、この操作は、単純に C のコードし、引数を準備して、Excel への呼び出しのオーバーヘッドを回避する方が効率的となります。This operation of the Excel functions SUM, AVERAGE, MIN, and MAX is simple enough that it would be more efficient to code them in C and avoid the overhead of preparing the arguments and calling into Excel. ただし、Excel に含まれている関数の多くより複雑なためこの方法をいくつかの場合に便利です。However, many of the functions Excel contains are more complex, making this approach useful in some cases.

XlfRegisterトピックには、 Excel4vExcel12vの別の例が用意されています。The xlfRegister topic provides another example of working with Excel4v and Excel12v. XLL ワークシート関数を登録するときは、 [関数貼り付け] ダイアログ ボックスで使用されている各引数について説明する文字列を指定できます。When registering an XLL worksheet function, you can supply a descriptive string for each argument that is used in the Paste Function dialog box. したがって、 xlfRegisterを提供する合計の引数の数は、XLL 関数は、引数の数によって異なりますおり、次に 1 つの関数から異なります。Therefore, the number of total arguments being supplied to xlfRegister depends on the number of arguments your XLL function takes and will vary from one function to the next.

C API 関数またはコマンドの引数の数が同じで常に呼び出すと、どこに、これらの引数のポインターの配列を作成する余分な手順を避けるためにします。Where you always call a C API function or command with the same number of arguments, you want to avoid the extra step of creating an array of pointers for those arguments. ような場合は、簡単、 Excel4Excel12を使用するクリーナーがあります。In those cases, it is simpler and cleaner to use Excel4 and Excel12. たとえば、XLL 関数とコマンドを登録するときは、DLL または xll ファイルのフル パスとファイル名を指定する必要があります。For example, when registering XLL functions and commands, you need to supply the full path and file name of the DLL or XLL. XlfGetNameへの呼び出しでファイル名を取得し、元の呼び出しをxlFreeExcel4Excel12の両方の例を次に示すようにできます。You can obtain the file name in a call to xlfGetName and then release it with a call to xlFree, as shown in the following example for both Excel4 and Excel12.

XLOPER xDllName;
if(Excel4(xlfGetName, &xDllName, 0) == xlretSuccess)
{
    // Use the name, and 
    // then free the memory that Excel allocated for the string.
    Excel4(xlFree, 0, 1, &xDllName);
}
XLOPER12 xDllName;
if(Excel12(xlfGetName, &xDllName, 0) == xlretSuccess)
{
    // Use the name, and
    // then free the memory that Excel allocated for the string.
    Excel12(xlFree, 0, 1, &xDllName);
}

実際には、関数、 Excel12v_example、でしたをコーディングするより効率的に、1 つxltypeMulti XLOPER12の引数を作成し、次の例のように、 Excel12を使用して C API を呼び出します。In practice, the function, Excel12v_example, could be coded more efficiently by creating a single xltypeMulti XLOPER12 argument, and calling the C API by using Excel12, as shown in the following example.

void Excel12_example(double *dbl_array, int size, double &sum, double &average, double &min, double &max)
{
// In this implementation, the upper limit is the largest
// single column array (equals 2^20, or 1048576, rows in Excel 2007).
    if(size < 1 || size > 1048576)
        return;
// Create an array of XLOPER12 values.
    XLOPER12 *xOpArray = (XLOPER12 *)malloc(size * sizeof(XLOPER12));
// Create and initialize an xltypeMulti array
// that represents a one-column array.
    XLOPER12 xOpMulti;
    xOpMulti.xltype = xltypeMulti;
    xOpMulti.val.array.lparray = xOpArray;
    xOpMulti.val.array.columns = 1;
    xOpMulti.val.array.rows = size;
// Initialize and populate the array of XLOPER12 values.
    for(int i = 0; i < size; i++)
    {
        xOpArray[i].xltype = xltypeNum;
        xOpArray[i].val.num = dbl_array[i];
    }
    XLOPER12 xResult;
    int fn[4] = {xlfSum, xlfAverage, xlfMin, xlfMax};
    double *result_ptr[4] = {&sum, &average, &min, &max};
    for(i = 0; i < 4; i++)
    {
        Excel12(fn[i], &xResult, 1, &xOpMulti);
        if(xResult.xltype == xltypeNum)
            *result_ptr[i] = xResult.val.num;
    }
    free(xOpArray);
}

注意

この例では、 Excel12の戻り値は無視されます。In this case, the return value of Excel12 is ignored. コードは、返されるXLOPER12では、呼び出しが成功したかどうかを判断するのにはxltypeNumが、代わりにチェックします。The code instead checks that the returned XLOPER12 is xltypeNum to determine whether the call was successful.

XLCallVerXLCallVer

Excel4Excel4vExcel12、およびExcel12vのコールバックだけでなくXLCallVer、現在実行されている C API のバージョンを返す関数が Excel にエクスポートします。In addition to the callbacks Excel4, Excel4v, Excel12, and Excel12v, Excel exports a function XLCallVer, which returns the version of the C API currently running.

関数プロトタイプを次に示します。The function prototype is as follows:

int pascal XLCallVer(void);

スレッド セーフなこの関数は、あらゆる XLL コマンドまたは関数から呼び出せます。You can call this function, which is thread safe, from any XLL command or function.

Excel 2003、Excel 97 では、 XLCallVerは 1280 = 値を 0x0500 の 16 進数を返します。 = 5 x 256、Excel バージョン 5 を示します。In Excel 97 through Excel 2003, XLCallVer returns 1280 = 0x0500 hex = 5 x 256, which indicates Excel version 5. 3072 と = 場合は 0x0c00。 16 進数を返す Excel 2007 以降では、12 x 256、同様に 12 のバージョンを示します。Starting in Excel 2007, it returns 3072 = 0x0c00 hex = 12 x 256, which similarly indicates version 12.

新しい C API は、実行時に使用できるかどうかを判断するには、これを使用できますが、実行中のバージョンの Excel を使用して検出する方がExcel4(xlfGetWorkspace, &version, 1, &arg)argは、 XLOPERを 2 に設定する数値です。Although you can use this to determine whether the new C API is available at run time, you might prefer to detect the running version of Excel by using Excel4(xlfGetWorkspace, &version, 1, &arg), where arg is a numeric XLOPER set to 2. XLOPERバージョンは、整数値に強制的に変換する文字列を返します。The function returns a string XLOPER, version, which can then be coerced to an integer. C API のバージョンではなく、Excel のバージョンに依存することの理由は、Excel 2000、Excel 2002 および Excel 2003 を追加で必要な場合も検出される間の相違点があること。The reason for relying on the Excel version rather than the C API version is that there are differences between Excel 2000, Excel 2002, and Excel 2003 that your add-in may also need to detect. などが変更されたいくつかの統計関数の精度です。For example, changes were made to the accuracy of some of the statistics functions.

関連項目See also

XLL ��쐬����Creating XLLs

[Excel �� XLL �R��h�ɃA�N�Z�X����Accessing XLL Code in Excel

Excel XLL SDK API �֐����t�@�����XExcel XLL SDK API Function Reference

[C API �R����o�b�N�֐� Excel4�AExcel12C API Callback Functions Excel4, Excel12

Excel XLL �̊J��Developing Excel XLLs