1

我使用 VS2012 用 XLL 编写的一个非常简单的函数遇到了这个问题。我曾尝试阅读 MSDN 和 Steve Dalton 的书,但我看不出我做错了什么。棘手的一点是,我需要我的函数来读取工作表单元格中的值,而不是从中调用它的单元格。该函数不接受任何参数,并返回一个整数。我已将其声明为 J#(# 表示它可以按照 Dalton 的建议调用 XLM 功能......尽管没有 # 我仍然遇到同样的问题)。我没有包括我的函数声明以节省空间,但它很简单,我认为这不是问题的原因。

第一个代码块工作正常。我写它只是为了建立信心。

//This block works correctly. A trial copied from the old Excel 97 documentation
XLOPER12 xlInput1, xlOutput2;
/* Evaluate the string "2+3" */
xlInput1.xltype = xltypeStr;
xlInput1.val.str = L"\0032+3";  //prefix with string length in Octal
Excel12(xlfEvaluate, &xlOutput2, 1, (LPXLOPER12) &xlInput1); 
//works OK, and xlOutput2 contains 5

但是这第二个块不起作用。我不明白为什么。我正在尝试从一个单元格中读取一个值,该单元格与调用函数的单元格不同。我得到的是返回 XLOPER12,其中包含错误 (xltypeErr) 和 val.num 字段中的垃圾值(工作表单元格确实包含整数值)。

//This block does not work
XLOPER12 xlInput3, xlOutput3;
/* Look up the name Tst on the active sheet called Sht */
xlInput3.xltype = xltypeStr;
xlInput3.val.str = L"\003Tst";  //this also gives problems regardless of whether the string is defined as \004!Tst or \007Sht!Tst
Excel12(xlfEvaluate, &xlOutput3, 1, (LPXLOPER12) &xlInput3);  //xlOutput3 now has a type of xltypeErr, rather than the correct integer value on the worksheet

你能解释一下出了什么问题吗?

4

1 回答 1

1

如果您尝试从与调用函数的单元格不同的单元格中读取值,则需要一个参数来引用该不同的单元格。例如,在 A1 中,您可能有 '=myfunc(A2)'。然后您的 C++ 扩展函数需要声明为“JP#”,其中 P 对应于 A2 单元格引用参数。如果 Excel 可以解析“A2”引用,它将传入一个 XLOPER,其值为 xltypeNum、xltypeInt 或 xltypeStr,具体取决于 A2 的内容。如果没有,您可能会得到一个 xltypeSRef。

xlfEvaluate:这是 MS 文档https://msdn.microsoft.com/en-us/library/office/bb687913(v=office.15).aspx

请注意,MS 指定传递给 xlfEvaluate 的字符串必须“仅包含函数,而不包含命令等效项”。我怀疑 L"\003Tst" 与您的 Excel 已知的任何函数都不对应。在我的 Excel 2013 中没有名为 Tst 的内置函数。您可能有一个提供名为 Tst 的函数的插件,但我猜不是。所以尝试将 xlInput3.val.str 更改为 L"\006RAND()" 看看会发生什么。

于 2015-02-10T14:07:23.020 回答