IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction récursive en VBA [XL-2010]


Sujet :

Macros et VBA Excel

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur en hydraulique urbaine
    Inscrit en
    Février 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en hydraulique urbaine

    Informations forums :
    Inscription : Février 2011
    Messages : 35
    Par défaut Fonction récursive en VBA
    Bonjour à tous,

    Je vous expose mon problème : je possède une table organisée comme suit :
    • Colonne A : Nom
    • Colonne B : élément parent
    • Colonne C : Valeur


    Chaque éléments de la colonne A a un et un seul élément parent, sauf le "dernier" parent qui n'a personne de renseigné
    En fait je veux faire des calculs en remontant un arbre.

    Dans le détail "pratique" la situation est la suivante : j'ai plusieurs ouvrages dont chacun concerne X habitants. Les ouvrages sont les uns derrière les autres. Ainsi l'ouvrage 1 reçoit les habitants des ouvrages 2 et 3 en plus des siens propres. L'ouvrage 2 reçoit les hab des ouvrages 4 et 5 en plus des siens ... ...
    Le nombre total d'habitants reçu par l'ouvrage 1 est donc :
    • Les habitants en propre sur l'ouvrage 1
    • Les habitants sur l'ouvrage 2 qui sont eux même
      • Les habitants de l'ouvrage 2 en propre
      • Les habitans sur l'ouvrage 4
      • Les habitants sur l'ouvrage 5

    Et ainsi de suite. J'espère être clair dans le description du problème (du point de vue informatique et pratique), sinon n’hésitez pas

    Le but du schmilblik est de faire la somme en remontant l'arbre ainsi créé et d'avoir le nombre d'habitants total sur chaque ouvrage

    Pour être plus clair, je vous ait mis un exemple en fichier (ici 6 éléments). Si l'on fait la somme des valeurs pour le parent DO1 de l'exemple, on doit obtenir 6, 1 pour le DO2 (qui n'a pas d'enfant et à juste sa valeur propre), 4 pour le DO3, 3 pour le DO4, 1 pour le DO5 le DO6 (qui n'ont eux non plus pas d'enfant, juste une valeur propre).
    Ainsi, on remarque que la valeur de DO1 est fonction de la valeur de DO3 qui est fonction de la valeur de DO4 qui est fonction de celle de DO5 et de DO6 ...

    En informatique cela correspond bien à une fonction récursive qui va s'appeler elle même.
    Pour effectuer mon calcul, j'ai mis en place le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Le code tourne mais il me retourne des valeurs erronées et je ne suis pas sur de bien maitriser ce que je fais. Par exemple, il retourne 112 pour DO1, 1 pour DO2, 12 pour DO3, 2 pour DO4 et 1 pour DO5/6.
    Si quelqu'un pouvait me donner un petit coup de pouce ça serait pas mal (d'autant que je ne suis pas sur d'avoir tout fait correctement - je fais tout en autodidacte, grâce à ce forum en majeure partie - et que je ne demande qu'à apprendre).

    Merci d'avance
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6] XML, fonction récursive de recherche
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/04/2006, 21h27
  2. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  3. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  4. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12
  5. Réponses: 1
    Dernier message: 14/10/2005, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo