適用於:Excel 2013 |Office 2013 |Visual Studio
從 DLL/XLL 或程式碼資源內呼叫內部Microsoft Excel 工作表函式、巨集工作表函數或命令,或僅限 XLL 的特殊函式或命令。
所有最新版本的Excel都支援 Excel4。 從 Excel 2007 開始,支援 Excel12 。
只有當 Excel 將控制權傳遞至 DLL 或 XLL 時,才能呼叫這些函式。 當 Excel 透過呼叫 Visual Basic for Applications (VBA) 間接傳遞控制權時,也可以呼叫它們。 無法在任何其他時間呼叫它們。 例如,在呼叫 DllMain 函式期間,或在作系統呼叫 DLL 時,或是從 DLL 所建立的線程呼叫時,無法呼叫它們。
Excel4v 和 Excel12v 函式接受其自變數做為數位,而 Excel4 和 Excel12 函式則接受其自變數做為堆疊上的可變長度清單。 在所有其他方面, Excel4 的行為與 Excel4v 相同,而 Excel12 的行為與 Excel12v 相同。
int Excel4(int iFunction, LPXLOPER pxRes, int iCount, LPXLOPER argument1, ...);
int Excel12(int iFunction, LPXLOPER12 pxRes, int iCount, LPXLOPER12 argument1, ...);
參數
iFunction (int)
數位,表示您要呼叫的命令、函式或特殊函式。 如需有效 iFunction 值的清單,請參閱下列一節。
pxRes (LPXLOPER 或 LPXLOPER12)
使用 Excel4) 的 XLOPER (指標,或是具有 Excel12) 的XLOPER12 (,以保存評估函式的結果。
iCount (int)
將傳遞至函式的後續自變數數目。 在 2003 版的 Excel 中,這可以是從 0 到 30 的任何數位。 從 Excel 2007 開始,這可以是 0 到 255 之間的任何數位。
argument1, ... (LPXLOPER 或 LPXLOPER12)
函式的選擇性自變數。 所有自變數都必須是 XLOPER 或 XLOPER12值的 指標。
傳回值
傳回下列其中一個整數 (int) 值。
值 | 傳回碼 | 描述 |
---|---|---|
0 | xlretSuccess | 已成功呼叫函式。 這並不表示函式未傳回 Excel 錯誤值;若要找出這一點,您必須查看所產生 pxRes 參數的類型和值。 |
1 | xlretAbort | 命令或函式在內部中止) (異常終止。 如果 XLM 巨集表透過呼叫 CLOSE 自行關閉,或 Excel 記憶體不足,就會發生這種情況。 如果 Excel 傳回此錯誤,呼叫函式必須立即結束。 只有在結束之前,才允許 DLL 呼叫 xlFree 。 不允許對 C API 進行所有其他呼叫。 使用者可以使用 [檔案] 功能表上的 [儲存] 命令,以互動方式儲存任何工作。 |
2 | xlretInvXlfn | 提供的函數編號無效。 如果您使用 Xlcall.h 頭檔中的常數,除非您呼叫的 Excel 版本不支援,否則不應該發生這種情況。 |
4 | xlretInvCount | 輸入的自變數數目無效。 在 Excel 2003 之前的版本中,任何函式可接受的自變數數目上限為 30。 從 Excel 2007 開始,最大數目為 255。 有些需要固定或最少的自變數數目。 |
8 | xlretInvXloper | 傳遞給函式的 XLOPER 或 XLOPER12 無效,或使用錯誤類型的自變數。 |
16 | xlretStackOvfl | 發生堆疊溢出。 使用 xlStack 來監視堆疊上剩餘的空間量。 盡可能避免在堆疊上配置非常大的本機 (自動) 陣列和結構;將它們設為靜態。 (請注意,堆棧溢出可能會在未偵測到的情況下發生。) |
32 | xlretFailed | 命令對等函式失敗。 這相當於顯示巨集錯誤警示對話框的巨集命令。 |
64 | xlretUncalced | 嘗試取值尚未計算的儲存格,因為它排定在目前儲存格之後重新計算。 在此情況下,DLL 應該會立即將控制權傳回Excel。 只有在結束之前,才允許 DLL 呼叫 xlFree 。 不允許對 C API 進行所有其他呼叫。 如需哪些函式可以和無法存取尚未重新計算之單元格值的詳細資訊,請參閱 Excel 命令、函式和狀態。 |
128 | xlretNotThreadSafe | 嘗試在活頁簿的多線程重新計算期間呼叫不是或可能不是安全線程的函式。 從 Excel 2007 開始,此值會傳回,而且只會在宣告為安全線程的 XLL 工作表函式內傳回。 |
256 | xlRetInvAsynchronousContext | 異步函式句柄無效。 此值僅供 Excel 2010 使用。 |
512 | xlRetNotClusterSafe | 叢集不支援呼叫。 此值僅供 Excel 2010 使用。 |
註解
有效的 iFunction 值
有效的 iFunction 值是 Xlcall.h 頭檔或下列任何特殊函式中定義的任何 xlf... 或 xlc... 常數。
- xlAbort
- xlEnableXLMsgs
- xlGetInst
- xlSheetNm
- xlCoerce
- xlFree
- xlGetName
- xlStack
- xlDefineBinaryName
- xlGetBinaryName
- xlSet
- xlUDF
- xlDisableXLMsgs
- xlGetHwnd
- xlSheetId
不同類型的函式
Excel4 和 Excel12 可區別三種函式類別。 這些函式會根據 Excel 可能呼叫 DLL 的三種狀態進行分類。
- 當從工作表呼叫 DLL 作為重新計算的結果時,會套用類別 1。
- 類別 2 適用於從函式巨集內呼叫 DLL 時,或是從已在類型文字中以數位符號 (#) 註冊它的工作表。
- 從物件、巨集、功能表、工具列、快捷鍵、 ExecuteExcel4Macro 方法或 Tools/Macro/Run 命令呼叫 DLL 時,就會套用類別 3。 如需詳細資訊,請參閱 Excel 命令、函式和狀態。
下表顯示每個類別中有效的函式。
類別1 | 類別2 | 類別3 |
---|---|---|
任何工作表函式 xlSet 以外的任何僅限 XLL的 xl... 函式。 xlfCaller |
任何工作表函式 xlSet 以外的任何 xl... 函 式。 巨集工作表函式,包括 xlfCaller,會傳回值,但不會執行任何會影響工作區或任何開啟活頁簿的動作。 |
任何函式,包括 xlSet 和命令對等函式。 |
顯示 Command-Equivalent 函式的對話框
如果命令對等函式有相關聯的對話框,您可以在 iFunction 中設定 xlPrompt 位。 這表示 Excel 會在執行命令之前顯示適當的對話方塊。
寫入國際 DLL
如果您在 iFunction 中設定 xlIntl 位,函式或命令的執行方式就如同從國際巨集表呼叫一樣。 這表示此命令的行為就如同在美國版本的 Excel 上一樣,即使它是在國際 (本地化的) 版本上執行。
xlretUncalced 或 xlretAbort
收到其中一個傳回值之後,您的 DLL 必須立即清除並傳回 Excel 的控制權。 在收到其中一個傳回值之後,會停用透過 C API 對 Excel 的回呼,但 xlFree 除外。
範例
下列範例會使用 Excel12 函式來選取呼叫儲存格的來源。
此程式代碼範例是 Excel 2010 XLL SDK 中所提供較大範例的一部分,位於您安裝 SDK 的下列位置:
\Samples\Example\Example.c.
注意事項
此函式會 (xlcSelect) 呼叫命令巨集,因此只有在從 XLM 巨集表呼叫命令巨集時才能運作。
short WINAPI Excel12Example(void)
{
XLOPER12 xRes;
Excel12(xlfCaller, &xRes, 0);
Excel12(xlcSelect, 0, 1, (LPXLOPER12)&xRes);
Excel12(xlFree, 0, 1, (LPXLOPER12)&xRes);
return 1;
}