名前と他のワークシートの数式を評価する
適用対象: Excel 2013 | Office 2013 | Visual Studio
Excel が、C API で公開する最も重要な機能の 1 つは、ワークシートに合法的に入力できる文字列式を単一の値や値の配列に変換する機能です。 これは、定義された名前のコンテンツを読み取る必要がある XLL 関数とコマンドなどにとって不可欠です。 この機能は、以下の例に示すように、xlfEvaluate 関数で公開されます。
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 関数を使って、定義されたどの名前の定義でも取得できます。
ワークシート名全体の指定は、次のような形式です。
='C:\example folder\[Book1.xls]Sheet1'!Name
Excel 2007 では、いくつかの新しいファイル拡張子が導入されていることに注意してください。 この Excel セッションで開いているブック間にあいまいな箇所がない場合は、パス、ブック名、シート名を省略することができます
次の例では、作業中のワークシートの数式 COUNT(A1:IV65536)
を評価し、結果を表示します。 範囲アドレスの前に '!' を付ける必要があることに注意してください。これは、XLM マクロ シートの範囲参照規則と一致します。 C API XLM は、次の規則に従います。
=A1
現在のマクロ シートのセル A1 への参照。 (XLL には定義されていません)。=!A1
作業中のシート (ワークシートまたはマクロ シートを指定できます) のセル A1 への参照。=Sheet1!A1
指定されたシート (この場合は Sheet1) のセル A1 への参照。=[Book1.xls]Sheet1!A1
指定されたブックの指定されたシートのセル A1 への参照。
XLL では、先頭に感嘆符 (!) がない参照を値に変換することはできません。 現在のマクロ シートがないため、意味がありません。 先頭に等号 (=) を付けることはオプションであるため、次の例では省略します。
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 を使うことができます。
注:
登録されている名前は、xlUDF 関数に直接渡すことができます。 つまり、名前を評価して ID を取得せずに、xlUDF を呼び出すことができるということです。 ただし、関数を何度も呼び出す場合、登録 ID を使って呼び出すほうが速くなります。