名前と他のワークシートの数式を評価するEvaluating Names and Other Worksheet Formula Expressions

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

Excel が、C API で公開する最も重要な機能の 1 つは、ワークシートに合法的に入力できる文字列式を単一の値や値の配列に変換する機能です。これは、定義された名前のコンテンツを読み取る必要がある XLL 関数とコマンドなどにとって不可欠です。この機能は、以下の例に示すように、xlfEvaluate 関数で公開されます。One of the most important features that Excel exposes through the C API is the ability to convert any string formula that can legally be entered into a worksheet to a value, or array of values. This is essential for XLL functions and commands that must read the contents of defined names, for example. This ability is exposed through the xlfEvaluate function, as shown in this example.

int WINAPI evaluate_name_example(void)
{
  wchar_t *expression = L"\016!MyDefinedName";
  XLOPER12 xNameText, xNameValue;
  xNameText.xltype = xltypeStr;
  xNameText.val.str = expression;
// Try to evaluate the name. Will fail with a #NAME? error
// if MyDefinedName is not defined in the active workbook.
  Excel12(xlfEvaluate, &xNameValue, 1, &xNameText);
// Attempt to convert the value to a string and display it in
// an alert dialog. This fails if xNameValue is an error value.
  Excel12(xlcAlert, 0, 1, &xNameValue);
// Must free xNameValue in case MyDefinedName evaluated to a string
  Excel12(xlFree, 0, 1, &xNameValue);
  return 1;
}

ワークシート名を、それ自体か式で評価する場合、少なくとも、名前は ‘!’ というプレフィックスで始める必要があります。そうしないと、Excel は Dll 用に予約されている非表示の名前空間内でその名前を見つけようとします。xlfSetName 関数を使って、非表示の DLL 名の作成と削除ができます。非表示の DLL 名かワークシート名かに関係なく、xlfGetDef 関数を使って、定義されたどの名前の定義でも取得できます。Note that when you are evaluating a worksheet name, either on its own or in a formula, you must prefix the name with '!', at least. Otherwise, Excel tries to find the name in a hidden namespace reserved for DLLs. You can create and delete hidden DLL names using the xlfSetName function. You can get the definition of any defined name, whether it is a hidden DLL name or a worksheet name, using the xlfGetDef function.

ワークシート名全体の指定は、次のような形式です。The full specification for a worksheet name takes the following form:

='C:\example folder\[Book1.xls]Sheet1'!Name

Excel 2007 では、いくつかの新しいファイル拡張子が導入されました。この Excel セッションで開いているブック間にあいまいな箇所がない場合は、パス、ブック名、シート名を省略することができます。Note that Excel 2007 introduced a number of new file extensions. You can omit the path, the workbook name, and the sheet name where there is no ambiguity among the open workbooks in this Excel session.

次の例は、作業中のワークシートの式 COUNT(A1:IV65536) を評価して、結果を表示します。範囲アドレスは '!' というプレフィックスで始める必要があることに注意してください。これは、XLM マクロ シートの範囲参照の規則と一致しています。C API XLM は、この規則に従っています。The next example evaluates the formula COUNT(A1:IV65536) for the active worksheet and displays the result. Note the need to prefix the range address with '!', which is consistent with the range reference convention on XLM macro sheets. The C API XLM follows this convention:

  • =A1 現在のマクロ シートのセル A1 への参照 (XLL に対しては定義されていません)。=A1 A reference to cell A1 on the current macro sheet. (Not defined for XLLs).

  • =!A1 作業中のシート (ワークシートまたはマクロ シートを指定できます) のセル A1 への参照。=!A1 A reference to cell A1 on the active sheet (which could be a worksheet or macro sheet)

  • =Sheet1!A1 指定されたシート (この場合は Sheet1) のセル A1 への参照。=Sheet1!A1 A reference to cell A1 on the specified sheet, Sheet1 in this case.

  • =[Book1.xls]Sheet1!A1 指定されたブックの指定されたシートのセル A1 への参照。=[Book1.xls]Sheet1!A1 A reference to cell A1 on the specified sheet in the specified workbook.

XLL では、先頭に感嘆符 (!) がない参照を値に変換することはできません。In an XLL, a reference without a leading exclamation point (!) cannot be converted to a value. 現在のマクロ シートがないため、意味がありません。It has no meaning because there is no current macro sheet. 先頭に等号 (=) を付けることはオプションであるため、次の例では省略します。Note that a leading equals sign (=) is optional and is omitted in the next example.

int WINAPI evaluate_expression_example(void)
{
    wchar_t *expression = L"\022COUNT(!A1:IV65536)";
    XLOPER12 xExprText, xExprValue;
    xExprText.xltype = xltypeStr;
    xExprText.val.str = expression;
// Try to evaluate the formula.
    Excel12(xlfEvaluate, &xExprValue, 1, &xExprText);
// Attempt to convert the value to a string and display it in
// an alert dialog. Will fail if xExprValue is an error.
    Excel12(xlcAlert, 0, 1, &xExprValue);
// Not strictly necessary, as COUNT never returns a string
// but does no harm.
    Excel12(xlFree, 0, 1, &xExprValue);
    return 1;
}

また、xlfEvaluate 関数を使って、XLL 関数の登録 ID を登録されている名前から取得します。その後、xlUDF 関数を使ってその関数を呼び出すために、取得した XLL 関数の登録 ID を使うことができます。You can also use the xlfEvaluate function to retrieve the registration ID of an XLL function from its registered name, which can then be used to call that function using the xlUDF function.

注意

登録されている名前は、xlUDF 関数に直接渡すことができます。つまり、名前を評価して ID を取得せずに、xlUDF を呼び出すことができるということです。ただし、関数を何度も呼び出す場合、登録 ID を使って呼び出すほうが速くなります。The registered name can be passed directly to the xlUDF function. This means that you can avoid having to evaluate the name to get the ID before calling xlUDF. However, if the function is to be called many times, calling it by using the registration ID is faster.

関連項目See also