我有一個 Excel12v 函式,它使用 XLOPER 在 Excel 作業表上設定一些值。根據Microsoft 的 XLL 指南,我可以很好地創建 XLL 。我為 Rust 撰寫了xladd-derive,它允許非常簡單地回傳標量和值范圍。
但是,我希望將隨機單元格設定為一個值,而不是回傳一個值。下面演示的 xlSet 函式可以做到這一點并且作業正常。
short WINAPI xlSetExample()
{
XLOPER12 xRef, xValue;
xRef.xltype = xltypeSRef;
xRef.val.sref.count = 1;
xRef.val.sref.ref.rwFirst = 204;
xRef.val.sref.ref.rwLast = 205;
xRef.val.sref.ref.colFirst = 1;
xRef.val.sref.ref.colLast = 1;
xValue.xltype = xltypeInt;
xValue.val.w = 12345;
Excel12v(xlSet, 0, 2, (LPXLOPER12)&xRef, (LPXLOPER12)&xValue);
return 1;
}
但僅在從 VBA 宏呼叫時才有效
Sub test()
Application.Run("xlSetExample","12345")
End Sub
是否有等效的 xlf* 或 xlc* 函式允許設定單元格值但不需要從 VBA 宏中呼叫
uj5u.com熱心網友回復:
通常,Excel 會阻止電子表格函式更改單元格中的值。實際上,電子表格函式被賦予了作業表中值的只讀視圖。
這是xlSet的檔案,其中指出:
xlSet 表現為 3 類命令等效函式;也就是說,當從物件、宏、選單、工具列、快捷鍵或“宏”對話框中的“運行”按鈕呼叫 DLL 時,它僅在 DLL 內部可用(從 Excel 2007 開始,從功能區上的“視圖”選項卡訪問,和早期版本中的工具選單)。
這樣做的原因是為了防止回圈參考或其他會破壞或混淆計算樹的操作。如果一個單元格中的函式可以更改其他單元格的內容,Excel 將難以確定單元格之間的依賴關系。
考慮一個假設函式AddOne(),它接受一個數字,加一個并使用它通過 xlSet (或其他方式)將單元格立即設定為右側。如果單元格 A1 中的公式是 會發生什么=AddOne(B1)?
此Excel SDK 參考提供了更多資訊。即:
不同型別的功能
Excel4 和 Excel12 區分了三類函式。這些函式根據 Excel 可能呼叫 DLL 的三種狀態進行分類。
當由于重新計算而從作業表中呼叫 DLL 時,適用第 1 類。
當從函式宏內或從在型別文本中使用數字符號 (#) 注冊的作業表呼叫 DLL 時,適用第 2 類。
當從物件、宏、選單、工具列、快捷鍵、ExecuteExcel4Macro 方法或工具/宏/運行命令呼叫 DLL 時,適用第 3 類。有關詳細資訊,請參閱 Excel 命令、函式和狀態。
只有3 類函式可以呼叫 xlSet。
因此,總而言之,Excel 應用程式確實不希望用戶從另一個單元格中的函式呼叫更改一個單元格。與往常一樣,如果您足夠努力,您可能會實作這一點(例如,通過某種方法獲取 COM 應用程式物件指標并以這種方式修改單元格,或設定回呼以異步修改單元格),但您可能會得到不可預知的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/413783.html
標籤:
