我有一个带有以下代码的 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 似乎在访问新激活的工作表时出现问题?
非常感激。