Freigeben über


Abwärtskompatibilität

Gilt für: Excel 2013 | Office 2013 | Visual Studio

In diesem Thema werden Probleme mit der XLL-Kompatibilität in verschiedenen Versionen von Microsoft Excel behandelt.

Nützliche Konstantendefinitionen

Erwägen Sie, definitionen ähnlich wie diese in Ihren XLL-Projektcode einzufügen und alle Instanzen von Literalzahlen zu ersetzen, die in diesem Kontext verwendet werden. Dadurch wird der versionsspezifische Code verdeutlicht und die Wahrscheinlichkeit von versionsbezogenen Fehlern in Form von harmlos aussehenden Zahlen verringert.

#define MAX_XL11_ROWS            65536
#define MAX_XL11_COLS              256
#define MAX_XL12_ROWS          1048576
#define MAX_XL12_COLS            16384
#define MAX_XL11_UDF_ARGS           30
#define MAX_XL12_UDF_ARGS          255
#define MAX_XL4_STR_LEN           255u
#define MAX_XL12_STR_LEN        32767u

Abrufen der ausgeführten Version

Sie sollten erkennen, welche Version mit Excel4(xlfGetWorkspace, &version, 1, &arg)ausgeführt wird, wobei arg ein numerischer XLOPER-Wert auf 2 und version eine XLOPER-Zeichenfolge ist, die dann in eine ganze Zahl umgewandelt werden kann. Für Microsoft Excel 2013 ist dies 15.0. Dies sollten Sie in oder aus der xlAutoOpen-Funktion ausführen. Anschließend können Sie eine globale Variable festlegen, die alle Module in Ihrem Projekt darüber informiert, welche Excel-Version ausgeführt wird. Ihr Code kann dann entscheiden, ob die C-API mithilfe von Excel12 und XLOPER12s oder excel4 mit XLOPERs aufgerufen werden soll.

Sie können XLCallVer aufrufen, um die C-API-Version zu ermitteln, aber dies gibt nicht an, welche der Vor-Excel 2007-Versionen Sie ausführen.

Erstellen von Add-Ins, die duale Schnittstellen exportieren

Stellen Sie sich eine XLL-Funktion vor, die eine Zeichenfolge akzeptiert und einen Wert zurückgibt, der einem der Arbeitsblattdatentypen entsprechen kann. Sie können eine Funktion exportieren, die als Typ "PD" registriert und wie folgt prototypisiert ist, wobei die Zeichenfolge als bytegezählte Zeichenfolge mit Längenzählung übergeben wird.

LPXLOPER WINAPI my_xll_fn(unsigned char *arg);

Obwohl dies perfekt funktioniert, gibt es mehrere Gründe, warum dies nicht die ideale Schnittstelle für Ihren Code ab Excel 2007 ist:

  • Es unterliegt den Einschränkungen von C-API-Bytezeichenfolgen und kann nicht auf die langen Unicode-Zeichenfolgen zugreifen, die ab Excel 2007 unterstützt werden.
  • Obwohl Excel ab Excel 2007 XLOPERs übergeben und akzeptieren kann, konvertiert es diese intern in XLOPER12s, sodass ab Excel 2007 ein impliziter Konvertierungsaufwand entsteht, der nicht vorhanden ist, wenn der Code in früheren Versionen von Excel ausgeführt wird.
  • Es kann sein, dass diese Funktion threadsicher gemacht werden kann, aber wenn die Typzeichenfolge in PD$geändert wird, schlägt die Registrierung in ab Excel 2007 fehl.

Aus diesen Gründen sollten Sie im Idealfall ab Excel 2007 eine Funktion für Ihre Benutzer exportieren, die als QD%$registriert wurde, vorausgesetzt, Ihr Code ist threadsicher und prototypisch wie folgt.

LPXLOPER12 WINAPI my_xll_fn_v12(wchar_t *arg);

Ein weiterer Grund, warum Sie eine andere Funktion ab Excel 2007 registrieren möchten, ist, dass XLL-Funktionen bis zu 255 Argumente anstelle des Grenzwerts von 30 in früheren Versionen verwenden können.

Glücklicherweise können Sie beide Vorteile nutzen, indem Sie beide Versionen aus Ihrem Projekt exportieren. Anschließend können Sie die ausgeführte Excel-Version erkennen und die am besten geeignete Funktion bedingt registrieren. Weitere Informationen und eine Beispielimplementierung finden Sie unter Developing Add-Ins (XLLs) in Excel 2007.

Dieser Ansatz führt zu der Möglichkeit, dass ein arbeitsblatt, das in Excel 2003 ausgeführt wird, andere Ergebnisse anzeigt als dasselbe Blatt, das ab Excel 2007 ausgeführt wird. Excel 2003 würde beispielsweise eine Unicode-Zeichenfolge in einer Excel 2003-Arbeitsblattzelle einer ASCII-Bytezeichenfolge zuordnen und abschneiden, bevor sie an eine XLL-Funktion übergeben wird. Ab Excel 2007 übergibt Excel eine nicht konvertierte Unicode-Zeichenfolge an eine auf die richtige Weise registrierte XLL-Funktion. Dies kann zu einem anderen Ergebnis führen. Sie sollten sich dieser Möglichkeit und den Konsequenzen für Ihre Benutzer bewusst sein, nicht nur beim Upgrade. Beispielsweise wurden einige integrierte numerische Funktionen zwischen Excel 2000 und Excel 2003 verbessert.

Neue Arbeitsblattfunktionen und Analysetoolpak-Funktionen

Analysis Toolpak (ATP)-Funktionen sind ab Excel 2007 Bestandteil von Excel. Bisher konnte eine XLL eine ATP-Funktion nur mithilfe von xlUDF aufrufen. Ab Excel 2007 sollten die ATP-Funktionen mithilfe der in xlcall.h definierten Funktionsenumeration aufgerufen werden. Im Beispiel unter Aufrufen von benutzerdefinierten Funktionen aus DLLs werden die beiden verschiedenen Methoden veranschaulicht.

Siehe auch