Aufrufen von Excel von der DLL oder XLL aus
Gilt für: Excel 2013 | Office 2013 | Visual Studio
Microsoft Excel ermöglicht Ihrer DLL, auf integrierte Excel-Befehle, Tabellenfunktionen und Makrovorlagenfunktionen zuzugreifen. Diese sind sowohl von DLL-Befehlen und Funktionen verfügbar, die von Visual Basic für Applikationen (VBA) aufgerufen werden, als auch von registrierten XLL-Befehlen und Funktionen, die direkt von Excel aufgerufen werden.
Excel4-, Excel4v-, Excel12- und Excel12v-Funktionen
Mit Excel können DLL_Dateien �ber die Excel4-, Excel4v-, Excel12- und Excel12v-R�ckruffunktionen auf Befehle und Funktionen zugreifen.
Die Excel4- und Excel4v-Funktionen wurden in Excel, Version 4 eingef�hrt. Sie arbeiten mit der XLOPER-Datenstruktur. In Excel 2007 wurden zwei neue R�ckruffunktionen eingef�hrt, Excel12 und Excel12v, die mit der XLOPER12-Datenstruktur arbeiten. Die Excel4- und Excel4v-Funktionen werden von der Bibliothek �Xlcall32.lib" in Ihrem DLL- oder XLL-Projekt exportiert. Excel12 und Excel12v sind in der SDK C++-Quelldatei �Xlcall.cpp" enthalten, die in Ihrem Projekt enthalten sein muss, wenn Sie mit XLOPER12-Strukturen auf Excel-Funktionen zugreifen m�chten .
Der folgende Code zeigt die Funktionsprototypen f�r diese vier Funktionen. Die ersten drei Argumente sind bis auf die Ausnahme,dass das zweite Argument auf ein XLOPER-Objekt im ersten Paar und auf ein XLOPER12-Objekt im zweiten Paar zeigt, identisch. Die Aufrufkonvention ist _cdecl in Excel4 und Excel12, um Variablenargumentlisten zuzulassen. Die drei Punkte geben die Zeiger auf XLOPER-Werte f�r Excel4 und XLOPER12-Werte f�r Excel12 an. Die Anzahl der Zeiger entspricht dem Wert des Parameters count.
Alle Excel-Versionen
int _cdecl Excel4(int xlfn, LPXLOPER operRes, int count,... );
int pascal Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER opers[]);
Ab Excel 2007
int _cdecl Excel12(int xlfn, LPXLOPER12 operRes, int count,... );
int pascal Excel12v(int xlfn, LPXLOPER12 operRes, int count, LPXLOPER12 opers[]);
Damit die DLL Excel4, Excel4v, Excel12 oder Excel12v aufrufen kann, muss Excel das Steuerelement an die DLL �bergeben. Dies bedeutet, dass diese C-API-R�ckrufe nur in den folgenden Szenarien aufgerufen werden k�nnen:
Aus einem XLL-Befehl, den Excel direkt oder über VBA aufgerufen hat
Von einer XLL-Arbeitsblatt- oder Makrovorlagenfunktion aus, die Excel direkt oder über VBA aufgerufen hat.
Sie können die Excel-C-API in den folgenden Szenarien nicht aufrufen:
Von einem Betriebssystemereignis aus (z.�B. von der DllMain-Funktion aus).
Von einem Hintergrundthread aus, den die DLL erstellt hat.
Rückgabewerte
Alle vier dieser Funktionen geben einen ganzzahligen Wert zurück, der den Aufrufer darüber informiert, ob die Funktion oder der Befehl erfolgreich aufgerufen wurde. Die zur�ckgegebenen Werte k�nnen die folgenden sein:
R�ckgabewert | Definiert in Xlcall.h als | Beschreibung |
---|---|---|
0 | xlretSuccess | Die Funktion oder der Befehl wurde erfolgreich ausgeführt. Das bedeutet nicht, dass die Ausführung fehlerfrei war. Excel4 könnte beispielsweise xlretSuccess zurückgeben, wenn die Funktion FIND aufgerufen wird, obwohl sie in #VALUE! ausgewertet wurde, da der Suchtext nicht gefunden wurde. Überprüfen Sie den Typ und den Wert des zurückgegebenen XLOPER/XLOPER12, wenn dies möglich ist. |
1 | xlretAbort | Ein Makrobefehl wurde durch Klicken des Benutzers auf die Schaltfl�che Abbrechen oder durch Dr�cken der ESC-Taste beendet. |
2 | xlretInvXlfn | Der bereitgestellte Funktions- oder Befehlscode ist ungültig. Dieser Fehler kann auftreten, wenn die aufrufende Funktion nicht über Berechtigungen zum Aufrufen der Funktion oder des Befehls verfügt. Eine Tabellenfunktion kann z. B. keine Makrovorlagen-Informationsfunktion oder eine Befehlsfunktion aufrufen. |
4 | xlretInvCount | Die Anzahl der im Aufruf angegebenen Argumente ist falsch. |
8 | xlretInvXloper | Mindestens eines der XLOPER- oder XLOPER12-Argumentwerte ist falsch formatiert oder aufgef�llt. |
16 | xlretStackOvfl | Excel hat ein festgestellt, dass der Vorgang möglicherweise zum Stapelüberlauf führt und hat die Funktion deshalb nicht aufgerufen. |
32 | xlretFailed | Bei dem Befehl oder der Funktion ist aus einem Grund, der nicht von einem der anderen Rückgabewerte beschrieben wird, ein Fehler aufgetreten. Beispielsweise würde bei einem Vorgang, der zu viel Arbeitsspeicher belegt, dieser Fehler auftreten. Dazu kann es bei dem Versuch kommen, einen sehr großen Verweis auf ein xltypeMulti-Array mithilfe der Funktionen XlCoerce zu konvertieren. |
64 | xlretUncalced | Bei dem Vorgang wurde versucht, den Wert einer nicht berechneten Zelle abzurufen. Um die Integrität der Neuberechnung in Excel zu erhalten, sind die Tabellenfunktionen dafür nicht zulässig. XLL-Befehle und als Makrovorlagenfunktionen registrierte Funktionen können jedoch auf nicht berechnete Zellenwerte zugreifen. |
128 | xlretNotThreadSafe | (Ab Excel 2007) Eine als threadsicher registrierte XLL-Arbeitsblattfunktion hat versucht, eine C-API-Funktion aufzurufen, die nicht threadsicher ist. Beispielsweise kann eine threadsichere Funktionen nicht die XLM-Funktion xlfGetCell aufrufen. |
256 | xlRetInvAsynchronousContext | (AbExcel 2010) Das asynchrone Behandeln von Funktionen ist ung�ltig. |
512 | xlretNotClusterSafe | (Ab Excel 2010) Der Aufruf wird auf Clustern nicht unterst�tzt. |
Wenn die Funktion einen der Fehlerwerte in der Tabelle zurückgibt (d. h. es wird nicht xlretSuccess zurückgegeben), wird der XLOPER- oder XLOPER12-Rückgabewert wird auch auf #VALUE! festgelegt. Unter bestimmten Umständen reicht eine entsprechende Überprüfung möglicherweise als Erfolgstest aus, aber Sie sollten beachten, dass ein Aufruf xlretSuccess und #VALUE! zurückgeben kann.
Wenn ein Aufruf der C-API zu xlretUncalced oder xlretAbort f�hrt, sollte der DLL- oder XLL-Code ein Steuerelement an Excel zur�ckgeben, bevor weitere C-API-Aufrufe durchgef�hrt werden (andere als Aufrufe der xlfree-Funktion zum Freigeben der an Excel zugewiesenen Arbeitsspeicherressourcen in XLOPER- und XLOPER12-Werten).
Befehls- oder Funktionsenumerationsargument: xlfn
Das Argument xlfn ist das erste Argument für die Rückruffunktionen und eine 32-Bit-Ganzzahl mit Vorzeichen. Der Wert sollte eine der Funktions- oder Befehlsenumerationen sein, die in der SDK-Headerdatei Xlcall.h definiert sind, wie im folgenden Beispiel gezeigt.
// 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)
...
Alle Arbeitsblatt- und Makrovorlagenfunktionen stellen Hexadezimalwerte zwischen 0 (xlfCount) und 0x0fff dar, wobei die höchste zugewiesen Zahl in Excel 2013 die Dezimalzahl 547 ist, Hexadezimalwert 0x0223 (xlfFloor_precise).
Alle Befehlsfunktionen stellen Hexadezimalwerte zwischen 0x8000 (xlcBeep) und 0x8fff dar, wobei die höchste zugewiesen Zahl in Excel 2013 die Hexadezimalzahl 0x8328 ist (xlcHideallInkannots). Sie werden in der Headerdatei als (n | xlCommand)
definiert, wobei n
als eine Dezimalzahl größer als oder gleich 0 und xlCommand als Hexadezimalzahl 0x8000 definiert ist.
Aufrufen von Excel-Befehlen, die Dialogfelder verwenden
Einige der Befehlcodes entsprechen Aktionen in Excel, die Dialogfelder verwenden. xlcFileDelete verwendet z. B. ein einzelnes Argument: einen Dateinamen oder eine Dateimaske. Dieser Befehl kann mit dem Dialogfeld aufgerufen werden, sodass der Benutzer den Löschvorgang abbrechen oder ändern kann. Er kann auch ohne das Dialogfeld aufgerufen werden. In diesem Fall werden die Dateien ohne jegliche weitere Interaktion gelöscht, wobei vorausgesetzt wird, dass sie vorhanden sind und der Aufrufer über die entsprechende Berechtigung verfügt. Um solche Befehle im Dialogfeldformat aufrufen zu können, muss die Befehlsenumeration durch den bitweisen OR-Operator mit 0x1000 (xlPrompt) verknüpft sein.
Im folgenden Codebeispiel werden Dateien im aktuellen Verzeichnis mit der Maske my_data*.bak gelöscht, und ein Dialogfeld wird nur angezeigt, wenn das Argument wahr ist.
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);
}
Aufrufen von Funktionen und Befehlen in internationalen Versionen
Sie können Excel zum Anzeigen von Funktionen und der XLM-Befehlsnamen in einer Vielzahl von Sprachen konfigurieren. Einige C-API-Befehle und -Funktionen verwenden Zeichenfolgen, die als Funktions- oder Befehlsnamen interpretiert werden. xlcFormula verwendet z. B. ein Zeichenfolgenargument, das in einer angegebenen Zelle eingefügt werden soll. Damit Ihr Add-In mit allen Spracheinstellungen funktioniert, können Sie die Zeichenfolgennamen in Englisch angeben und das Bit 0x2000 (xlIntl) in der Funktions- oder Befehlsenumeration festlegen.
Im folgenden Codebeispiel wird die Entsprechung von =SUM(X1:X100)
in Zelle A2 auf dem aktiven Blatt platziert. Beachten Sie, dass die Frameworkfunktion TempActiveRef verwendet wird, um eine temporäre externe Referenz-XLOPER zu erstellen. Die Formel wird in A2 in der richtigen vom Gebietsschema bestimmten Sprache angezeigt (z. B =SOMME(X1:X100)
. wenn die Sprache Französisch ist).
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;
}
Hinweis
[!HINWEIS] Da das Ergebnis des Aufrufs von Excel12 nicht erforderlich ist, kann 0 (NULL) als zweites Argument anstelle der Adresse des xResult-Objekts �bergeben werden. Dies wird im nächsten Abschnitt näher erläutert.
Reine DLL-Funktionen und Befehle
Excel unterstützt eine kleine Anzahl von Funktionen, auf die nur von einer DLL oder XLL zugegriffen werden kann. Diese werden in der Headerdatei als (n | xlSpecial)
definiert, wobei n
eine Dezimalzahl größer oder gleich 0 ist und xlSpecial
als 0x4000 hexadezimal definiert ist. Diese Funktionen sind in der folgenden Tabelle aufgeführt und in der API-Funktionsreferenz dokumentiert.
Funktion | n | xlSpecial | Beschreibung |
---|---|---|---|
xlFree | 0 | xlSpecial | Gibt die für Excel zugewiesenen Arbeitsspeicherressourcen frei. |
xlStack | 1 | xlSpecial | Gibt den freien Speicherplatz im Excel-Stapel zurück. |
xlCoerce | 2 | xlSpecial | Konvertiert zwischen XLOPER- und XLOPER12-Typen. |
xlSet | 3 | xlSpecial | Bietet eine schnelle Methode zum Festlegen von Zellwerten. |
xlSheetId | 4 | xlSpecial | Ruft einen Arbeitsblattnamen aus seiner internen ID ab. |
xlSheetNm | 5 | xlSpecial | Ruft eine interne Arbeitsblatt-ID aus dem zugehörigen Namen ab. |
xlAbort | 6 | xlSpecial | �berpr�ft, ob der Benutzer auf die Schaltfl�che Abbrechen geklickt oder die ESC-Taste gedr�ckt hat. |
xlGetInst | 7 | xlSpecial | Ruft das Excel-Instanzhandle ab. |
xlGetHwnd | 8 | xlSpecial | Ruft die Zugriffsnummer des Excel-Hauptfensters ab. |
xlGetName | 9 | xlSpecial | Ruft den Pfad und den Dateinamen der DLL-Datei ab. |
xlEnableXLMsgs | 10 | xlSpecial | Diese Funktion ist veraltet und wird nicht mehr aufgerufen. |
xlDisableXLMsgs | 11 | xlSpecial | Diese Funktion ist veraltet und wird nicht mehr aufgerufen. |
xlDefineBinaryName | 12 | xlSpecial | Definiert den Namen eines dauerhaften binären Speichers. |
xlGetBinaryName | 13 | xlSpecial | Ruft die Namensdaten eines dauerhaften binären Speichers ab. |
Rückgabewert XLOPER/XLOPER12: operRes
Das argument operRes ist das zweite Argument für die Rückrufe und ein Zeiger auf eine XLOPER (Excel4 und Excel4v) oder XLOPER12 (Excel12 und Excel12v). Nach einem erfolgreichen Aufruf enthält es den Rückgabewert der Funktion oder des Befehls. operRes kann auf 0 (null) (NULL-Zeiger) festgelegt werden, wenn kein R�ckgabewert erforderlich ist. Die vorherigen Inhalte von operRes werden �berschrieben, sodass der vollst�ndige Arbeitsspeicher, auf den gezeigt wurde, vor dem Aufruf freigegeben werden muss, um Arbeitsspeicherverluste zu vermeiden.
Wenn die Funktion oder der Befehl kann nicht aufgerufen werden kann (wenn z. B. die Argumente falsch sind), wird operRes auf den Fehler #VALUE! gesetzt. Ein Befehl gibt immer BooleanTRUE zurück, wenn er erfolgreich war, oder FALSE, wenn ein Fehler aufgetreten ist oder der Benutzer den Befehl abgebrochen hat.
Anzahl nachfolgender Argumente: count
Das Argument count ist das dritte Argument für die Rückrufe und eine 32-Bit-Ganzzahl mit Vorzeichen. Es sollte auf die Anzahl aufeinander folgender Argumente festgelegt werden, beginnend bei 1. Wenn eine Funktion oder ein Befehl keine Argumente akzeptiert, sollte er auf NULL festgelegt werden. In Microsoft Office Excel 2003 ist die maximale Anzahl von Argumenten für jede Funktion 30, obwohl die meisten weniger als das akzeptieren. Ab Excel 2007 wurde die maximale Anzahl von Argumenten, die jede Funktion annehmen kann, auf 255 erhöht.
Bei Excel4 und Excel12 ist count die Anzahl der Zeiger auf XLOPER- oder XLOPER12-Werte, die übergeben werden. Sie sollten sehr vorsichtig sein, nicht weniger Argumente als den Wert zu übergeben, auf den count festgelegt ist. Dies w�rde dazu f�hren, dass Excel im Stapel liest und versucht, ung�ltige XLOPER- oder XLOPER12-Werte zu verarbeiten, was zum Absturz der Anwendung f�hren kann.
Bei Excel4v und Excel12v ist count die Größe des Arrays von Zeigern auf XLOPER- oder XLOPER12-Werte, die als nächstes und letztes Argument übergeben wird. In diesem Fall sollten Sie ebenfalls sehr vorsichtig sein, kein kleineres Array als die Größe der count-Elemente zu übergeben, da dann die Grenzen des Arrays überschritten werden würden.
Übergeben von Argumenten an C-API-Funktionen
Excel4 und Excel12 verwenden Argumentlisten variabler Länge nach anzahl, die als Zeiger auf XLOPER bzw. XLOPER12 Werte interpretiert werden. Excel4v und Excel12v verwenden ein einzelnes Argument nach count, bei dem es sich um einen Zeiger auf ein Array von Zeigern auf XLOPER-Werte im Fall von Excel4v und um XLOPER12 Werte im Fall von Excel12v handelt.
Die Arrayformen Excel4v und Excel12v erm�glichen es Ihnen, einen Aufruf an die C-API ordnungsgem�� zu codieren, wenn die Anzahl der Argumente variabel ist. Das folgende Beispiel zeigt eine Funktion, die ein Array variabler Größe mit Zahlen akzeptiert und Excel-Tabellenfunktionen über die C-API verwendet, um die Summe, den Mittelwert sowie die Minimal- und Maximalwerte zu berechnen.
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);
}
Beim Ersetzen von Verweisen auf XLOPER12-Werte durch XLOPER, und von Excel12v durch Excel4v, w�re im vorangehenden Code eine Funktion das Ergebnis, die mit allen Versionen von Excel funktioniert. Dieser Vorgang der Excel-Funktionen SUM, AVERAGE, MIN und MAX ist so einfach, dass es effizienter w�re, diese in C zu codieren, statt Vorbereitung der Argumente und des Aufrufs in Excel. Viele der Excel-Funktionen sind jedoch komplexer, sodass dieser Ansatz in bestimmten Szenarien hilfreich ist.
Im Thema xlfRegister ist ein weiteres Beispiel f�r die Verwendung mit Excel4v und Excel12v enthalten. Wenn Sie eine XLL-Tabellenfunktion registrieren, können eine beschreibende Zeichenfolge für jedes Argument angeben, das im Dialogdeld Funktion einfügen verwendet wird. Die Gesamtanzahl der f�r xlfRegister angegebenen Argumente h�ngt daher von der Anzahl der Argumente ab, die Ihre XLL-Funktion verwendet, und variiert je nach Funktion.
Wenn Sie immer eine C-API-Funktion oder einen Befehl mit derselben Anzahl von Argumenten aufrufen, können Sie den zusätzlichen Schritt der Erstellung eines Arrays mit Zeigern für diese Argumente vermeiden. In diesen Fällen ist es einfacher und übersichtlicher, Excel4 und Excel12 zu verwenden. Beispielsweise müssen Sie beim Registrieren von XLL-Funktionen und -Befehlen den vollständigen Pfad und den Dateinamen der DLL oder XLL angeben. Sie können den Dateinamen in einem Aufruf an xlfGetName erhalten und ihn dann mit einem Aufruf an xlFree freigeben, wie im folgenden Beispiel für Excel4 und Excel12 gezeigt.
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);
}
In der Praxis könnte die Funktion Excel12v_example effizienter codiert werden, indem Sie ein einzelnes xltypeMultiXLOPER12-Argument erstellen und die C-API mithilfe von Excel12 aufrufen, wie im folgenden Beispiel dargestellt.
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);
}
Hinweis
[!HINWEIS] In diesem Fall wird der R�ckgabewert von Excel12 ignoriert. Stattdessen �berpr�ft der Code, ob das zur�ckgegebene XLOPER12-Objekt xltypeNum aufweist, um zu ermitteln, ob der Aufruf erfolgreich war.
XLCallVer
Neben den Rückrufen Excel4, Excel4v, Excel12 und Excel12v exportiert Excel eine XLCallVer-Funktion, die die Version der aktuell ausgeführten C-API zurückgibt.
Der Funktionsprototyp lautet wie folgt:
int pascal XLCallVer(void);
Sie k�nnen diese threadsichere Funktion von einem beliebigen XLL-Befehl oder einer -Funktion aus aufrufen.
In Excel 97 bis Excel 2003 gibt XLCallVerden Wert 1280 = 0x0500 hex = 5 x 256 zur�ck, was auf Excel Version�5 hinweist. Ab Excel 2007 wird 3072 = 0x0c00 hex = 12 x 256 zur�ckgegeben, was auf Version 12 hinweist.
Sie können damit zwar bestimmen, ob die neue C-API zur Laufzeit verfügbar ist, aber Sie können es vorziehen, die ausgeführte Version von Excel mithilfe Excel4(xlfGetWorkspace, &version, 1, &arg)
von zu erkennen, wobei arg
ein numerischer XLOPER-Wert ist, der auf 2 festgelegt ist. Die Funktion gibt einen Zeichenfolgen-XLOPER-Wert zurück, die Version, die dann in eine ganze Zahl umgewandelt werden kann. Der Grund, der für die Excel-Version anstelle der C-API-Version spricht, besteht darin, dass es Unterschiede zwischen Excel 2000, Excel 2002 und Excel 2003 gibt, die Ihr Add-In möglicherweise auch erkennen muss. Beispielsweise wurde die Genauigkeit einiger der Statistikfunktionen geändert.