在 Excel 中编写自定义函数的指南:第二部分 自动化加载项





0/5 (0投票)
自动化加载项
引言
在前一篇文章中,我们介绍了如何使用 VBA 编写可在 Excel 公式中使用的自定义函数。 VBA 具有简单快捷的优势。 自动化加载项是另一种选择,如果对 C++ 编程有所了解,也很容易。 可以使用其他语言,例如 VB、Delphi 或 C#,但在本文中,我们将使用 C++。
在 Visual Studio 中创建 ATL 项目
正如您所期望的那样,第一步是创建一个项目。 从菜单中选择“文件”->“新建”->“项目”,这将弹出“新建项目向导”。 然后选择“其他语言”、“Visual C++”,然后选择“ATL 项目”(参见图 1 和图 2)。
图 1:选择“ATL 项目”模板。
图 2:对于“应用程序设置”,保留默认值。
添加一个将包含 UDF 的 ATL 类
现在我们有了一个 ATL 项目,我们添加一个类,其中将包含用户定义的电子表格函数。 从类视图中,右键单击“CagrAutoExample
”,然后选择“添加”,然后选择“类”。向导很简单,只需在第二页选择一个名称,并在第三页将聚合更改为 no(参见图 3-5)。
图 3:添加一个 ATL 简单对象。
图 4:为新类选择一个名称。
图 5:将“聚合”更改为 No。 保留其余的默认值。
定义 CAGR 函数
接下来,我们将定义要实现的新函数。 返回“类视图”,右键单击接口 IFinanicalFuncs
,然后选择“添加”,然后选择“添加方法…”。 定义一个新函数,名称为 CAGR,有四个参数(如图 6 和 7 所示)
参数属性 | 参数类型 | 参数名称 |
---|---|---|
[输入] | DOUBLE * | BeginningValue(起始值) |
[输入] | DOUBLE * | EndingValue(结束值) |
[输入] | DOUBLE * | NumberOfYears(年数) |
[retval] | DOUBLE * | 结果 |
图 6:添加方法对话框。
图 7:IDL 属性。 将所有内容保留为默认值。
实现 CAGR 函数
现在我们已经在接口中定义了该方法,是时候编写 CAGR 函数的代码了。 CAGR 的定义如下
打开 FinancialFuncs.cpp 并将其更改为如下所示
// FinancialFuncs.cpp : Implementation of CFinancialFuncs
#include "stdafx.h"
#include "FinancialFuncs.h"
#include <cmath />
// CFinancialFuncs
STDMETHODIMP CFinancialFuncs::CAGR(DOUBLE* BeginningValue,
DOUBLE* EndingValue, DOUBLE* NumberOfYears, DOUBLE* Result)
{
*Result = pow(*EndingValue / *BeginningValue, 1.0 / *NumberOfYears) - 1.0;
return S_OK;
}
注册 DLL!
现在尝试使用 regsvr32 注册 DLL(例如,在命令提示符下,转到项目文件夹内的调试文件夹并键入“regsvr32 CagrAutoExample.dll”)。 它将显示一条错误消息,错误代码为 0x80070716(图 8)。
图 8:尝试注册 dll 时的错误消息。
幸运的是,这个问题很容易解决。 转到资源视图并右键单击“CagrAutoExample.rc”。 从菜单中选择“资源包含”。 在对话框中,将“Resource.h”添加到“只读符号指令”部分,如图 9 所示。
图 9:Visual Studio 没有添加 include,所以我们自己来添加。
现在重新构建并再次注册。 这次,您应该会获得成功,如图 10 所示。
图 10:只需将“Resource.h”添加到“CagrAutoExample.rc”即可解决注册问题。
在 Excel 中进行测试
启动 Excel,转到“开发人员”选项卡,单击“加载项”,然后单击“自动化…”按钮。 将出现已注册的自动化服务器的列表。 在列表中找到“FinancialFuncs
”类,单击它,然后单击“确定”(图 11)。 自定义 CAGR
函数现在将可用。
图 11:在 Excel 中加载自动化服务器。
接下来输入几个数字并试用新公式(图 12)。 它也将出现在函数向导的“CagrAutoExample.FinancialFuncs.1
”类别下。
图 12:函数向导中的 CAGR。
结论
自动化加载项与 C++ Excel 加载项一样简单,但它有非常大的缺点,这使得它与其它选项相比是一个糟糕的选择。 无法选择类别名称并被困在“CagrAutoExample.FinancialFuncs.1
”中并不理想。 无法在函数向导中记录该函数也是一个问题,如果自定义函数看起来像内置函数并且行为也像内置函数就好了。 从性能上讲,自动化加载项比 XLL 慢,而且它们在 XLL 方面没有任何独特的优势,因此使用它们的唯一真正优势是节省编写几行代码。
下载
该文件包含 Visual Studio 2010 解决方案中的示例代码。