Excel VBA paramArray并不像-A1:A10

我需要一个更灵活的前端XIRR,可以结合任何数量的现金stream量和date范围,所以我开始

Public Function vbIRR(ParamArray args())... 

以下所有的工作都很好,当我打电话时就好

 =vbIRR(A1:A10,B1:B10) 

我得到了一个很好的答案。 麻烦的是,我的A1:A10的布局可能与执行有效的XIRR计算所需的符号相反。 当然,我现在可以调整我的VBA,但是我应该可以更简单地写下来

 =vbIRR(-A1:A10,B1:B10) 

这是行不通的。 debuggingVBA,我可以看到参数(0)是“错误2015”。 (我也注意到标准的XIRR同样出错了。)

这很奇怪,因为当我看着“fx”(点击函数向导)来validation函数的input时,我无法区分这两者之间的区别(超出了所希望的符号变化到第一个范围的值) 。 两个调用都显示一个范围作为第一个参数。

任何指针赞赏。 谢谢阅读。

编辑:这个问题似乎涉及到控制转换input(CSE)。 过去我多次注意到,“fx”似乎对CSE v E更为无动于衷。如果与CSE一起input,XIRR将返回结果。 好奇地(和恼人地),args(0)的TypeName在这个调用中变成了“Variant()”(而不是“Range”)。 所以我需要一个额外的案例。

您可以随时在函数中添加另一个参数(在ParamArray之前),以指示值是否应该被取反。 在VBAfunction中,您可以完全控制数据,并可以根据该参数进行更改。

该参数可以是一个Boolean指示值是否应该被否定,也可以是代表乘数的LongDouble (在您的情况下,该值为-1)。

当您传递-A1:A10作为参数时,您要求Excel将范围乘以-1,并返回一个数组作为参数而不是范围。

所以你要求数组算​​术,因此需要CSE入口。

结果是一个数组,因此它是一个变体,而不是一个范围:你的VBA需要处理两种情况:我通常做一个If TypeOF arg is Range then arg=arg.value2将范围转换成变体。

在下面的函数向导是使用参数的评价,所以它处理这两种情况透明