如何使用 Excel12v C 接口设置单元格值
How to set cell values using Excel12v C interface
我有一个 Excel12v 函数,它使用 XLOPER 在 Excel sheet 上设置一些值。我可以根据 Microsoft's XLL guide. I authored xladd-derive 为 Rust 创建 XLL,这使得它非常简单地允许 returning 标量和值范围。
不过,我希望将一个随机单元格设置为一个值,而不是 return 一个值。下面演示的 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 宏中调用
一般来说,Excel 防止传播sheet 函数改变单元格中的值。实际上,spreadsheet 函数被赋予 sheet.
中值的只读视图
这是 xlSet 的文档,其中指出:
xlSet behaves as a Class 3 command-equivalent function; that is, it is
available only inside a DLL when the DLL is called from an object,
macro, menu, toolbar, shortcut key, or the Run button in the Macro
dialog box (accessed from View tab on the ribbon starting in Excel
2007, and the Tools menu in earlier versions).
这样做的原因是为了防止循环引用或其他会破坏或混淆计算树的操作。如果一个单元格中的函数可以更改其他单元格的内容,Excel 将很难确定单元格之间的依赖关系。
考虑假设函数 AddOne()
,它接受一个数字,加一并使用它通过 xlSet(或其他方式)立即将单元格设置到右侧。如果单元格 A1 中的公式为 =AddOne(B1)
会怎样?
此 Excel SDK reference 提供了更多信息。即:
Different Types of Functions
Excel4 and Excel12 distinguish among three classes of functions. The
functions are classified according to the three states in which Excel
might call the DLL.
Class 1 applies when the DLL is called from a worksheet as a result of
recalculation.
Class 2 applies when the DLL is called from within a function macro or
from a worksheet where it was registered with a number sign (#) in the
type text.
Class 3 applies when a DLL is called from an object, macro, menu,
toolbar, shortcut key, ExecuteExcel4Macro method, or the
Tools/Macro/Run command. For more information, see Excel Commands,
Functions, and States.
只有Class 3个函数可以调用xlSet.
因此,总而言之,Excel 应用程序确实不希望用户从另一个单元格中的函数调用更改一个单元格。与往常一样,如果您足够努力,您可能会实现这一目标(例如,通过某种方法获取 COM 应用程序对象指针并以此方式修改单元格,或者设置回调以异步修改单元格),但您可能会得到不可预知的结果。
我有一个 Excel12v 函数,它使用 XLOPER 在 Excel sheet 上设置一些值。我可以根据 Microsoft's XLL guide. I authored xladd-derive 为 Rust 创建 XLL,这使得它非常简单地允许 returning 标量和值范围。
不过,我希望将一个随机单元格设置为一个值,而不是 return 一个值。下面演示的 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 宏中调用
一般来说,Excel 防止传播sheet 函数改变单元格中的值。实际上,spreadsheet 函数被赋予 sheet.
中值的只读视图这是 xlSet 的文档,其中指出:
xlSet behaves as a Class 3 command-equivalent function; that is, it is available only inside a DLL when the DLL is called from an object, macro, menu, toolbar, shortcut key, or the Run button in the Macro dialog box (accessed from View tab on the ribbon starting in Excel 2007, and the Tools menu in earlier versions).
这样做的原因是为了防止循环引用或其他会破坏或混淆计算树的操作。如果一个单元格中的函数可以更改其他单元格的内容,Excel 将很难确定单元格之间的依赖关系。
考虑假设函数 AddOne()
,它接受一个数字,加一并使用它通过 xlSet(或其他方式)立即将单元格设置到右侧。如果单元格 A1 中的公式为 =AddOne(B1)
会怎样?
此 Excel SDK reference 提供了更多信息。即:
Different Types of Functions
Excel4 and Excel12 distinguish among three classes of functions. The functions are classified according to the three states in which Excel might call the DLL.
Class 1 applies when the DLL is called from a worksheet as a result of recalculation.
Class 2 applies when the DLL is called from within a function macro or from a worksheet where it was registered with a number sign (#) in the type text.
Class 3 applies when a DLL is called from an object, macro, menu, toolbar, shortcut key, ExecuteExcel4Macro method, or the Tools/Macro/Run command. For more information, see Excel Commands, Functions, and States.
只有Class 3个函数可以调用xlSet.
因此,总而言之,Excel 应用程序确实不希望用户从另一个单元格中的函数调用更改一个单元格。与往常一样,如果您足够努力,您可能会实现这一目标(例如,通过某种方法获取 COM 应用程序对象指针并以此方式修改单元格,或者设置回调以异步修改单元格),但您可能会得到不可预知的结果。