Auswerten von Namen und anderen Arbeitsblatt-Formelausdrücken
Gilt für: Excel 2013 | Office 2013 | Visual Studio
Eines der wichtigsten Features, die Excel über die C-API verfügbar macht, ist die Möglichkeit, jede beliebige Zeichenfolgenformel, die legal in ein Arbeitsblatt eingegeben werden kann, in einen Wert oder ein Array von Werten zu konvertieren. Dies ist wichtig für XLL-Funktionen und -Befehle, die z. B. den Inhalt definierter Namen lesen müssen. Diese Fähigkeit wird über die xlfEvaluate-Funktion verfügbar gemacht, wie in diesem Beispiel gezeigt.
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;
}
Beachten Sie, dass Sie beim Auswerten eines Arbeitsblattnamens , entweder allein oder in einer Formel, dem Namen mindestens "!" vorangestellt werden müssen. Andernfalls versucht Excel, den Namen in einem ausgeblendeten Namespace zu finden, der für DLLs reserviert ist. Sie können ausgeblendete DLL-Namen mithilfe der xlfSetName-Funktion erstellen und löschen. Sie können die Definition eines beliebigen definierten Namens abrufen, unabhängig davon, ob es sich um einen ausgeblendeten DLL-Namen oder einen Arbeitsblattnamen handelt, indem Sie die xlfGetDef-Funktion verwenden.
Die vollständige Spezifikation für einen Arbeitsblattnamen hat die folgende Form:
='C:\example folder\[Book1.xls]Sheet1'!Name
Beachten Sie, dass Excel 2007 eine Reihe neuer Dateierweiterungen eingeführt hat. Sie können den Pfad, den Arbeitsmappennamen und den Blattnamen weglassen, wenn es keine Mehrdeutigkeit zwischen den geöffneten Arbeitsmappen in dieser Excel-Sitzung gibt.
Im nächsten Beispiel wird die Formel COUNT(A1:IV65536)
für das aktive Arbeitsblatt ausgewertet und das Ergebnis angezeigt. Beachten Sie die Notwendigkeit, der Bereichsadresse das Präfix '!' voranzustellen, was mit der Bereichsverweiskonvention auf XLM-Makroblättern übereinstimmt. Die C-API XLM folgt dieser Konvention:
=A1
Ein Verweis auf Zelle A1 auf dem aktuellen Makroblatt. (Nicht für XLLs definiert).=!A1
Ein Verweis auf Zelle A1 auf dem aktiven Blatt (bei dem es sich um ein Arbeitsblatt oder ein Makroblatt handeln kann)=Sheet1!A1
Ein Verweis auf Zelle A1 auf dem angegebenen Blatt, in diesem Fall Sheet1.=[Book1.xls]Sheet1!A1
Ein Verweis auf Zelle A1 auf dem angegebenen Blatt in der angegebenen Arbeitsmappe.
In einer XLL kann ein Verweis ohne führendes Ausrufezeichen (!) nicht in einen Wert konvertiert werden. Es hat keine Bedeutung, da es kein aktuelles Makroblatt gibt. Beachten Sie, dass ein führendes Gleichheitszeichen (=) optional ist und im nächsten Beispiel ausgelassen wird.
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;
}
Sie können auch die xlfEvaluate-Funktion verwenden, um die Registrierungs-ID einer XLL-Funktion aus ihrem registrierten Namen abzurufen, der dann verwendet werden kann, um diese Funktion mithilfe der xlUDF-Funktion aufzurufen.
Hinweis
Der registrierte Name kann direkt an die xlUDF-Funktion übergeben werden. Dies bedeutet, dass Sie vermeiden können, den Namen auszuwerten, um die ID abzurufen, bevor Sie xlUDF aufrufen. Wenn die Funktion jedoch mehrmals aufgerufen werden soll, ist der Aufruf mithilfe der Registrierungs-ID schneller.