- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 C API 为 Excel 编写一个数组构造函数作为工作表函数。
目标:=array_cons(1, 2, 3) => {1, 2, 3}
但是,我没有正确初始化 XLOPER12。在 Excel 中,我的函数当前返回 #NUM
。我正在获取参数列表并通过宏将其打包到 vargs
数组中,然后尝试返回提供的数组部分。
#include <windows.h>
#include <xlcall.h>
#include <framewrk.h>
#include <boost/preprocessor.hpp>
#define VARG_COUNT 250
#define VARG_FORMAT(Z, A, B) B##A,
#define VARG_DEF_LIST(N) BOOST_PP_REPEAT(N, VARG_FORMAT, LPXLOPER12 varg) \
LPXLOPER12 varg##N
#define VARG_ARRAY(N) { BOOST_PP_REPEAT(N, VARG_FORMAT, varg) varg##N }
#define GET_VARGS VARG_ARRAY(VARG_COUNT)
__declspec(dllexport) LPXLOPER12 WINAPI array_cons(VARG_DEF_LIST(VARG_COUNT))
{
LPXLOPER12 vargs[] = GET_VARGS;
int args_passed = 0;
for(int i = 0; i < VARG_COUNT; ++i, ++args_passed)
{
if (vargs[i]->xltype == xltypeMissing)
{
break;
}
}
if (args_passed == 0)
{
XLOPER12 err;
err.xltype = xltypeErr;
err.val.err = xlerrValue;
return (LPXLOPER12)&err;
}
XLOPER12 list;
list.xltype = xltypeMulti;
list.val.array.lparray = (XLOPER12*)vargs;
list.val.array.rows = args_passed;
list.val.array.columns = 1;
return (LPXLOPER12)&list;
}
最佳答案
我想通了。这里有几点需要注意 -
您需要确保您的 UDF 注册使用了正确的签名。在我的例子中,我希望 Excel 引用给我它们各自的值,所以我在注册函数时使用了 Q
类型。如果你不明白这一点,请查看http://msdn.microsoft.com/en-us/library/office/bb687869.aspx
为了返回数组,您必须动态分配新内存给 list.val.array.lparray
成员并迭代填充它。
__declspec(dllexport) LPXLOPER12 WINAPI array_cons(VARG_DEF_LIST(VARG_MAX)) {
LPXLOPER12 vargs[] = GET_VARGS;
int args_passed = 0;
for(int i = 0; i < VARG_MAX; ++i, ++args_passed) {
if (vargs[i]->xltype == xltypeMissing) {
break;
}
}
XLOPER12 list;
list.xltype = xltypeMulti | xlbitDLLFree;
list.val.array.lparray = new XLOPER12[args_passed];
list.val.array.rows = args_passed;
list.val.array.columns = 1;
for(int i = 0; i < args_passed; ++i) {
list.val.array.lparray[i] = *vargs[i];
}
return &list;
}
因为我们是动态分配内存,所以我们需要定义回调来释放它。
__declspec(dllexport) void WINAPI xlAutoFree12(LPXLOPER12 p) {
if (p->xltype == (xltypeMulti | xlbitDLLFree)) {
delete [] p->val.array.lparray;
}
}
关于c++ - 如何从 XLL UDF 返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14301998/
我正在使用 ExcelDna 和 NetOffice 为 Excel 构建插件。 Excel 中的插件可以安装并包含在每个 Excel session 中,也可以通过打开 xll 文件临时打开。 我有
我用 XLW 创建 *.xll库。但它仅适用于构建计算机。如果我在其他计算机上重建我的项目,xll 可以在它上面工作,但不是我的计算机。任何人都有这个问题的想法。 最佳答案 这听起来像是一个经典案例,
我已经在 SO 上查看了许多有关 XLL 和数组的线程,但我现在比以往任何时候都更加困惑。抱歉,如果以下内容完全是菜鸟,但这就是我来这里的原因...... 有人告诉我,不可能编写可以返回任意数据数组的
我编写了一个包含菜单的小型 XLL 插件 (VS2010 VC++/Excel 2007)。它已正确注册(使用加载项管理器查看),但当我打开 Excel 工作簿(.xlsb)时,菜单未显示。每次打开工
我正在尝试为 xll 格式的 Excel 加载项自动执行一些测试。我在加载 xll 时遇到了一些问题。我正在用 C# 编写它,我的代码如下所示: using Microsoft.Office.Inte
我习惯了this使用 C++ 为 Excel 构建 XLL 的示例。我创建了自己的函数,它接受 2 个双参数并返回字符串: __declspec(dllexport) LPXLOPER12 WINA
使用 Excel 的 C API 创建 XLL 时,如何指定返回范围的 XLL 中定义的工作表函数应该溢出? 我知道在使用 xlfRegister 注册函数时,我可以通过指定“Q”作为返回类型来返回一
我们有一个我们在 excel 中注册的第 3 方 excel 插件。现在,我们如何查看该 .xll 中可用的所有函数和方法列表。 另外,我们可以看到 .xll 文件中的 vba 代码吗? 我正在使用
如何以编程方式注册 XLL 插件? 最佳答案 Application.RegisterXLL为我工作 关于excel - 如何以编程方式注册 XLL 插件?,我们在Stack Overflow上找到一
Excel“日期”是引擎盖下的 double ,XLOPER结构似乎没有任何日期概念,只有xltypeNum(与VBA中的变体不同)。 我有一个简单的 XLL,其函数不接受任何参数,将今天的日期作为
我有一个 xll(一个相当复杂的 c++ 项目)导出一个函数,由于历史原因,该函数采用大量参数,恰好是 20。 这是一个神奇的数字:显然在 Excel 2003 中参数的最大数量为 30(“在 Mic
我是编写 XLL 的新手,有人知道如何将 6x1 数组返回到 Excel 吗? 以下是我的函数(部分代码来自其他帖子): __declspec(dllexport) LPXLOPER12 WINAP
基本上试图在 C++ 中复制以下 VBA 代码 I don't want my Excel Add-In to return an array (instead I need a UDF to cha
我有一个 Excel XLL 插件,它会导致某些计算机上的 Excel 崩溃。为了排除故障,我在 DllMain 中添加了此调用: SetUnhandledExceptionFilter(MyExce
是否可以在没有原始源代码的情况下查看 XLL Excel 插件的源代码?我猜测这个 XLL 是用 C# 编写的,但不确定。 IE。可以使用 dotPeek 反编译的 .NET DLL,或者可以通过 D
我使用的是 Excel 2010 和 Excel 2010 XLL SDK。我尝试使用此功能: __declspec(dllexport) LPXLOPER12 WINAPI dfutil(void)
我有一个用于 Excel 的 C++ .xll 插件。以下测试工作表函数在加载的 xll 下运行良好: LPXLOPER __stdcall Test() { return &xlstring
在 XLW library 的帮助下,我正在使用 C++ 为 Microsoft Excel 编写一个 .XLL 插件.我的操作系统是windows 7 64位版本,内存32GB;但我的 Excel
我用 visual studio 2010 和 excel 2010 开发了一个 xll。它在安装了 visual 的计算机上的 excel 上运行良好。但是现在,我正尝试在未安装 visual 的计
任何人都可以给我一些链接或解释如何从 DLL 构建 XLL(用于 Excel)吗? 我不能使用 Visual C++,所以我依赖 CodeBlocks + GCC。 到目前为止,我已经有了源代码并从中
我是一名优秀的程序员,十分优秀!