1

我有一个带有以下代码的 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++ 问题。如果我从任何其他工作表启动子程序,Excel 将在遇到第一个 XLL 调用时立即崩溃:

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

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

为什么尽管给出了正确的范围地址(包括工作表名称),但 XLL 似乎在访问新激活的工作表时出现问题?

非常感激。

4

1 回答 1

1

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

于 2013-07-12T04:01:47.650 回答