我需要一个更灵活的XIRR前端,它可以结合任意数量的现金流和日期范围,所以我从
开始Public Function vbIRR(ParamArray args())...
以及后面的所有内容都很合适,这样当我打电话时就像
一样=vbIRR(A1:A10,B1:B10)
我得到了一个很好的答案。麻烦的是我的A1:A10的布局可能与执行有效XIRR计算所需的符号相反。我当然可以调整我的VBA,但我通常可以简单地写一下
=vbIRR(-A1:A10,B1:B10)
它不起作用。调试VBA,我可以看到args(0)是“错误2015”。 (我还注意到标准XIRR同样出错了。)
这很奇怪,因为当我查看“fx”(单击函数向导)来验证函数的输入时,我无法分辨出一个与另一个之间的区别(除了所需的符号变化与值之外)第一个范围)。两个调用都显示一个范围作为第一个参数。
任何指针都表示赞赏。谢谢你的阅读。
编辑:问题似乎与Control-Shift-Enter(CSE)有关。我在过去曾多次注意到“fx”似乎对CSE v无关紧要。如果输入CSE,XIRR将返回结果。奇怪(并且恼人地),args(0)的TypeName在此调用中变为“Variant()”(而不是“Range”)。所以我需要一个额外的案例。
答案 0 :(得分:1)
您总是可以在函数中添加另一个参数(在ParamArray之前),指示是否应该取消值。在VBA功能中,您可以完全控制数据,并可以根据该参数进行更改。
参数可以是Boolean
,表示值是否应该被否定,或者它可以是表示乘数的Long
或Double
(在您的情况下为-1)
答案 1 :(得分:1)
当您传递-A1:A10作为参数时,您要求Excel将范围乘以-1并返回一个数组作为参数而不是范围。
所以你要求数组算术,因此需要CSE入口。
结果是一个数组,因此它是一个变体而不是范围:您的VBA需要处理这两种情况:我通常会使用If TypeOF arg is Range then arg=arg.value2
将范围转换为变体。
在功能向导的帮助下,对参数使用了Evaluate,因此它可以透明地处理这两种情况