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 de collections


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 156
    Par défaut Fonction récursive de collections
    Rebonjour,

    Après avoir découvert l'avantage des collections sur les tableaux, je suis face à un nouveau problème sur une fonction récursive.

    En effet, j'ai ça:

    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
    Function f_recursive(treeElement as Elements) as Collection
    
    Dim dataCollection as New Collection
    
    For each element in treeElement
    'treeElement et elements sont dans une structure arborescente
    'd'un autre programme
    
    Dim newData as New element
    
    dataCollection.add newData
    
    newData =  element
    
    If element.a_des_sous_elements = True Then
    
        f_recursive(element.treeElement)
    
    End If
    
    f_recursive = dataCollection
    
    end function
    La fonction marche mais le résultat obtenu n'est pas bon: la fonction répète le dernier élément de chaque groupe de sous-éléments.
    En gros, il semble que ça ne crée pas de sous éléments et qu'il n'y ait pas de réinitialisation dans le For.

    Merci d'avance pour votre aide,

    Nicolas

  2. #2
    Membre éclairé Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Par défaut
    Hello, j'ai deux idées sur ton problème :

    1e supposition

    Citation Envoyé par Nico820 Voir le message
    Function f_recursive(treeElement as Elements) as Collection
    [...]
    newData = element
    [...]
    f_recursive(element.treeElement)
    à mon humble avis, tu passes la valeur de la collection et pas l'objet lui même.
    Est-ce que ce ne serait pas possible de rajouter un byRef ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function f_recursive(byRef treeElement as Elements) as Collection
    2eme supposition

    Dim newData as New element
    dataCollection.add newData
    newData = element
    - essaie d'inverser les deux lignes, comme ca tu assignes un NOUVEL élément et pas le dernier en date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim newData as New element
    newData =  element
    dataCollection.add newData

    Ce que je marque ici est purement "du feeling", je ne peux pas tester et donc vérifier... c'est juste pour faire avancer le schmiilblick...


    Nico

  3. #3
    Membre éclairé Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Par défaut
    Bonjour (Re),

    Je suis de l'avis de la proposition 2 sans pouvoir la tester non plus mais je ferais plus cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For each element in treeElement
    'treeElement et elements sont dans une structure arborescente
    'd'un autre programme
     
    Dim newData as New element
     
    dataCollection.add newData
     
    newData =  element
    Pour moi, on ne peux pas redéfinir un élément ajouter dans la collection donc il faut le faire avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For each element in treeElement
    'treeElement et elements sont dans une structure arborescente
    'd'un autre programme
     
    Dim newData as New element
     
    newData =  element
    dataCollection.add newData
    Exemple a tester pour vérifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim collec as New Collection
    dim i as integer
     
    i=2
     
    collec.add i
     
    i=3
     
    msgbox collec(1) 'à 99% sur de moi sa renvoi "2" et non 3
    tiens moi au courant

    Bastien

  4. #4
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 156
    Par défaut
    Merci beaucoup Bastien et Nicopilami

    J'ai testé la seconde option, qui est celle qui pose problème:
    toujours le même résultat. VB6 ne semble pas utiliser le "New" lors de la déclaration de la classe element et utilise le même objet dans la collection.
    Par contre, il prends en compte le "New" quand il fait appel à la fonction récursive
    Peut-on faire du "ByRef" dans la déclaration de la classe element??
    Comment s'assurer si l'element nouveau est différent de l'antérieur?

    Merci d'avance pour vos réponses,

    Nicolas

  5. #5
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 156
    Par défaut
    J'ai trouvé le bug!

    C'était au niveau de la déclatation de la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            Dim currentElement As Element
            Set currentElement = New Element
    Pour les futurs galèriens de l'informatique, la fonction parfaite qui groupe les idées de Nico et Bastien:

    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
    
    Function f_recursive(ByRef treeElement as Elements) as Collection
    
    Dim dataCollection as New Collection
    
    For each element in treeElement
    'treeElement et elements sont dans une structure arborescente
    'd'un autre programme
    
    Dim newData as element
    Set newData = New element
    
    newData =  element
    dataCollection.add newData
    
    If element.a_des_sous_elements = True Then
    
        f_recursive(element.treeElement)
    
    End If
    
    f_recursive = dataCollection
    
    end function

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

Discussions similaires

  1. fonction récursive: erreur
    Par calla29 dans le forum Débuter
    Réponses: 3
    Dernier message: 16/05/2006, 11h51
  2. [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
  3. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  4. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  5. 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

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