从c ++ xll的excel中接收一个matrix,修改它并返回
我编写了一个xll函数接收来自excel的matrix,修改它返回它:
__declspec(dllexport) LPXLOPER12 WINAPI ZZZZUpdateArray1(LPXLOPER12 arrayin) { if (arrayin->xltype == xltypeMulti | xlbitDLLFree) { double ScaleFactor = 2.0; int rows = arrayin->val.array.rows; int cols = arrayin->val.array.columns; static XLOPER12 xlArray; xlArray.val.array.lparray = reinterpret_cast<LPXLOPER12>(::new XLOPER12[rows * cols] /*::malloc(rows * cols * sizeof(XLOPER12))*/); for (int r = 0; r<rows; r++) { for (int c = 0; c<cols; c++) { if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum) { XLOPER12* var = xlArray.val.array.lparray + ((r* cols) + c); var->xltype = xltypeNum; var->val.num = ScaleFactor*(arrayin->val.array.lparray + ((r* cols) + c))->val.num ; } } } return static_cast<LPXLOPER12>(&xlArray); } return arrayin; }
但它崩溃了
if ((arrayin->val.array.lparray + ((r* cols) + c))->xltype == xltypeNum)
如果我是例如从Excel中取5 * 5matrix,在debugging时,我看到它有19行20列,发生了什么!
这可能是因为当我收到LPXLOPER12 arrayin
,它代表了一个excel范围,比5 * 5matrix复杂得多。 如何访问它包含的5 * 5matrix,然后?
- 使用Excel代码
Q
来注册input参数。 -
你需要正确地声明返回variables:
// initialize the return variable xlArray.val.array.rows = rows; xlArray.val.array.columns = cols; xlArray.xltype = xltypeMulti | xlbitDLLFree;