Structure en Arbre n-aire en VBA

tototiti2008

XLDnaute Barbatruc
Bonjour à toutes et tous,

J'ai pensé à essayer de reproduire certaines structures classiques de programmation en VBA, et je me suis intéressé aux arbres (n-aires), c'est à dire simplement la représentation d'une hiérarchie parent-enfants, quel que soit le nombre d'enfants et quel que soit le nombre de niveaux (petits-enfants, etc...)
Je voulais savoir si vous aviez connaissance de quelque chose d'existant sur le sujet (éviter de réinventer la roue ;)) ou une piste de structuration de ce type de hiérarchie

Le but sera ensuite de rendre cette structure assez souple (possibilité d'ajouter/supprimer des branches de la hiérarchie, facilités de parcours des branches, recherche...etc)

Merci
 
Dernière édition:

Orodreth

XLDnaute Impliqué
Re : Structure en Arbre n-aire en VBA

Bonjour,

Un modèle qu'un collègue à moi avait utilisé dans une de mes anciennes boites peut se traduire ainsi:

Depuis la racine, un élément possède un parent (au début de l'arbre, le parent est racine ou null), puis possède un fils (dont il devient le parent), et enfin un frère.
On fait le lien du parent avec le frère en passant par le premier élément.
En terme de schéma, ça représente une sphère avec 3 branches.

Schéma arbre hiérarchique.jpg

Pas sûr d'être très clair, mais son système marchait à merveille.

Cordialement,
 

tototiti2008

XLDnaute Barbatruc
Re : Structure en Arbre n-aire en VBA

Bonjour Orodreth,

Merci de ta réponse
Oui, c'est aussi le conseil que j'avais lu sur la modélisation des arbres, moi je pensais faire un lien du parent vers tous les enfants mais ça se discute ;) (collection)
Tu as trouvé de la littérature appliquée à VBA (ou du code tout fait, qui sait..) sur le sujet ?
Pas que je ne veuille pas tout faire à l'os, mais si ça existe...
 

Orodreth

XLDnaute Impliqué
Re : Structure en Arbre n-aire en VBA

Un plaisir, toujours un plaisir :)

A la limite, tu peux lier tous les enfants à un parent si tu veux.

Mais en réalité, tu alourdis les traitements.

Le principe est que, si tu modifier un parent d'un enfant, la logique voudrait que tous les frères suivent la logique.
De fait, en n'affectant la valeur de parent qu'au premier enfant, il suffit de déplacer cette référence pour changer le parent de toute la branche.

Après, pour du code VBA, j'ai pas. Ca avait été codé en Delphi là où j'avais bossé.

Maintenant, en créant une classe qui hérite de Object, et en lui rajoutant les 3 informations suivantes: parent, enfant, frère, je pense que tu peux facilement mettre en place cet arbre hiérarchique.

J'avais gardé le principe sous le coude pour du dév web ASP.Net, mais jamais eu l'occasion de m'en servir pour l'instant.

Cordialement,
 

tototiti2008

XLDnaute Barbatruc
Re : Structure en Arbre n-aire en VBA

Re,

Mais en réalité, tu alourdis les traitements.

Tout à fait d'accord, je vais y repenser, mais j'avais l'avantage de disposer de tous les enfants facilement sans boucler sur la branche, je vais peser le pour et le contre
ça dépend un peu si c'est une hiérarchie qui évolue souvent (préférer ta structure) ou si on souhaite accélérer les recherches (enfants directement disponibles), je suppose
Oui, en y pensant cette structure du premier enfant est intéressante, peut-être un peu lourde si on supprime le premier enfant
 

Orodreth

XLDnaute Impliqué
Re : Structure en Arbre n-aire en VBA

C'est une structure d'arbres, pratique pour des menus, des forums, ou certains corps de métiers bien spécifiques.

Il y en a d'autres, j'avais lu pas mal de choses sur les arbres en SQL, c'était intéressant.

Tu as la solution aussi de ne pas référencer le fils, mais les parents pour chacun.
Du point de vue de la base de données, c'est les enfants qui connaissent le parent, et d'un point de vue programmation, ça rejoint les collections d'objets: le parent a la liste de ses enfants sous la forme d'une variable collection.

Ceci dit, la structure en collection me parait plus lourde à gérer.

Je vais essayer de te retrouver ce que j'avais lu pour SQL.

EDIT: trouvé. Un expert SQL qui justement fait son introduction sur l'arborescence à collections, pour enchainer ensuite sur l'arborescence par intervalle.
Ca devrait te plaire:
Les petits papiers de SQLPro - Reprsentation intervallaire des arborescences
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Structure en Arbre n-aire en VBA

Bonjour Boisgontier,
Re,

Oui, c'est une excellente représentation graphique de l'arbre mais on ne conserve pas la la structure en elle même dans une variable objet, objet qui pourrait être agrémenté de méthodes et propriétés, voire évènements
Je ne suis pas encore au point sur les objets, mais ça pourrait être un bon exercice d'application :)
 

tototiti2008

XLDnaute Barbatruc
Re : Structure en Arbre n-aire en VBA

Re,

Je crois avoir compris le concept intervallaire, intéressant et surement très rapide en recherche, mais pour le coup je pense (ou je n'ai pas tout saisi) vraiment lourd en modification
La suppression d'une branche va impacter tous les niveaux supérieurs, il me semble, non ?
En tout cas cette discussion est très intéressante, merci d'échanger avec moi ;)
 

Orodreth

XLDnaute Impliqué
Re : Structure en Arbre n-aire en VBA

Je t'avoue que ça fait un moment que je ne me suis pas penché sur la question des arbres.

La dernière fois, j'avais repensé le modèle de moteur de l'arbre de parcours de mon patron (il ne prenait en compte que les chemins possibles là où je traçais en plus le chemin réel fait par le robot).
Mais c'était vraiment du spécifique pour le coup (traçabilité de logistique de transports).

Pour des arbres plus génériques ma foi ... On vient de t'en donner quelques uns sur lesquels tu vas pouvoir plancher un moment :)
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Structure en Arbre n-aire en VBA

Essai:

J'ai une anomalie non expliquée lorsque je supprime certaines branches. Le pas à pas montre bien la suppression des clés du dico mais au final, les clés sont encore présentes dans le dico (sans l'item associé)

Code:
Sub essaiClasseArbre()
   Set a = New Arbre
   a.init = 0
   a.ajout = "bb,aa"
   a.ajout = "cc,aa"
   a.ajout = "dd,aa"
   a.ajout = "ee,bb"
   a.ajout = "ff,bb"
   a.ajout = "gg,dd"
   a.ajout = "hh,ee"
   a.ajout = "ii,ee"
   a.ajout = "jj,hh"
   a.ajout = "kk,hh"
   x = "bb"
   MsgBox "Père de : " & x & " " & a.père(x)
   MsgBox "Taille:" & a.taille
   MsgBox a.affiche()
   a.SupPère = "cc"
   MsgBox a.affiche()
   x = "dd"
   a.SupPère = x
   MsgBox x & " est supprimé"
   MsgBox a.affiche()
End Sub

Code:
Private mondico
Public Property Let init(n)
  Set mondico = CreateObject("scripting.dictionary")
End Property

Public Property Let ajout(filsPère)
  a = Split(filsPère, ",")
  clé = a(0): élem = a(1)
  mondico(clé) = élem
End Property

Public Property Let SupPère(père)
   vpersonnes père, 1
End Property

Public Property Get affiche()
  [A20:B30].Clear
  tmp = ""
  For Each c In mondico.keys
   tmp = tmp & "Fils:" & c & " - père:" & mondico.Item(c) & vbLf
  Next c
  affiche = tmp
End Property

Public Property Get père(fils)
  père = mondico(fils)
End Property

Public Property Get taille()
  taille = mondico.count
End Property

Sub vpersonnes(parent, niv)       ' procédure récursive
  For Each c In mondico.keys
    If mondico.Item(c) = parent Then vpersonnes c, niv + 1
  Next c
  MsgBox parent & " sup"
  mondico.Remove parent
End Sub

JB
 

Pièces jointes

  • ClasseArbre.xls
    102 KB · Affichages: 210
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Structure en Arbre n-aire en VBA

Bonsoir à tous,
@ JB
Je ne sais pas si je suis le mieux placé pour ce genre d'exercice, mais je ne rencontre pas le problème.
En pièce jointe le classeur avec des variables plus 'parlantes'
Cordialement
 

Pièces jointes

  • ClasseArbre(2).xls
    55 KB · Affichages: 218

Statistiques des forums

Discussions
312 295
Messages
2 086 956
Membres
103 404
dernier inscrit
sultan87