【问题标题】:VBA Runtime Error 9 (Excel 2007)VBA 运行时错误 9 (Excel 2007)
【发布时间】:2017-09-25 11:09:26
【问题描述】:

我遇到了以下问题。我正在创建一个带有活动 x 元素的 excel 工作表来计算几个值(对于大学的一个班级)。在下面的代码中,我有时(不是每次都)得到索引超出范围的运行时错误 9(希望我将其正确翻译成英文)。我是 vba 的新手。我知道已经问过几个类似的问题,但是我有一个很大的问题来适应我的代码的解决方案,因为我并不真正了解我的代码中的问题以及他们问题的解决方案。

我用星号标记了发生错误的行。

如果有人能解释一下为什么有时会在我的代码中出现这个问题以及如何正确解决它,我将非常感激。 提前谢谢你。

代码如下:

Sub calcinull()
Dim ione(4), itwo(4), ii, ints(4), cs(4), io, it As Double
Dim a, b, c As Double

ione(0) = 0
ione(1) = 10
ione(2) = 20
ione(3) = 30
ione(4) = 40

itwo(0) = 100
itwo(1) = 90
itwo(2) = 80
itwo(3) = 70
itwo(4) = 60


For b = 0 To 4
    ii = ione(b) + (((itwo(b) - ione(b)) * (NPV(ione(b))) / (NPV(ione(b)) - NPV(itwo(b)))))
    ints(b) = ii
    cs(b) = NPV(ii)
Next b

Dim AbsInt(4), AbsCs(4) As Double

For a = 0 To 4
    AbsInt(a) = VBA.Abs(ints(a))
    AbsCs(a) = VBA.Abs(cs(a))
Next a

Dim pos As Integer

pos = Application.Match(Application.Min(AbsCs), AbsCs, 0)

*ii = ints(pos)*

If NPV(ii) > 0 Then
    io = ii
    If pos > 0 Then
        it = itwo(pos - 1)
    Else
        it = itwo(0)
    End If
ElseIf NPV(ii) < 0 Then
    it = ii
    If pos > 0 Then
        io = ione(pos - 1)
    Else
        io = ione(0)
    End If
ElseIf NPV(ii) = 0 Then
    inull = ii
End If

For c = 1 To 30
    Do Until (NPV(io) - NPV(it)) <> 0
        io = io - 0.1
        it = it + 0.1
    Loop
        ii = io + (((it - io) * (NPV(io)) / (NPV(io) - NPV(it))))
        If NPV(ii) > 0 Then
            io = ii
            If it > (io + 0.5) Then
                it = it - 0.5
            End If
        ElseIf NPV(ii) < 0 Then
            it = ii
            If io < (it - 0.5) Then
                io = io + 0.5
            End If
        ElseIf NPV(ii) = 0 Then
            inull = ii
            Exit For
        End If
Next c
inull = ii

End Sub

【问题讨论】:

  • NPV 不需要 2 个参数吗? RateValueArray() ?
  • NPV 是一个 UDF,它需要 Rate 作为变量,因为该变量用于贴现给定的现金流量。正如我所知,我不是那么好并且习惯于 vba,但我真的不知道如何在 NPV 中使用 ValueArray。请你给我解释一下你的想法好吗?非常感谢您。

标签: arrays excel vba range runtime


【解决方案1】:

由于 ints 是一个包含 5 个元素 (0..4) 的数组,因此发生此错误时,pos 可能 > 4。

如果你不知道为什么,可以在Match-Statement 后面加上这样的东西,并在测试时为print 设置一个断点。

if pos < 0 or pos > 4 then
    debug.print pos & " is off"
end if

【讨论】:

  • 好的。这就是问题似乎有点合乎逻辑,但问题是,为什么会发生。尤其是之前的数组(“ints”和“cs”以及“AbsInt”和“AbsCs”)具有相同的长度,因为它们填充在同一个循环中。并且“pos”变量应该只给出 Cs 绝对值的最小值的位置,然后作为回报,我想要这个位置的 Int-Array 的值。我不明白代码做错了什么。 :(
【解决方案2】:

好的,伙计们,我解决了。问题是,数组使用从 0 到 x 的索引,而位置给出了数组的第 n 个位置,这意味着我的“pos”变量总是比数组索引高一个整数。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多