如何使用Excel12v C接口设置单元格值

问题描述 投票:0回答:2

我有一个 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 宏调用

c++ excel xll
2个回答
3
投票

一般来说,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 方法或 工具/宏/运行命令。有关详细信息,请参阅 Excel 命令, 函数和状态。

只有Class 3函数可以调用xlSet。

因此,总而言之,Excel 应用程序确实不希望用户通过另一个单元格中的函数调用来更改一个单元格。与往常一样,如果您足够努力,您可能可以实现这一目标(例如,通过某种方法获取 COM 应用程序对象指针并以这种方式修改单元格,或者设置回调以异步修改单元格),但您可能会得到不可预测的结果。


0
投票

使用github上的xlw或xlladdins可以更轻松地编写函数

© www.soinside.com 2019 - 2024. All rights reserved.