Construction réseau (différents chemins possibles)

Anthony115

XLDnaute Nouveau
Bonjour,

Je suis nouveau sur le forum et me permets de demander votre aide car je penche sur un problème depuis plusieurs jours sans trouver la solution.

Je travaille sous Excel 2007.
Je souhaiterai réaliser ce travail en VBA.

Voici un exemple "simple" pour comprendre la logique: --> voir fichier joint

Le but est d'obtenir les 3 chemins différents par VBA (a-b; a-c-e; a-d).
On sait que le tronçons a est le tronçon de départ.
On sait que les tronçons b, e et c sont à la fin du réseau.

Ou j'en suis:
J'arrive à identifier le début du réseau et donc créer le début des chemins.
Je n'arrive par a faire les recherches dans les Id1 et Id2 afin de continuer les réseau sachant que parfois le noeud amont peut se retrouver dans l'Id1 ou l'Id 2....


J'espère avoir été assez clair, dans le cas contraire je m'en excuse et suis prêt à répondre à toutes questions.

Merci par avance,
Anthony
 

Pièces jointes

  • Construction de réseau.xlsx
    17 KB · Affichages: 77

thebenoit59

XLDnaute Accro
Re : Construction réseau (différents chemins possibles)

Bonjour Anthony.

On sait que les tronçons b, e et c sont à la fin du réseau.
Ce n'est pas plutôt "d" au lieu de "c" ?

Je ne comprends pas tes tableaux.
A quoi correspondent Id1 et Id2 ?
Pourquoi dans ton résultat, tu disposes de valeurs Fausses ?

Peux-tu m'éclairer par rapport à ça ?
 

Anthony115

XLDnaute Nouveau
Re : Construction réseau (différents chemins possibles)

Bonjour thebenoit59,

Tu as raison, c'est b, d et e qui sont à la fin du réseau (car "*").
"Faux" correspond aux tronçons intermédiaires ou au nœud du début par conséquent, ils sont forcément compris dans un autre chemin ou on aura une fin de réseau. Exemple avec la lettre c, elle est comprise dans le chemin a-c-e.

Désolé de ne pas être assez clair je vais essayer d'arranger ça:

La lettre correspond à un tronçon.
Un tronçon est identifié par ses extrémités qui sont Id1 et Id2.

Pour le tronçon a:
Id1=1, 1 est la seule valeur de la plage "B21:C25" donc on en conclut que c'est la première extrémité (pas relié à un autre tronçon).
Id2=2, l'autre extrémité du tronçon a vaut 2.
On regarde alors dans les autres tronçons si ils ont des extrémités (Id1 ou Id2) associés à ce premier tronçon.
On regarde alors si on a des "2" dans les Id des autres tronçons, c'est le cas pour les tronçons b,c et d.

On remarque que les tronçons b et d ont un "*" c'est donc la fin du réseau.
On peut en conclure que les 2 premiers chemins sont:
Chemin1: a-b
Chemin2: a-d

Pour le c, on a pas "*" (donc pas fin de réseau), il faut donc continuer le chemin a-c:
Le tronçon c a pour Id1=2 (lié à a)
et pour Id2=3 (lié à la suite de notre chemin)
En l’occurrence, Id2=3 (pour c) est lié à l'Id1=3 (pour e)

En e, on a un "*" donc c'est la fin de réseau.
On a donc:
Chemin3: a-c-e


J'espère avoir été un peu plus clair.
N'hésites pas à me le dire si ce n'est pas le cas.

Merci,
Anthony
 

thebenoit59

XLDnaute Accro
Re : Construction réseau (différents chemins possibles)

Une piste à creuser peut-être.
C'est un peu dégueulasse comme ça, je voulais passer par tableaux, mais on peut raccourcir la procédure sans tableau.

Code:
Option Explicit

Sub Construction_Réseaux()
Dim i%, j%, t(), d As Object, d1 As Object, f As Worksheet, a, c, b

'On enregistre la page de travail.
Set f = Sheets("feuil1")
'On enregistre le tableau de travail.
t = f.Range("A5:F9").Value

'On crée le dictionnaire.
Set d = CreateObject("Scripting.Dictionary")
Set d1 = CreateObject("Scripting.Dictionary")

'On tri le tableau en ordre croissant.
'Plus simple pour établir les tronçons.
For i = LBound(t) To UBound(t)
    If t(i, 2) > t(i, 3) Then a = t(i, 2): t(i, 2) = t(i, 3): t(i, 3) = a
    If t(i, 2) = Application.Min(t) Then t(i, 4) = "Début": j = i
    d(t(i, 2)) = t(i, 1)
    d1(t(i, 3)) = t(i, 1)
Next i

'On commence à enregistrer les tronçons.
For i = LBound(t) To UBound(t)
    If Not d.exists(t(i, 3)) Then
        t(i, 5) = ""
            If t(i, 6) = "" Then
                t(i, 6) = d1(t(i, 2)) & "-" & t(i, 1)
                Else: t(i, 6) = t(i, 6) & "-" & d1(t(i, 2))
            End If
        Else
            t(i, 5) = "Faux"
            If d1.exists(t(i, 2)) Then d1(t(i, 3)) = d1(t(i, 2)) & "-" & d1(t(i, 3))
    End If
Next i

'On affiche le tableau.
[I5].Resize(UBound(t), UBound(t, 2)).Value = t
End Sub
 

Anthony115

XLDnaute Nouveau
Re : Construction réseau (différents chemins possibles)

Tout d'abord merci beaucoup pour ta réponse rapide et très intéressante.

J'ai passé un peu de temps à comprendre (du moins essayer) et je me rend compte à quel point je suis petit dans l'univers VBA. Mais c'est bien de pouvoir apprendre de nouvelles choses et je t'en remercie.


Quelques petites questions:
1) Quand on enregistre le tableau de travail, pourquoi on va de "A5:F9" et pas jusqu'à E9 car le tableau s'arrête en E9?

2) Ci-joint, un exemple plus concret avec les "chiffres" réels. Malheureusement, j'ai essayé d'adapter le code mais ça ne marche pas?
De "A28:C38" un réseau à reconstruire
De "A40:C49" un autre réseau (indépendant du premier)

3) La méthode par tableau m'a permis de comprendre pas mal de choses. Tu as parlé d'une méthode plus "légère". Etant donné que j'ai plusieurs dizaines de milliers de lignes à traiter, peut-être que la méthode plus légère serait plus adaptée?

Merci encore

Anthony
 

Pièces jointes

  • Construction de réseau 2.xlsm
    21.5 KB · Affichages: 64

thebenoit59

XLDnaute Accro
Re : Construction réseau (différents chemins possibles)

Sans ouvrir ton fichier pour le moment.
J'enregistre jusque F, car nous ajoutons une colonne par la suite et je ne souhaite pas redimensionner le tableau.
Au contraire si tu as autant de lignes à traiter, il vaut mieux la méthode par tableau, qui sera plus rapide.
Je regarderai ton fichier à tête reposée :).
 

thebenoit59

XLDnaute Accro
Bonjour Anthony.
Je n'avais pas vu ta réponse de vendredi.
Je ne connais pas du tout Access.
Par ailleurs, je me suis rappelé les fonctions récursives utilisées par Boisgontier pour réaliser un organigramme.
Je pense que nous pourrions l'utiliser dans notre cas.

Est-il possible de modifier l'ordre du classement ?
 

Anthony115

XLDnaute Nouveau
Suite à ta suggestion sur les organigrammes (avec les fonctions récursives) j'ai trouvé ce code qui, comme tu l'as dis, semble convenir au problème.
J'essaie de déchiffrer pour essayer de l'adapter aux réseaux.

Je joins le fichier sur l'organigramme père fils (si ça peut t'éviter de le chercher)

Merci
 

Pièces jointes

  • Organigramme père fils (sans module).xlsm
    19.3 KB · Affichages: 1

thebenoit59

XLDnaute Accro
Concernant la recherche de la première chaîne.
Tu dis :
Id1=1, 1 est la seule valeur de la plage "B21:C25" donc on en conclut que c'est la première extrémité (pas relié à un autre tronçon).

Mais dans les derniers exemples, nous ne pouvons pas nous fier à ce critère pour déterminer directement le début.
En effet, si nous prenons le premier tableau, 5 valeurs n'existent qu'une seule fois, et cela pourrait porter à confusion sur le début des chemins, et nous faire débuter par une fin au lieu d'un début.

Par rapport à ton expérience sur ce fichier, comment détermines-tu le début ?

Edit: je parlais effectivement de ce fichier :)
 

Anthony115

XLDnaute Nouveau
Désolé, c'est de ma faute, à vouloir trop simplifier pour expliquer de façon claire, c'est l'inverse qui se produit.

Pour le début du chemin, j'ai une autre colonne "Id début" qui me permet de savoir parmi les valeurs qu'on retrouve qu'une seule fois, laquelle correspond au début (cf cellule D27 du fichier joint).

Excuse moi encore
 

Pièces jointes

  • Construction de réseau 2.xlsm
    28.5 KB · Affichages: 3

Discussions similaires

Statistiques des forums

Discussions
314 203
Messages
2 107 176
Membres
109 766
dernier inscrit
pleutre