Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

« Dans le même esprit que QRCodeGenerator, j’ai créé une DLL pour calculer le chemin le plus court ! »

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dysorthographie

XLDnaute Barbatruc
pour info c'est une source que j'ai trouvé sur Guitub, en c# a l'origine, que j'ai traduit en vb.net pour y apporter des modifications.

Manuel d'utilisation de la bibliothèque Dijkstra en VBA/Excel


1. Introduction

Cette bibliothèque expose une interface COM (Dijkstra.IGraph) permettant de :
  • Créer un graphe.
  • Ajouter des sommets et des arêtes.
  • Calculer la distance la plus courte entre deux sommets.
  • Gérer les sens de circulation (unique, interdit, bidirectionnel).

2. Prérequis

  • Enregistrer la DLL :
    Avant d'utiliser la bibliothèque en VBA, enregistrez la DLL avec RegAsm (comme vous l'avez déjà fait) :
    cmd en mode Admin

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Projets GuilLab\Dijkstra\Driska\System.Algorithms\bin\x86\Release\Dijkstra.dll"
  • Activer la référence dans VBA :
    Dans l'éditeur VBA (Alt + F11), allez dans Outils > Références et cochez votre bibliothèque (Dijkstra).

3. Exemples d'utilisation en VBA

3.1. Créer un graphe et ajouter des sommets/arêtes

vba
Code:
Sub CreerGrapheEtAjouterElements()
    Dim graphe As Dijkstra.IGraph
    Set graphe = New Dijkstra.Graph

    ' Ajouter des sommets
    graphe.AddSomet "A"
    graphe.AddSomet "B"
    graphe.AddSomet "C"

    ' Ajouter des arêtes (avec sens et longueur)
    graphe.AddSegment "A", "B", 5, Dijkstra_Graph_sens.Unique   ' A→B, longueur 5
    graphe.AddSegment "B", "C", 3, Dijkstra_Graph_sens.Deux     ' B↔C, longueur 3
    graphe.AddSegment "A", "C", 10, Dijkstra_Graph_sens.Interdit ' C→A, longueur 10
End Sub

3.2. Calculer la distance entre deux sommets

vba
Code:
Sub CalculerDistance()
    Dim graphe As Dijkstra.IGraph
    Set graphe = New Dijkstra.Graph

    ' Ajouter des sommets et arêtes (comme dans l'exemple précédent)
    graphe.AddSomet "A"
    graphe.AddSomet "B"
    graphe.AddSomet "C"
    graphe.AddSegment "A", "B", 5, Dijkstra_Graph_sens.Unique
    graphe.AddSegment "B", "C", 3, Dijkstra_Graph_sens.Deux

    ' Calculer la distance entre A et C
    Dim resultat As Variant
    resultat = graphe.Distance("A", "C")

    ' Afficher le résultat
    MsgBox "Distance entre A et C : " & resultat(2) & vbCrLf & _
           "Chemin : " & resultat(3)
End Sub

3.3. Gérer les erreurs

vba
Code:
Sub CalculerDistanceAvecGestionErreurs()
    On Error Resume Next
    Dim graphe As Dijkstra.IGraph
    Set graphe = New Dijkstra.Graph

    ' Ajouter des sommets et arêtes
    graphe.AddSomet "A"
    graphe.AddSomet "B"
    graphe.AddSegment "A", "B", 5, Dijkstra_Graph_sens.Unique

    ' Calculer une distance inexistante (exemple : sommet non connecté)
    Dim resultat As Variant
    resultat = graphe.Distance("A", "C")

    If Err.Number <> 0 Then
        MsgBox "Erreur : " & Err.Description
    ElseIf resultat(2) = -1 Then
        MsgBox "Aucun chemin trouvé entre A et C."
    Else
        MsgBox "Distance : " & resultat(2) & vbCrLf & _
               "Chemin : " & resultat(3)
    End If
End Sub

3.4. Utilisation avancée : Parcourir tous les chemins

vba
Code:
Sub ParcourirTousChemins()
    Dim graphe As Dijkstra.IGraph
    Set graphe = New Dijkstra.Graph

    ' Ajouter des sommets et arêtes
    graphe.AddSomet "A"
    graphe.AddSomet "B"
    graphe.AddSomet "C"
    graphe.AddSomet "D"
    graphe.AddSegment "A", "B", 1, Dijkstra_Graph_sens.Deux
    graphe.AddSegment "B", "C", 2, Dijkstra_Graph_sens.Deux
    graphe.AddSegment "C", "D", 3, Dijkstra_Graph_sens.Deux

    ' Calculer les distances entre toutes les paires
    Dim sommets As Variant
    sommets = Array("A", "B", "C", "D")

    Dim i As Integer, j As Integer
    For i = LBound(sommets) To UBound(sommets)
        For j = LBound(sommets) To UBound(sommets)
            If i <> j Then
                Dim resultat As Variant
                resultat = graphe.Distance(sommets(i), sommets(j))
                Debug.Print "De " & sommets(i) & " à " & sommets(j) & " : " & _
                            IIf(resultat(2) = -1, "Aucun chemin", resultat(2) & " (" & resultat(3) & ")")
            End If
        Next j
    Next i
End Sub

4. Bonnes pratiques

  1. Toujours vérifier les erreurs :
    Utilisez On Error Resume Next et vérifiez Err.Number après chaque appel à Distance.
  2. Optimiser les appels :
    Si vous calculez plusieurs distances, réutilisez le même objet IGraph pour éviter de reconstruire le graphe à chaque fois.
  3. Gérer les sens de circulation:
    • Unique : A→B (un seul sens).
    • Interdit : B→A (sens inverse).
    • Deux : A↔B (bidirectionnel).
  4. Utiliser des noms clairs pour les sommets :
    Évitez les espaces ou caractères spéciaux dans les noms de sommets.

5. Cas d'usage typiques

5.1. Calcul d'itinéraires

  • Modélisez un réseau routier où les sommets sont des villes et les arêtes des routes avec des distances.
  • Utilisez Distance pour trouver le trajet le plus court entre deux villes.

5.2. Gestion de projets

  • Les sommets représentent des tâches.
  • Les arêtes représentent des dépendances avec des durées.
  • Distance calcule le chemin critique.

5.3. Réseaux sociaux

  • Les sommets sont des utilisateurs.
  • Les arêtes représentent des connexions (amitiés, collaborations).
  • Distance trouve le "degré de séparation" entre deux utilisateurs.

6. Dépannage

ProblèmeSolution
Erreur "Type introuvable"Vérifiez que la DLL est enregistrée et que la référence est activée en VBA.
Distance retourne -1Vérifiez que les sommets sont connectés et que les noms sont corrects.
Erreur d'exécutionUtilisez On Error Resume Next et affichez Err.Description.

7. Annexes

7.1. Enumération Dijkstra_Graph_sens

ValeurDescription
UniqueArête orientée (A→B).
InterditArête orientée (B→A).
DeuxArête bidirectionnelle (A↔B).

7.2. Structure de retour de Distance

IndexContenu
0Sommet de départ.
1Sommet d'arrivée.
2Distance (-1 si aucun chemin).
3Chemin textuel (ex: "A=>B=>C").

8. Exemple complet : Application Excel

vba
Code:
Sub CalculerItinéraireExcel()
    Dim graphe As Dijkstra.IGraph
    Set graphe = New Dijkstra.Graph

    ' Ajouter des villes et routes
    graphe.AddSomet "Paris"
    graphe.AddSomet "Lyon"
    graphe.AddSomet "Marseille"
    graphe.AddSegment "Paris", "Lyon", 465, Dijkstra_Graph_sens.Deux
    graphe.AddSegment "Lyon", "Marseille", 315, Dijkstra_Graph_sens.Deux

    ' Calculer l'itinéraire Paris → Marseille
    Dim resultat As Variant
    resultat = graphe.Distance("Paris", "Marseille")

    ' Afficher dans une feuille Excel
    With ThisWorkbook.Sheets("Itinéraires")
        .Range("A1").Value = "Départ"
        .Range("B1").Value = "Arrivée"
        .Range("C1").Value = "Distance (km)"
        .Range("D1").Value = "Chemin"
        .Range("A2").Value = resultat(0)
        .Range("B2").Value = resultat(1)
        .Range("C2").Value = resultat(2)
        .Range("D2").Value = resultat(3)
    End With
End Sub

9. Conclusion

Ce manuel vous permet de :
  • Créer et manipuler des graphes en VBA.
  • Calculer des plus courts chemins avec l'algorithme de Dijkstra.
  • Intégrer ces fonctionnalités dans Excel pour des applications pratiques.
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

C
Réponses
0
Affichages
839
cedric_hiss
C
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…