1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| Sub Calcul_Aval()
Dim Donnees As Worksheet 'Feuille de travail
Dim Nbreval As Integer 'Mesure de la liste d'éléments élémentaires
Dim i As Integer 'Compteur de boucle
Dim p As Integer 'Compteur de ligne dans le tableau ListeInitial
Dim p1 As Integer 'Compteur de ligne secondaire dans le tableau ListeInitial
Dim q As Integer 'Compteur de colonne dans le tableau (0=père,1=fils, 2=valeur propre, 3=Résultat)
Dim Somme_Aval As Double
Dim ListeInitiale() As String 'Tableau contenant la liste intiale avec les valeurs propres
Set Donnees = Worksheets("DONNEES")
Nbreval = Donnees.Range("A1").End(xlDown).Row - 1
ReDim ListeInitiale(Nbreval, 3) 'Création d'un tableau comprenant le nombre d'éléments élémentaires
'Initialisation des compteurs du tableau initial
p = 0
'Initialisation de la ligne de début de calcul
i = 2
'Remplissage de l'array intial (recopie du tableau initial)
For p = 0 To Nbreval - 1
For q = 0 To 2
ListeInitiale(p, q) = Cells(i, q + 1)
Next q
q = 0
i = i + 1
Next p
'Début du calcul recursif : pour chaque ligne dans le tableau, ie pour chaque BV élémentaire
For p = 0 To (Nbreval - 1)
Variable = ListeInitiale(p, 0)
Somme_Aval = ListeInitiale(p, 2) 'la somme vaut toujours au moins la valeur propre
'Ensuite la somme aval vaut le somme de tous les éléments fils.
p1 = 0 ' on va itérer sur les valeurs des lignes en colonne 2 pour détecter les éléments fils
For p1 = 0 To Nbreval
If ListeInitiale(p1, 1) = Variable Then
'Si on détecte un élément fils, on rapelle la fonction sur cet élément fils
Fils = ListeInitiale(p1, 0)
Somme_Aval = Somme_Aval + Element_aval(Fils, ListeInitiale, Nbreval, p1) 'La somme le résultat de la fonction + la somme déjà calculée
Else
'Si pas d'élement amont on sort de la boucle si (nous sommes au niveau le plus bas)
End If
'On passe alors au prochain BV
Next p1
'On passe au calcul aval du prochain BV (prochaine variable)
'Le calcul est fait, on inscrit la valeur calculée dans l'array
ListeInitiale(p, 3) = Somme_Aval
Next p
'Le calcul de toutes les valeurs est fait, on écrit le résultat à l'aide d'une itération
p = 0
i = 2
For p = 0 To Nbreval
Donnees.Cells(i, 4) = ListeInitiale(p, 3)
i = i + 1
Next p
End Sub
Function Element_aval(Père, ListeValeur, Taille, PosVP)
'Code de définition de la procédure récursive
Dim r As Integer
'Définition de la fonction récursive
For r = 0 To (Taille - 1)
If ListeValeur(r, 1) = Père Then
Fils = ListeValeur(r, 0)
Element_aval = ListeValeur(r, 2) + Element_aval(Fils, ListeValeur, Taille, r)
Else: 'Dans les autres cas on ne fait rien
End If
Next r
End Function |
Partager