適用於: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。 接著,您的程式代碼可以決定是否要使用 Excel12 和 XLOPER12呼叫 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 呼叫使用者定義函數中的範例示範兩種不同的方法。