XLL仅适用于特定Excel工作表,尽管有完全合格的范围参数

时间:2013-07-11 21:49:41

标签: excel vba xll

我有一个XLL文件(使用xll.codeplex.com库),代码如下:

xll_rootfinder(TCHAR* x, TCHAR* y, const double min, const double max)
{
#pragma XLLEXPORT
    try {
            ExcelX(xlcCalculateDocument);
            be = ExcelX(xlfTextref, OPERX(x), OPERX(true));
            nav = ExcelX(xlfTextref, OPERX(y), OPERX(true));
            typedef std::pair<double, double> Result;
            boost::uintmax_t max_iter=50;
            boost::math::tools::eps_tolerance<double> tol(5);
            Result r1 = boost::math::tools::toms748_solve(recalc, min, max, tol, max_iter);
    }

然后在VBA子中重复调用此函数。参数x和y是范围地址,例如'XX'!B42。工作表名称是动态的。 VBA例程激活特定工作表,然后使用该工作表上的XLL函数进行计算。如果我手动运行VBA子程序,在正确的工作表上启动时,一切都会正常工作(直到需要切换工作表)。所以我不相信这是一个C ++问题。如果我从任何其他工作表启动sub,Excel会在遇到第一个XLL调用时立即崩溃:

 Call Application.Run("ROOTFINDER", PriceAddress, NAVAddress, 45, 500)  

我的代码中没有引用ThisWorksheet或ActiveWorksheet。我设置了断点并确保正确设置了工作表变量。

为什么XLL似乎在访问新激活的工作表时遇到问题,尽管给出了适当的范围地址,包括工作表名称?

非常感谢。

1 个答案:

答案 0 :(得分:1)

而不是TCHAR *使用XLOPER。 Excel将为您完成工作。您所要做的就是将参数声明为XLL_XLOPER而不是XLL_OPER,以获取范围而不是值。 或者也许我不理解你真正的问题。 TOMS 748.为什么要加强这个?只需直接致电Fortran。英特尔为此提供了高度优化的库。 看看codeplex上的xllblas或xlllapack项目,让我知道你的想法。