我有一个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似乎在访问新激活的工作表时遇到问题,尽管给出了适当的范围地址,包括工作表名称?
非常感谢。
答案 0 :(得分:1)
而不是TCHAR *使用XLOPER。 Excel将为您完成工作。您所要做的就是将参数声明为XLL_XLOPER而不是XLL_OPER,以获取范围而不是值。 或者也许我不理解你真正的问题。 TOMS 748.为什么要加强这个?只需直接致电Fortran。英特尔为此提供了高度优化的库。 看看codeplex上的xllblas或xlllapack项目,让我知道你的想法。