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.
7.1. Enumération
7.2. Structure de retour de
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
- Toujours vérifier les erreurs :
UtilisezOn Error Resume Nextet vérifiezErr.Numberaprès chaque appel àDistance. - Optimiser les appels :
Si vous calculez plusieurs distances, réutilisez le même objetIGraphpour éviter de reconstruire le graphe à chaque fois. - Gérer les sens de circulation:
Unique: A→B (un seul sens).Interdit: B→A (sens inverse).Deux: A↔B (bidirectionnel).
- 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
Distancepour 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.
Distancecalcule le chemin critique.
5.3. Réseaux sociaux
- Les sommets sont des utilisateurs.
- Les arêtes représentent des connexions (amitiés, collaborations).
Distancetrouve le "degré de séparation" entre deux utilisateurs.
6. Dépannage
| Problème | Solution |
|---|---|
| Erreur "Type introuvable" | Vérifiez que la DLL est enregistrée et que la référence est activée en VBA. |
Distance retourne -1 | Vérifiez que les sommets sont connectés et que les noms sont corrects. |
| Erreur d'exécution | Utilisez On Error Resume Next et affichez Err.Description. |
7. Annexes
7.1. Enumération Dijkstra_Graph_sens
| Valeur | Description |
|---|---|
Unique | Arête orientée (A→B). |
Interdit | Arête orientée (B→A). |
Deux | Arête bidirectionnelle (A↔B). |
7.2. Structure de retour de Distance
| Index | Contenu |
|---|---|
| 0 | Sommet de départ. |
| 1 | Sommet d'arrivée. |
| 2 | Distance (-1 si aucun chemin). |
| 3 | Chemin 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: