XLL问题与xlfEvaluate

时间:2015-02-07 12:33:27

标签: excel xll

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

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

1 个答案:

答案 0 :(得分:1)

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

xlfEvaluate:这是MS doc 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()"看看会发生什么。