【问题标题】:IRR double type array conversion from a variant type从变体类型转换 IRR 双精度类型数组
【发布时间】:2020-07-05 21:35:02
【问题描述】:

抱歉,由于我是 VBA 新手,所以这个问题很愚蠢。

问题一开始就出现了,因为 excel IRR 无法计算模拟中的变化列(仅计算初始值而不是以下循环中的值)。所以我选择了VBA IRR函数,但是它的双数组要求似乎是另一个主要问题。

当我尝试将范围读入变量数组,并以某种方式将每个数组元素转换为双精度类型,然后在 VBA IRR 函数中使用它们时,代码仍然显示“类型不匹配”。我也尝试过数组,但同样的错误结果。

有没有办法让工作表 IRR 与更改的单元格一起工作,或者将变体数组转换为使 VBA IRR 工作的双精度数?

代码如下:

Dim va As Variant 

Dim va_d As Double

va = Worksheets(3).Range("AY16:AY136").Value 

va_d = CDbl(va)

Worksheets(3).Range("H7").Value = IRR(va_d)

【问题讨论】:

  • 在您发布的代码中,您试图获取一个范围并存储在数组va(变体)中并将该数组中的所有项目更改为双倍? va_d 是否试图获得一个双精度数组?
  • 是的,正是我想要做的。
  • 如果我没记错的话,您会收到错误“类型不匹配”,因为您想将整个数组变成双字段。
  • va 中的范围是否已经有 double 值?

标签: excel vba irr


【解决方案1】:

可能有比这更优雅的方法,但此示例在计算结果之前遍历源数据范围并将值转换为双精度数组:

Option Explicit

Public Sub CalcVBAIRR()

    Dim SourceRange As Range
    Dim SourceCell As Range
    Dim TargetRange As Range
    Dim va() As Double
    Dim Counter As Long
    
    Set SourceRange = Worksheets(3).Range("AY16:AY136")
    Set TargetRange = Worksheets(3).Range("H7")

    ReDim va(SourceRange.Cells.Count)

    Counter = 0
    For Each SourceCell In SourceRange
        va(Counter) = CDbl(SourceCell.Value)
        Counter = Counter + 1
    Next
    
    TargetRange.Value = IRR(va)

End Sub

还有一个函数版本...

Public Function CalcIRR2(SourceRange As Range) As Double

    Dim SourceCell As Range
    Dim va() As Double
    Dim Counter As Long
    
    ReDim va(SourceRange.Cells.Count)

    Counter = 0
    For Each SourceCell In SourceRange
        va(Counter) = CDbl(SourceCell.Value)
        Counter = Counter + 1
    Next
    
    CalcIRR2 = IRR(va)

End Function

示例输出:

【讨论】:

  • 您好 TechnoDabbler,感谢您的反馈。但是,它仍然不适用于“无效的过程调用或参数”错误。我仔细检查了范围的第一个元素是负数,这是 IRR 函数所要求的,所以很确定这些值在要求的范围内。你知道为什么 IRR 仍然不起作用吗?谢谢!
  • 我用 120 个值重新测试了代码并且它工作正常,因此我们可以推断错误不是“无效的过程调用”,而更可能是“无效的参数”。当您检查第一个值为负数时,逻辑会说问题出在 AY17:AY136 范围内的一些数据上。我已经添加了上述代码的函数版本以直接使用。我可以建议您在一些简单/新的测试数据上运行它吗?如果可行,请在主数据集上使用它。如果它在主数据集上不起作用,则将每次输入的数据量减半,以查明触发错误的数据。
  • 谢谢!我会尝试一次输入一些新数据。
  • 您好,我试过了,我们创建的 IRR VBA 函数在 IRR 结果接近 -1 或 0 时不起作用,即当以下现金流与初始投资相比太小时。跨度>
  • 幸运的是,我碰巧发现 excel 工作表函数 IRR 确实适用于我的数据集,但仅适用于最初的 100 个现金流,而不是涵盖我拥有的全部 120 个数据。到目前为止,这对我的工作是可行的。试图找出为什么 IRR 有时有效但有时无效的原因非常困难。无论如何,谢谢你的回答!它肯定证实了 IRR(迭代或其他东西)无法处理某些看起来完全正常的数据的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多