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 :

[VBA-E] Construction d'un arbre d'appels


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut [VBA-E] Construction d'un arbre d'appels
    Bonjour,

    Je me retrouve face à un petit problème, j'espère que vous saurez m'indiquer une direction…

    Voici la feuille Excel que j'ai en entrée ( chaque chaine se trouve dans une cellule à partir de la A1 ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Chaine3	Chaine4
    Chaine3	Chaine7
    Chaine1	Chaine2
    Chaine1	Chaine3
    Chaine6	Chaine5
    Chaine6	Chaine3
    Chaine5	Chaine4
    Chaine5	Chaine7
    Chaine7	Chaine8
    Chaine7	Chaine9

    Et voici la feuille Excel que je dois obtenir en sortie ( partir de la cellule A1 toujours ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Chaine1 Chaine2
    ....... Chaine3 Chaine4
    ............... Chaine7 Chaine8
    ....................... Chaine9
    Chaine6 Chaine5 Chaine4
    ............... Chaine7 Chaine8
    ....................... Chaine9
    ....... Chaine3 Chaine4
    ............... Chaine7 Chaine8
    ....................... Chaine9

    En gros, cela signifie que la Chaine1 appelle la Chaine2 ainsi que la Chaine3, qui elle-même appelle les chaines 4 et 7 etc.

    J'imagine qu'il faut utiliser la fonction Find … ? Mais je n'en sais pas plus, je suis perdu dans l'algorithme déjà…

    Merci d'avance pour l'aide que vous pourrez m'apporter !

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je verrais bien deux boucles do while imbriquées, la première parcourant les lignes de la colonne Col1 (A au départ), incrémentée à chaque sortie de la seconde boucle, seconde boucle parcourant les lignes de la colonne Col2 (B au départ) incrémentée pour chaque nouvelle valeur de Col1.
    La sortie de boucle ?
    Boucle 2 : Quand il n'y a plus rien dans la colonne pour la valeur trouvée en Col1
    Boucle 1 : Quand dernière ligne et Boucle2 finie
    Si tu arrives à me comprendre, t'es mûr !

    Juste une idée, tu as bien compris

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonsoir


    Les données dans le tableau sont supposées déja triées.
    Je n'ai pas testé tous les cas de figure mais tu peux deja essayer cette premiere version:


    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
    Dim Cell As Range
    Dim Ws1 As Worksheet, Ws2 As Worksheet
    Dim Plage As Range
    Dim i As Integer, x As Integer
    Dim Cible As Integer
     
    'La feuille qui contient le tableau
    Set Ws1 = Worksheets("Feuil1")
    'La feuille qui va recevoir l'arborescence
    Set Ws2 = Worksheets("Feuil2")
    Ws2.Cells.Clear
     
    'La premiere ligne est reprise automatiquement
    Ws2.Range("A1:B1").Value = Ws1.Range("A1:B1").Value
     
     
    'Boucle sur la colonne A du tableau
    For Each Cell In Ws1.Range("A2:A10")
     
        'recupere le numero de la derniere ligne non vide dans la Feuil2
        i = Ws2.Range("A1").CurrentRegion.Rows.Count
     
        'Boucle sur les lignes de la Feuil2
        For x = 1 To i
            'Definit la plage qui contient des données
            Set Plage = Ws2.Range(Ws2.Cells(x, 1), _
                Ws2.Cells(x, Ws2.Cells(x, 1).End(xlToRight).Column))
     
            On Error Resume Next
            'Verifie si le noeud existe deja
            Cible = Application.WorksheetFunction.Match(Cell, Plage, 0)
            On Error GoTo 0
     
            'si l'element (le noeud) est trouvé
            If Cible > 0 Then
     
                'Verifie si le noeud possède deja des enfants
                If Cible = Ws2.Cells(x, 1).End(xlToRight).Column Then
                    's'il n'y a pas d'enfant
                    Ws2.Cells(x, Cible + 1) = Cell.Offset(0, 1)
     
                    Else
                    'S'il y a deja des enfants:
                    'Ajoute une ligne
                    Ws2.Rows(x + 1).Insert Shift:=xlShiftDown
     
                    Ws2.Cells(x + 1, Cible + 1) = Cell.Offset(0, 1)
                    Ws2.Range(Ws2.Cells(x + 1, 1), Ws2.Cells(x + 1, Cible)) = " "
                End If
     
                Exit For
            End If
        Next x
     
        'Si l'element n'a pas ete trouvé dans l'arborescence
        If Cible = 0 Then
            Ws2.Cells(i + 1, 1) = Cell
            Ws2.Cells(i + 1, 2) = Cell.Offset(0, 1)
        End If
     
        Cible = 0
        Set Plage = Nothing
     
    Next Cell


    michel

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut
    Merci à tous les deux pour votre réponse de qualité

    Ta solution Michel est pas mal du tout mais je n'arrive pas à l'adapter pour mon cas...

    Disons que j'ai cette entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Chaine3	Chaine4
    Chaine3	Chaine7
    Chaine1	Chaine2
    Chaine1	Chaine3
    Chaine6	Chaine5
    Chaine6	Chaine3
    Chaine5	Chaine4
    Chaine5	Chaine7
    Chaine7	Chaine8
    Chaine7	Chaine9
    Je devrais obtenir en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Chaine1 Chaine2
    ....... Chaine3 Chaine4
    ............... Chaine7 Chaine8
    ....................... Chaine9
    Chaine6 Chaine5 Chaine4
    ............... Chaine7 Chaine8
    ....................... Chaine9
    ....... Chaine3 Chaine4
    ............... Chaine7 Chaine8
    ....................... Chaine9
    Or ton programme me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Chaine3 Chaine4
    ....... Chaine7 Chaine8
    ............... Chaine9
    Chaine1 Chaine2
    ....... Chaine3 
    Chaine6 Chaine5
    ............... Chaine4
    ............... Chaine7
    ....... Chaine3

    En gros, lorsqu'on parcourt les cellules de la première colonne, s'il s'avère que l'une d'entre elles se trouve aussi dans la seconde colonne, cela signifie que cette chaine est de second niveau, et doit donc être inscrite dans la colonne cible + 1, et non la colonne cible

    J'ai pensé à un algorithme de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Pour chaque cellule de la première colonne
     
    	Chercher cette cellule dans la seconde colonne
     
    		Si trouvée
    			Alors cette celulle est de second niveau, donc on ne l'écrit pas encore
    		Si non trouvée
    			Alors écrire cette cellule dans la colonne cible de la seconde feuille
    			      écrire sa celulle adjacente dans la colonne cible adjacente de la seconde feuille						
    		FinSi
     
    	Passage à la cellule de la première colonne suivante
     
    FinPour
    Qu'est-ce que vous en pensez ? Avez-vous une idée d'une adaptation du code de Michel ?

    J'ai planché dessus toute la journée et j'avoue sécher complètement ...

    Merci d'avance !

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Avant je m'y colle, j'aurais besoin de savoir si, avec ta série,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Chaine3	Chaine4
    Chaine3	Chaine7
    Chaine1	Chaine2
    Chaine1	Chaine3
    Chaine6	Chaine5
    Chaine6	Chaine3
    Chaine5	Chaine4
    Chaine5	Chaine7
    Chaine7	Chaine8
    Chaine7	Chaine9
    tu dois bien avoir
    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
    Chaine3	Chaine4
    	Chaine7	Chaine8
    		Chaine9
     
    Chaine1	Chaine2
    	Chaine3	Chaine4
    		Chaine7	Chaine8
    			Chaine9
    Chaine6	Chaine5	Chaine4
    		Chaine7	Chaine8
    			Chaine9
     
    Chaine5	Chaine4
    	Chaine7	Chaine8
    		Chaine9
     
    Chaine7	Chaine8
    	Chaine9
    Si je mé trompé alors jé rien compris
    Tu dis
    A+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut
    Non ce n'est pas ce que j'attends de cette série : vu que Chaine3 se trouve aussi dans la deuxième colonne, ce n'est pas une racine. Il ne doit donc pas se trouver en première colonne de ma feuille de sortie.
    J'ai précisé deux posts plus haut ce que j'attends avec cette série

    J'avoue que je suis complètement perdu avec cette récursivité

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/01/2007, 11h22
  2. [Lisp] Construction d un arbre n-aire
    Par Treuze dans le forum Lisp
    Réponses: 5
    Dernier message: 19/11/2006, 19h22
  3. Arbre binaire appel recursive
    Par wedoud dans le forum C
    Réponses: 14
    Dernier message: 03/08/2006, 20h31
  4. cherche algorithme de construction d'un arbre
    Par Invité(e) dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/05/2006, 11h04
  5. cherche algorithme de construction d'un arbre
    Par Invité(e) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/05/2006, 12h28

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