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 :

Arborescence a l'aide de noeud


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Par défaut Arborescence a l'aide de noeud
    Bonjour,

    je cherche à faire un arbre binaire ou non sous VBA en utilisant des noeuds. Ce n'est pas pour faire une arborescence de répertoire, ni un arbre généalogique mais simplement organiser et hiérarchiser des données
    J'ai rien trouvé de probant :
    soit a partir d'un tableau
    soit avec Treeview mais si j'ai bien compris je dois utiliser le contrôle treeview (dont je n'ai pas utilité dans ce cas)

    Mais je n'ai pas trouvé une classe de type noeud avec laquelle je pourrais construire mon arbre
    En fait j'imaginais quelque chose du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Type Node
         Gauche as Node
         Droite as Node
         Donnee as MesDonnees
    end Type
    avec des méthodes
    - AjouteNoeud
    - SupprimeNoeud
    - DonneValeur()
    etc....

    Si quelqu'un a une piste que je pourrais exploiter (exemple pouvoir appeler directement la collection Nodes, ....)

    Merci de votre aide.

    Cordialement.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il faudrait en dire un peu plus, à mon avis.
    • Quelles sont les données de départ?
    • Sous quelle forme se présentent-elles?
    • que veux-tu à l'arrivée?
    • ...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Par défaut
    Bonjour,

    Les données de départ sont dans un ListObject que je retravaille.
    Une activité = Ensemble de ligne repéré par un N_Ordre -> nommé activité élémentaire.
    Chaque Ligne = Activité élémentaire qui peut-être relié a une autre par un lien de type prédecesseur (avec un décalage).
    L'objectif est de créer un Arbre (binaire ou non) avec des noeuds pour retrouver la structure :
    Racine : (N_Ordre = 0)
    ------ Activité parents
    ---------- Activité (enfant)
    ---------- Activité (enfant)
    ---------------Activité (feuille)
    ------ etc...

    Le but est de remettre dans l'ordre la logique d’enchaînement des liens entre activités afin de faire les calculs nécessaires dans le bon ordre

    J'espère avoir été plus clair.

    Cordialement.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Peux-tu mettre une copie d'écran de tout ou partie de ton tableau? La présentation "texte" dans le forum ne permet de bien comprendre ce que tu veux dire par "décalage".

    Tu n'as pas dit comment tu voulais retrouver tes données après traitement... Peux-tu donner un exemple?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre averti
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Par défaut
    Bonjour,

    Quand je parle de décalage, il s'agit du décalage de l'activité (lien Fin-Début), rien a voir avec la représentation.

    Nom : 2021-04-15 12_00_03-Outil_Referentiel_V2021_dvlpt.xlsm - Excel.png
Affichages : 635
Taille : 23,2 Ko

    En fait l'attendu est un objet de type ensemble de noeud structuré (cela peut-être un arbre) afin de balayer cet objet pour faire les calculs nécessaire.

  6. #6
    Membre averti
    Homme Profil pro
    interessé par informatique
    Inscrit en
    Novembre 2018
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : interessé par informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 42
    Par défaut
    Bonjour,

    Cela semble répondre à mes attentes....
    Je vais plonger dans le code pour l'adapter à mon usage.
    Merci de m'avoir donner la direction ou je devais travailler.

    Cordialement.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Pour le fun, j'ai créé une classe Element. Je vais créer un élément Root et le peupler avec les données du tableau suivant, puis je supprimerai un des éléments du premier niveau (Sport):

    Nom : 2021-04-15_114845.png
Affichages : 749
Taille : 21,8 Ko


    Voici le code de la classe. J'utilise ici une collection. On aurait pu utiliser un Scripting.Dictionary mais on sort alors du VBA. Un Dictionary ira probablement plus vite sur de grands volumes de données.

    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
    Option Explicit
     
    Public Name As String
    Private mElements As Collection
     
    Function Add(Name As String) As Element
      If Not Exists(Name) Then
        Set Add = New Element
        Add.Name = Name
        mElements.Add Add, Add.Name
      End If
    End Function
     
    Function Delete(Name) As Boolean
      Dim i As Long: i = 1
     
      Do While i <= mElements.Count And Not Delete
        Delete = UCase(mElements(i).Name) = UCase(Name)
        If Delete Then mElements.Remove i
      Loop
    End Function
     
    Function Exists(Name As String) As Boolean
      Dim i As Long: i = 1
     
      Do While i <= mElements.Count And Not Exists
        Exists = UCase(mElements(i).Name) = UCase(Name)
        i = i + 1
      Loop
    End Function
     
    Function getElement(Name As String) As Element
      Dim i As Long: i = 1
     
      Do While i <= mElements.Count And getElement Is Nothing
        If UCase(mElements(i).Name) = UCase(Name) Then Set getElement = mElements(i)
        i = i + 1
      Loop
    End Function
     
    Property Get Elements() As Collection
      Set Elements = mElements
    End Property
     
    Private Sub Class_Initialize()
      Set mElements = New Collection
    End Sub
    Voilà comment je peuplerais mon arbre, puis comment je supprimerais un élément (ici du Root, mais la classe est récursive, dont tu peux supprimer n'importe quel élément de l'arbre lorsque tu connais son parent):
    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
    Sub Test()
      Dim Root As Element
      Dim Item As Element, SubItem As Element, SubSubItem As Element
      Dim i As Long
     
      Set Root = New Element
      Root.Name = "Racine"
      For i = 1 To Range("t_Data").Rows.Count
        Set Item = Root.getElement(Range("t_Data[Catégorie]")(i).Value)
        If Item Is Nothing Then Set Item = Root.Add(Range("t_Data[Catégorie]")(i).Value)
        Set SubItem = Item.getElement(Range("t_data[Sous-Catégorie]")(i).Value)
        If SubItem Is Nothing Then Set SubItem = Item.Add(Range("t_data[Sous-Catégorie]")(i).Value)
        Set SubSubItem = SubItem.getElement(Range("t_data[Elément]")(i).Value)
        If SubSubItem Is Nothing Then SubItem.Add (Range("t_data[Elément]")(i).Value)
      Next
     
      Root.Delete "Sport"
    End Sub
    Ici, on voit le Root peuplé de toutes les données, puis après la suppression de l'élément Sport

    Nom : 2021-04-15_115324.png
Affichages : 640
Taille : 133,5 Ko

    Nom : 2021-04-15_115357.png
Affichages : 627
Taille : 17,4 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. [XSLT] noeud à plat >> arborescence
    Par theos dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 24/11/2008, 10h09
  2. Réponses: 3
    Dernier message: 06/04/2007, 15h32
  3. [C#] A l'aide! comment faire pour modifier un noeud?
    Par irnbru dans le forum Windows Forms
    Réponses: 12
    Dernier message: 15/11/2005, 17h41
  4. Pb d'Ajout un noeud fils dans une arborescence
    Par oramine dans le forum Oracle
    Réponses: 5
    Dernier message: 21/12/2004, 15h39
  5. [XSL] aide pour lire un id de noeud enfant.
    Par stebar dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 01/07/2004, 13h38

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