共用方式為


回溯相容性

適用於:Excel 2013 |Office 2013 |Visualstudio

本主題解決不同版本 Microsoft Excel 中的 XLL 相容性問題。

有用的常數定義

請考慮在 XLL 專案程式代碼中包含與這些類似的定義,並取代此內容中使用的所有常值實例。 這會釐清版本特定的程式代碼,並以看起來無害的數位形式降低版本相關 Bug 的可能性。

#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

取得執行中的版本

您應該使用 Excel4(xlfGetWorkspace, &version, 1, &arg)來偵測正在執行的版本,其中 arg 是設定為 2 的數值 XLOPER ,而 version 是字串 XLOPER ,然後可以強制轉換成整數。 針對 Microsoft Excel 2013,這是 15.0。 您應該在 xlAutoOpen 函式或 xlAutoOpen 函式中或從中執行此動作。 然後,您可以設定全域變數,以通知專案中所有模組執行哪個版本的 Excel。 接著,您的程式代碼可以決定是否要使用 Excel12XLOPER12呼叫 C API,或使用 XLOPERs 呼叫 Excel4

您可以呼叫 XLCallVer 來探索 C API 版本,但這不會指出您執行的 Excel 2007 之前的版本。

建立導出雙重介面的載入宏

請考慮採用字串並傳回可以是任何工作表數據類型的值的 XLL 函式。 您可以匯出註冊為類型 「PD」 的函式,並依照下列方式建立原型,其中字串會傳遞為長度計數的位元組字串。

LPXLOPER WINAPI my_xll_fn(unsigned char *arg);

雖然這可完美運作,但從 Excel 2007 開始,這並不是您程式代碼的理想介面有幾個原因:

  • 它受限於 C API 位元組字串的限制,而且無法存取從 Excel 2007 開始支援的長 Unicode 字元串。
  • 雖然從 Excel 2007 開始,Excel 可以傳遞並接受 XLOPERs,但在內部會將它們轉換成 XLOPER12,因此從 Excel 2007 開始會有隱含的轉換額外負荷,當程式代碼在舊版 Excel 中執行時,並不存在。
  • 可能是此函式可以讓線程安全,但如果類型字串變更為 PD$,註冊會在 Excel 2007 之前開始失敗。

基於這些理由,在理想的情況下,從 Excel 2007 開始,您應該為註冊為 QD%$的用戶導出函式,假設您的程式代碼是安全線程且原型如下所示。

LPXLOPER12 WINAPI my_xll_fn_v12(wchar_t *arg);

從 Excel 2007 開始,您可能想要註冊不同函式的另一個原因是它允許 XLL 函式接受最多 255 個自變數,而不是舊版的 30 個限制。

幸運的是,您可以從項目匯出這兩個版本,以獲得這兩者的優點。 然後,您可以偵測執行中的 Excel 版本,並有條件地註冊最適當的函式。 如需詳細資訊和範例實作,請 參閱在 Excel 2007 中開發載入宏 (XLL)

這種方法會導致在 Excel 2003 中執行的工作表可能會顯示與從 Excel 2007 開始執行的相同工作表不同的結果。 例如,Excel 2003 會將 Excel 2003 工作表單元格中的 Unicode 字串對應至 ASCII 位元組字串,並在將它傳遞至 XLL 函式之前將其截斷。 從 Excel 2007 開始,Excel 會將未轉換的 Unicode 字串傳遞至以正確方式註冊的 XLL 函式。 這可能會導致不同的結果。 您應該留意這種可能性,以及對使用者造成的影響,而不只是在升級中。 例如,Excel 2000 與 Excel 2003 之間已改善一些內建數值函數。

新的工作表函式和分析工具組函式

從 Excel 2007 開始,Analysis Toolpak (ATP) 函式是 Excel 的一部分。 先前,XLL 只能使用 xlUDF 呼叫 ATP 函式。 從 Excel 2007 開始,應該使用 xlcall.h 中定義的函式列舉來呼叫 ATP 函式。 從 DLL 呼叫使用者定義函數中的範例示範兩種不同的方法。

另請參閱