Developpez.com - Rubrique Excel

Le Club des Développeurs et IT Pro

Apprendre la programmation en VBA pour EXCEL par la pratique - Troisième partie : Résoudre le problème du voyageur

Un tutoriel de Laurent Ott

Le 2017-04-22 18:52:39, par laurent_ott, Rédacteur
Chers membres du club,

j'ai le plaisir de vous présenter le tome 3 de ce mémento qui aborde le problème du voyageur de commerce avec une méthode d'approximation basée sur des principes simples.

Ce cours est une suite de la série sur « apprendre la programmation en VBA pour Excel par la pratique ». Après le tome 1, qui a donné les bases avec un exemple d'implémentation d'un algorithme de QuickRanking, et le tome 2 qui a introduit la programmation graphique, dans ce tome 3, il s'agira d'aborder un problème relativement complexe : le parcours du voyageur de commerce.

Bonne lecture et n'hésitez pas à apporter vos commentaires.

Retrouvez les meilleurs cours et tutoriels pour apprendre Microsoft Excel
  Discussion forum
52 commentaires
  • laurent_ott
    Rédacteur
    Envoyé par maliano20

    Pourquoi vous avez préféré le IF au SELECT CASE? J'ai lu quelque part sur ce site que le second est plus rapide.
    Par habitude de programmation, tout simplement (et tout bêtement) !
    Je viens de tester et effectivement, SELECT CASE semble bien plus rapide que IF dans une boucle répétée plusieurs milliers de fois. Mais la différence est infime sur un appel ponctuel. En tout cas merci pour cette remarque, j'en tiendrai compte dans mes prochains programmes.

    Envoyé par maliano20

    Pourquoi avoir utiliser le / en lieu et place du \? Étant donné qu'on a besoin de la partie entière de la division, le second n'est il pas plus rapide?
    D'après mes tests, le second n'est pas plus rapide. Ici, comme la variable "Milieu" est déclarée Entier Long, la valeur calculée renvoyée sera toujours un entier (donc la partie entière), et donc pas besoin d'utiliser \ dans ce cas.
  • eriiic
    Membre expert
    Bonjour,

    Milieu = (Début + Fin) / 2
    Pourquoi avoir utiliser le / en lieu et place du \? Étant donné qu'on a besoin de la partie entière de la division, le second n'est il pas plus rapide?
    Attention que ces 2 opérateurs ne sont pas équivalents et substituables, les résultats peuvent être différents.
    Avec Début = 1 et Fin = 6, soit une somme impaire :
    (Début + Fin) / 2 = 3.5, qui sera arrondi à 4 lors de la conversion si Milieu est typé Entier
    (Début + Fin) \ 2 = 3, résultat de la division entière, et restera à 3.
    Il faut penser à en tenir compte.
    eric
  • laurent_ott
    Rédacteur
    Bonjour.
    Je te conseille d'ouvrir une discussion sur le forum EXCEL. Tu pourras joindre tes fichiers au format xlsx (pas de xlsm) et on pourra voir plus facilement ce qui bloque.
  • Patrice740
    Expert confirmé
    Envoyé par xingjing910
    Bonjour Laurent,

    Je suis une débutante dans EXCEL VBA et je suis en train de me former avec tes cours ==> Les cours sont supers bien, je te remercie de les partager

    Je suis actuellement sur le thème tri des donnée. Dans TOME 1 P29/100, tu as parlé de la fonction ALEA.ENTRE.BORNES(0;10000) ==> Je n'arrive pas à trouver l'écriture correcte ...

    ==> Donc je ne sais pas l'utiliser pour remplir 10 000 cellules dans une colonne ...

    Merci merci beaucoup
    XJ
    Il ne s'agit pas de VBA mais d'une formule à placer en A1 d'une feuille de calcul et à tirer jusqu'en A10000 :
    =ALEA.ENTRE.BORNES(0;10000)

    Edit : avec les raccourcis clavier, c'est plus simple de la placer en A10000 et de la copier jusqu'en A1
  • laurent_ott
    Rédacteur
    Bonjour.
    Tu peux ouvrir une discussion sur le forum EXCEL : https://www.developpez.net/forums/f6...ros-vba-excel/ en cliquant sur le bouton "ajouter une discussion" après t'être identifié(e).
    Ou me contacter en messagerie privée : en cliquant sur mon nom. D'ailleurs tu constateras dans ton "tableau de bord", rubrique "boîte de réception", que j'avais répondu à ton précédent message.
    Et tu y trouveras la réponse à cette nouvelle question.
    A Bientôt.
  • Ojanen
    Membre du Club
    Merci beaucoup pour l'ensemble de ces tutoriels très enrichissants !
  • Delludo
    Candidat au Club
    Bonjour, merci beaucoup, je débute sur excel, cela fait une semaine que je me forme comme je peuux avec ce que je trouve sur internet et franchement votre Pdf est vraiment bien.
  • geoffm
    Candidat au Club
    Je l'ai regardé en diagonale, ça semble pas mal ce guide.
    Je n'ai plus besoin de lire un guide introductif mais moi ce qui m'a permis de décoller rapidement c'est le guide de Ben Beitler, http://www.excel-spreadsheet.com/vba/vbacode.htm
    Très didactique et il va droit au but.
  • Filippo
    Membre éclairé
    Bonjour Laurent,
    merci beaucoup pour ce mémento.
    C'est super.

  • maliano20
    Nouveau membre du Club
    Permettez-moi de vous remercier d'abord pour ces excellents documents.
    Code :
    1
    2
    If ValRecherchée <= TabDonnées(Début) Then TableauRecherchePosition = Début: Exit Function
    If ValRecherchée >= TabDonnées(Fin - 1) Then TableauRecherchePosition = Fin: Exit Function
    Pourquoi vous avez préférer le IF au SELECT CASE? J'ai lu quelque part sur ce site que le second est plus rapide.

    Code :
    Milieu = (Début + Fin) / 2
    Pourquoi avoir utiliser le / en lieu et place du \? Étant donné qu'on a besoin de la partie entière de la division, le second n'est il pas plus rapide?