Boucle infini

Bonjour à tous,

J'ai une macro qui est censé à partir de la rentabilité de titres financiers créer des simulations de portefeuilles. Lorsque je lance celle-ci les simulations sont effectuées mais excel continue de tourner je ne sais pas pourquoi....

voici le code :

Option Base 1

Public VCV_Globale(12, 30) As Double
Public Numéros_Titres() As Byte
Public VCV_PF() As Double
Public x() As Double

Sub Diversification_Naive()
    Worksheets("Titres").Activate
    Call Calc_VCV
    Worksheets("Diversification").Activate

    For Nombre_Titres_PF = 1 To 12
        ReDim Numéros_Titres(Nombre_Titres_PF)
        ReDim VCV_PF(Nombre_Titres_PF, Nombre_Titres_PF)
        ReDim x(Nombre_Titres_PF, 1)

            For Numéro_Simulation = 1 To 30
                Call Crée_Portefeuille(Nombre_Titres_PF)
                Call Calc_VCV_PF(Nombre_Titres_PF)
                Call Crée_Poids(Nombre_Titres_PF)
                'simultanément calcul et stockage de la variance du portefeuille dans la cellule appropriée de "Diversification"
                Cells(Nombre_Titres_PF + 1, Numéro_Simulation + 1).Value = _
                    WorksheetFunction.SumProduct(x, WorksheetFunction.MMult(VCV_PF, x))
            Next Numéro_Simulation

    Next Nombre_Titres_PF

End Sub

Sub Calc_VCV()
    Range("A2").Select
    Set Plage_Ref = Range(Selection, Selection.End(xlDown))
    For i = 1 To 12
        For j = 1 To i
            VCV_Globale(i, j) = WorksheetFunction.covar( _
            Plage_Ref.Offset(0, i), Plage_Ref.Offset(0, j))
            'la matrice de variances-covariances est symétrique, on ne calcule que les valeurs de la partie inférieure qui est complété par la partie supérieure
            ' cov(X,X)= var (X)
            VCV_Globale(j, i) = VCV_Globale(i, j)
        Next j
    Next i
End Sub

Sub Crée_Portefeuille(Nombre_Titres_PF)
    'initialisation à 1  de la ligne du titre à tirer dans la variable tableau Numéro_Titres
    Position = 1
    'correspond au nombre de titres disctincts que contient le portefeuille
    Nombre_Titres_OK = 0
    'tirage aléatoire des titres, et qui est itérée jusqu'à l'obtention du portefeuille comportant le nombre de titres souhaités
    Do
        Randomize
        Titre = Int(Rnd * 12) + 1
        'permet de tester la présence du numéro de l'action tirée à la ligne au dessus parmi celles figurant déjà dans la portefeuille constitué
        Pointeur = 1
        Test = False
        While Pointeur <= Position And Test = False
            If Numéros_Titres(Pointeur) = Titre Then
                Test = True
            End If
            Pointeur = Pointeur + 1
        Wend
        'Intervient dans la condition de ligne9 pour ne pas parcourir tous les éléments de Numéro_Titres dans la cas où le numéro de titre figure déjà dans le PF
        If Test = False Then
        'Si Test reste égal à false après avoir parcouru tous les éléments de Numéro_Titres, le titre est ajouté à ceux figurant déjà dans le PF
            Numéros_Titres(Position) = Titre
            Nombre_Titres_OK = Nombre_Titres_OK + 1
            Position = Position + 1
        End If
    Loop While Nombre_Titres_OK < Nombre_Titres_PF
End Sub

Sub Calc_VCV_PF(Nombre_Titres_PF)
   'Construction de la matrice variance/covariance du portefeuille simulé.
   'Les numéros des titres du PF étant stockés dans la variable Numéros_Titres, on à l matrice variances/covariances du PF avec deux boucles
    For i = 1 To Nombre_Titres_PF
        For j = 1 To i
            VCV_PF(i, j) = VCV_Globale(Numéros_Titres(i), _
            Numéros_Titres(j))
            VCV_PF(j, i) = VCV_PF(i, j)
        Next j
    Next i
End Sub

Sub Crée_Poids(Nombre_Titres_PF)
    'la construction du vecteur poids, il suffit d'affecter à chaque ligne de la variable l'inverse du nombre de titres composants le portefeuille simulé
    For i = 1 To Nombre_Titres_PF
       x(i, 1) = 1 / Nombre_Titres_PF
    Next i
End Sub

Ce que je ne comprends pas, c'est pourquoi malgré le fait que les calculs soient fait et soient juste par la macro, celle-ci continue de tourner sans raison. Je pense que le problème vient de la Sub Crée_Portefeuille(Nombre_Titres_PF) car lorsque que je met celle-ci en commentaire, le tableau de simulations se remplit correctement avec des zéros partout. Et je ne vois pas de boucles infinis (enfin pas de mes yeux de novices en VBA)

Je reste à l'entière disposition des experts voulant bien se pencher sur ce problème

Merci beaucoup

Cordialement,

Bonjour,

Nombre_Titres_OK = Nombre_Titres_OK + 1

Cette ligne qui incrémente la variable qui sert pour la sortie du boucle est à l'intérieur d'un test. A priori, ça vient de là. Cela veut dire, si le test est faux depuis le début, le boucle deviendra un boucle infini.

Par principe, une condition de sortie elle s'incrémente à chaque itération.

Bonjour,

Merci d'avoir pris de ton temps sur ce problème.

Je comprends bien ta réponse, néanmoins les résultats que j'obtiens sont bons et donc la boucle ne devrait pas devenir infini par conséquent.

Il faudrait donc que je sorte l'expression

 Nombre_Titres_OK = Nombre_Titres_OK + 1

de la boucle de tests ? mais dans ce cas je ne saurais plus si les résultats sont probants ou pas ?

cordialement,

Rechercher des sujets similaires à "boucle infini"