2017-09-25 28 views
0

私は次の問題があります。私はいくつかの値を計算するためにアクティブなx要素を持つExcelワークシートを作成しています(大学のクラス用)。そして、次のコードでは、時々(毎回ではなく)実行時エラー9が発生し、インデックスが範囲外になっています(うまくいけば、正しく英語に翻訳されました)。私はvbaに新しいです。私はすでにいくつかの同様の問題があることを知っているが、私は実際に自分の問題の解決策としても私のコードのいずれかを理解していないので、私のコードにソリューションを適応させる巨大な問題があります。VBAランタイムエラー9(Excel 2007)

私は星でエラーが発生した行をマークしました。

私のコードでこの問題がなぜ発生するのか、それを正しく解決する方法について、誰かが説明できると本当に感謝します。 ありがとうございます。

ここでは、コードは次のとおりintsとして

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 
+0

「NPV」は2つのパラメータを必要としませんか? 'Rate'と' ValueArray() '? –

+0

NPVは、与えられたキャッシュフローを割り引くために変数を使用するため、レートを変数として必要とするUDFです。私はそれほど良くはなく、私が知ることができるようにvbaに慣れていましたが、ValueArrayをNPVでどのように使うことができるか分かりません。私にあなたのアイデアを説明できますか? ありがとうございます。 –

答えて

0

は、このエラーが発生した場合、おそらくposは> 4であり、5つの要素(0..4)の配列です。

理由がわからない場合は、Matchのステートメントの背後にこのようなものを置き、テスト中にprintにブレークポイントを設定します。

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

よろしくお願いします。これが問題なのは何とか論理的ですが、問題はなぜ起こるのかということです。特に、前の配列( "ints"と "cs"、したがって "AbsInt"と "AbsCs")は、同じループ内に埋め込まれているのと同じ長さを持ちます。そして、 "pos"変数は、Cの絶対値の最小値の位置を与えるだけで、その代わりに、この位置にInt-Arrayの値が必要です。コードが間違っていることは分かりません。 :( –

0

いいえ、私はそれを解決しました。問題は、配列は0からxまでのインデックスを使用しますが、位置は配列のn番目の位置を示します。つまり、my "pos"変数は常に配列インデックスの1つの整数です。

ありがとうございました!

関連する問題