2017-09-25 3 views
0

J'ai le problème suivant. Je crée une feuille de calcul Excel avec des éléments x actifs pour calculer plusieurs valeurs (pour une classe à l'université). Et dans le code suivant, j'ai parfois (pas à chaque fois) l'erreur d'exécution 9 que l'index est hors de portée (j'espère que je l'ai traduit correctement en anglais). Je suis nouveau à vba. Je sais qu'il y a plusieurs problèmes similaires déjà posés mais j'ai un gros problème pour adapter les solutions à mon code car je ne comprends pas vraiment le problème dans mon code comme les solutions de leurs problèmes.Erreur d'exécution VBA 9 (Excel 2007)

J'ai marqué la ligne pour laquelle l'erreur se produit avec des étoiles.

Je serais vraiment reconnaissant si quelqu'un pouvait expliquer, pourquoi ce problème se produit parfois dans mon code et comment le résoudre correctement. Merci d'avance.

Voici le code:

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

Est-ce que «NPV» n'a pas besoin de 2 paramètres? 'Rate' et' ValueArray() '? –

+0

NPV est un FDU qui nécessite le taux comme variable que la variable est utilisée pour actualiser les flux de trésorerie donnés. Je ne suis pas très bon et habitué à vba comme je pourrais le dire, mais je ne vois pas vraiment comment un ValueArray pourrait être utilisé en NPV. Pouvez-vous m'expliquer votre idée, s'il vous plaît? Merci beaucoup d'avance. –

Répondre

0

Comme ints est un tableau avec 5 éléments (0..4), probablement pos est> 4 lorsque cette erreur se produit.

Si vous ne pouvez pas dire pourquoi, mettez quelque chose comme ceci derrière l'état Match et définissez un point d'arrêt sur print pendant le test.

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

Ok. Que ce soit le problème semble logique, mais la question est, pourquoi cela se produit-il. D'autant plus que les tableaux avant ("ints" et "cs" et donc "AbsInt" et "AbsCs") ont la même longueur car ils sont remplis dans la même boucle. Et la variable "pos" devrait simplement donner la position de la valeur minimale des absolus de Cs et ensuite en retour je veux la valeur de l'Int-Array à cette position. Je ne comprends pas ce que le code fait mal. :( –

0

Très bien, je l'ai résolu. Le problème était, que les tableaux utilisent des indices de 0 à x, alors que la position donne la nième position du tableau, ce qui signifie que ma variable "pos" est toujours un entier au-dessus de l'index de tableau.

Merci à tous pour votre aide!