Fonction pour afficher une distance mini
Bonjour à tous !
Voilà j'ai un petit exercice qui me pose problème ! Je suis vraiment débutant en VBA.
Le but de cet exercice est de créer des fonctions pour afficher les distances mini et maxi entre deux, trois et quatre villes. Un exemple est donné pour calculer la distance entre deux villes, je comprends la logique donc je l'ai reproduite pour calculer la distance entre les 3 villes en C23 C24 et C25.
Cependant je ne comprends pas comment afficher la distance mini ou maxi.
J'ai pensé à calculer les 6 combinaisons possibles :
Ville A => Ville B => Ville C
Ville A => Ville C => Ville B
Ville B => Ville A => Ville C
Ville B => Ville C => Ville A
Ville C => Ville A => Ville B
Ville C => Ville B => Ville A
Et logiquement, il a 3 distances
Ville A => Ville B => Ville C = Ville C => Ville B => Ville A
Ville A => Ville C => Ville B = Ville B => Ville C => Ville A
Ville B => Ville A => Ville C = Ville C => Ville A => Ville B
Mais je n'arrive pas à créer une fonction qui me permettrait de l'afficher directement.
Je pensais faire quelque chose comme ça,
Function distanceminitest(ville1, ville2, ville3)
Dim a As Integer
Dim b As Integer
Dim c As Integer
a = Range("Distances").Cells(Application.Match(Range("Q1_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville2"), Range("Villes2"), 0)).Value + Range("Distances").Cells(Application.Match(Range("Q1_Ville2"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville3"), Range("Villes2"), 0)).Value
b = Range("Distances").Cells(Application.Match(Range("Q1_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville3"), Range("Villes2"), 0)).Value + Range("Distances").Cells(Application.Match(Range("Q1_Ville3"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville2"), Range("Villes2"), 0)).Value
c = Range("Distances").Cells(Application.Match(Range("Q1_Ville2"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville1"), Range("Villes2"), 0)).Value + Range("Distances").Cells(Application.Match(Range("Q1_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville3"), Range("Villes2"), 0)).Value
distanceminitest = Min(a, b, c)
End Function
Mais ce n'est pas vraiment clair et en plus ça ne marche pas
La partie suivante de l'exercice consiste à refaire cet exercice mais avec 4 villes, les combinaisons possibles deviennent dès lors beaucoup plus nombreuses.
Merci de m'avoir lu, si quelqu'un aurait une idée pour aider un débutant comme moi, ça serait super !
Bonne journée !
Bonsoir,
pour trois villes, mettre en mémoire les trois distances dans un tableau par exemple.
Puis boucler sur le tableau afin de faire les additions deux à deux => trois résultats, prendre le plus grand et le plus petit.
Pour 4 villes mettre les 4 distances dans un tableau et boucler dessus pour avoir les 4 résultats prendre le plus grand et le plus petit.
@ bientôt
LouReeD
Voilà mon idée en fichier :
Afin d'avoir une mise à jour de la fonction il faut mettre en paramètre de la fonction les trois cellules de sélection des villes, mais la fonction ne s'en sert pas !
Par contre j'ai ajouté un paramètre afin d'utiliser la même fonction pour la distance mini et maxi avec un "0" pour mini et un "1" pour maxi.
Comme à la base les calculs que je fais sont les mêmes, il n'y a que le résultat qui change.
A vous de voir pour 4 villes...
@ bientôt
LouReeD
Bonsoir LouReed !
Merci beaucoup pour votre aide. Je crois effectivement que mes plus grosses difficultés sont par rapport à la mise en mémoire. Du coup j'ai quelques questions, (pardonnez moi, je suis vraiment néophyte !
Pourquoi n'y a t il que tablo(2) qui soit déclarée en variable ?
Dim Tablo(2)
Pourquoi ne faut il pas déclarer tablo(1) et (3) ainsi que dist1 2 et 3 ?
Encore une fois, merci pour votre aide, je commence à travailler sur le cas des 4 villes !
Bonsoir à nouveau !
Pour les besoins de mon exercice, j'ai donc créé deux fonctions, une pour le mini et une pour le maxi.
Function DistanceMini3(ville1, ville2, ville3)
Dim Tablo(2)
Tablo(0) = Range("Distances").Cells(Application.Match(Range("Q1_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville2"), Range("Villes2"), 0)).Value
Tablo(1) = Range("Distances").Cells(Application.Match(Range("Q1_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville3"), Range("Villes2"), 0)).Value
Tablo(2) = Range("Distances").Cells(Application.Match(Range("Q1_Ville2"), Range("Villes1"), 0), Application.Match(Range("Q1_Ville3"), Range("Villes2"), 0)).Value
dist1 = Tablo(0) + Tablo(1)
dist2 = Tablo(0) + Tablo(2)
dist3 = Tablo(1) + Tablo(2)
If dist1 < dist2 And dist1 < dist3 Then DistanceMini3 = dist1
If dist2 < dist1 And dist2 < dist3 Then DistanceMini3 = dist2
If dist3 < dist1 And dist3 < dist2 Then DistanceMini3 = dist3
End FunctionCependant pour faire le même travail avec les 4 villes, il n'y a pas que 3 combinaisons possibles mais 24, avec 12 résultats différents. Je ne comprends pas comment appliquer votre conseil "Pour 4 villes mettre les 4 distances dans un tableau et boucler dessus pour avoir les 4 résultats prendre le plus grand et le plus petit."
On arrive effectivement vite à un code énorme
Function DistanceMaxi4(ville1, ville2, ville3, ville4)
Dim Tableau(2)
Tableau(0) = Range("Distances").Cells(Application.Match(Range("Q2_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q2_Ville2"), Range("Villes2"), 0)).Value
Tableau(1) = Range("Distances").Cells(Application.Match(Range("Q2_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q2_Ville3"), Range("Villes2"), 0)).Value
Tableau(2) = Range("Distances").Cells(Application.Match(Range("Q2_Ville1"), Range("Villes1"), 0), Application.Match(Range("Q2_Ville4"), Range("Villes2"), 0)).Value
Tableau(3) = Range("Distances").Cells(Application.Match(Range("Q2_Ville2"), Range("Villes1"), 0), Application.Match(Range("Q2_Ville3"), Range("Villes2"), 0)).Value
Tableau(4) = Range("Distances").Cells(Application.Match(Range("Q2_Ville2"), Range("Villes1"), 0), Application.Match(Range("Q2_Ville4"), Range("Villes2"), 0)).Value
Tableau(5) = Range("Distances").Cells(Application.Match(Range("Q2_Ville3"), Range("Villes1"), 0), Application.Match(Range("Q2_Ville4"), Range("Villes2"), 0)).Value
dist1 = Tableau(0) + Tableau(3) + Tableau(5)
dist2 = Tableau(0) + Tableau(4) + Tableau(5)
dist3 = Tableau(0) + Tableau(1) + Tableau(5)
dist4 = Tableau(0) + Tableau(2) + Tableau(5)
dist5 = Tableau(1) + Tableau(3) + Tableau(4)
dist6 = Tableau(1) + Tableau(5) + Tableau(4)
dist7 = Tableau(1) + Tableau(4) + Tableau(4)
dist8 = Tableau(2) + Tableau(5) + Tableau(3)
dist9 = Tableau(2) + Tableau(4) + Tableau(3)
dist10 = Tableau(3) + Tableau(1) + Tableau(2)
dist11 = Tableau(3) + Tableau(0) + Tableau(2)
dist12 = Tableau(4) + Tableau(2) + Tableau(1)
Comment transformer ça en boucle ..?
Merci pour votre aide en tout cas, ça m'a bien débloqué !!
Bonjour,
J'avoue que je suis complètement perdu avec cette boucle
Si quelqu'un a des idées, je serais vraiment preneur ..!
Merci beaucoup et bonne journée.
Bonjour,
Une dernière tentative ?
Merci !
Bonjour,
c'est vrai que je me suis lancé là dedans tête baissée sans me rendre compte de la difficulté !
Ceci dit vu le nombre de possibilité je crois toujours qu'il faut passer par un tableau avec une boucle sur le nombre de possibilité de trajet et à chaque tour faire un test et ne garder en mémoire que les trajets les plus élevés (ou les moins en fonction du but recherché) et ensuite les additionner pour donner le résultat. Je cherche même si cç n'a pas l'air et je retourne le plus vite possible
Sinon pour avoir une chance de plus d'avoir une réponse, ouvrez un deuxième fil avec la même question, mais comme il sera "vierge" de toutes réponses d'autre intervenants pourront s'y intéresser...
@ bientôt
LouReed
Bonjour LouReeD !
Merci pour vos conseils, je vais donc recréer un sujet qui sera un peu plus clair !
Bonsoir,
vous avez vu ?! incroyable cet "acide" !
Bravo à lui !
Bonne fin de journée à vous
@ bientôt
LouReeD