我有一个Excel12v函数,使用XLOPER在Excel表上设置一些值。我可以按照微软XLL指南创建XLL。我为Rust编写了xladd-派生,这使得允许返回标量和值范围非常简单。
但是,我希望将随机单元格设置为一个值,而不是返回一个值。下面演示了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宏调用
发布于 2022-01-17 13:57:52
通常,Excel防止电子表格函数更改单元格中的值。实际上,电子表格函数是表中值的只读视图.
这是xlSet的文档,其中声明:
xlSet作为一个类3命令-等效函数;也就是说,只有在从“宏”、“菜单”、“工具栏”、“快捷键”或“宏”对话框中的“运行”按钮调用DLL (从Excel 2007开始的带状视图选项卡和早期版本的“工具”菜单)调用DLL时,才能使用。
这样做的原因是防止循环引用或其他可能破坏或混淆计算树的操作。如果一个单元格中的函数可以更改其他单元格的内容,Excel将难以确定单元格之间的依赖关系。
考虑假设函数AddOne(),它接受一个数字,添加一个,并使用它来立即通过xlSet (或其他方式)将单元格设置到右边。如果单元格A1中的公式是=AddOne(B1),会发生什么?
这个Excel SDK参考提供了更多的信息。即:
不同类型的函数 Excel4和Excel12区分了三类函数。根据Excel可能调用DLL的三种状态对函数进行分类。 当重新计算的结果从工作表调用DLL时,将应用第1类。 类2适用于从函数宏中调用DLL或从在类型文本中使用数字符号(#)注册DLL的工作表调用DLL。 当从对象、宏、菜单、工具栏、快捷键、ExecuteExcel4Macro方法或Tools/ macro /Run命令调用DLL时,应用类3。有关更多信息,请参见Excel命令、函数和状态。
只有第3类函数才能调用xlSet。
因此,总之,Excel应用程序实际上不希望用户从另一个函数调用中更改一个单元格。与往常一样,如果您工作得足够努力,很可能会做到这一点(例如通过某种方法获取COM应用程序对象指针并以这种方式修改单元格,或者设置一个回调来异步修改单元格),但是您可能会有不可预测的结果。
https://stackoverflow.com/questions/70740797
复制相似问题