Introduction à Visual Basic et Macros
Introduction à Visual Basic et Macros
Visual Basic est un outil développé par Microsoft pour développer facilement des applications
fonctionnant sous Microsoft Windows ©.
Visual Basic est, comme son nom l'indique, un outil visuel permettant de créer sans notion de
programmation l'interface graphique (GUI - Graphical User Interface) en disposant à l'aide de la souris
des éléments graphiques (boutons, images, champs de texte, menus déroulants,...).
L'intérêt de ce langage est de pouvoir associer aux éléments de l'interface des portions de code
associées à des événements (clic de souris, appui sur une touche, ...). Pour cela, Visual Basic utilise un
petit langage de programmation dérivé du BASIC (signifiant Beginners All-Purpose Symbolic
Instruction Code, soit code d'instructions symboliques multi-usage pour les débutants). Le langage de
script utilisé par Visual Basic est nommé à juste titre VBScript, il s'agit ainsi d'un sous-ensemble de
Visual Basic. De plus, ce langage est utilisé pour de nombreuses autres applications Microsoft© que
Visual Basic :
Microsoft Access
Microsoft Active Server Pages
Microsoft Excel
Microsoft Internet Explorer
Microsoft Word
Ainsi, pour créer un utilitaire, il suffit de créer son interface graphique à l'aide de la bibliothèque
d'élément en les assemblant tels un puzzle, puis de programmer à l'aide de VBScript les événements
associés aux éléments de l'interface.
1
même une autre version de Visual Basic importe peu, en ce sens que les notions basiques de
programmation que je vais vous montrer n'ont rien à voir avec l'utilisation de Word, EXcel ou
Access. Il s'agit de notions d'algorithmie, qui est l'art de la logique des programmes qu'ils soient. Il
existe des langages de programmation très différents, comme justement Visual Basic (VBA), Java,
C++, Cobol, Pascal, etc., et quel que soit le langage utilisé, il est indispensable de connaître les
bases de la logique de programmation. En d'autres mots, c'est comme si vous vouliez être physicien,
comptable ou ingénieur : Il vous faudra passer par la logique de base des mathématiques, qui n'a
rien a voir avec ensuite votre spécialisation, mais qui est une étape incontournable.
Ceci dit, je me suis quand même appuyé sur Word. Pourquoi ? simplement, parce que dans Office,
c'est le programme le plus simple (Plus simple qu'Excel notamment), et que dans certains exemples,
j'utilise simplement l'instruction TypeText (Qui n'existe que dans Word), et qui permet d'afficher
certaines choses dans un document.
Apprenez a faire votre première Macro - avec l'enregistreur de macro bien pratique
Attacher une macro à une icône d'une barre d'outils - Afin de pouvoir appeler votre macro d'un simple
clic plutôt que d'aller dans Outils/Macros/Macros
Qu'est-ce qu'un programme et à quoi sert-il ?
Les variables et les constantes
Les tableaux
Utilisation de la fonction InputBox et du & (Et commercial)
Les boucles DO, LOOP, WHILE et UNTIL
2
- Séparation du nom et du prénom
- Rendre la monnaie sur une somme donnée
- Comptage du nombre de lettres d'une phrase, statistique sur les lettres
- Statistiques sur un jet de dés + Pourcentages
- Validation d'une date
- Recherche d'une chaîne de texte dans une phrase
- Affichage d'une pyramide à l'écran
- Utilisation de type pour établir une facture
- Entrer un calcul en lettres "un plus quatre"
- Fonctions : Cryptage et décryptage d'un texte
- Détermination d'un nombre premier
- Tri de chiffres et de noms
- Carré magique
- Jeu des chiffres et des lettres
Une macro, en quelque sorte va vous permettre d'automatiser des actions répétitives. Ca va de la
simple petite macro qui sélectionne tout le texte et le met en gras automatiquement, jusqu'à la macro
très complexe qui permet de choisir un client dans une base de données Access, de l'importer dans
Word, dans des zones prédéfinies de formulaires complexes.
Quel que soit votre niveau, vous pouvez construire et utiliser des macros. Mais il y a des limites : Si
vous êtes vraiment débutant en Word, les subtilités des macros vous échapperont certainement - Et
même si vous êtes un utilisateur confirmé, voire HelpDesk, il est possible que certaines macros soient
tellement complexes à mettre en oeuvre que vous aurez besoin de l'aide d'un programmeur
professionnel.
En effet, il y a une marge ENORME entre une petite macro de quelques lignes qui fait de menus
détails, tels que justement la mise d'un texte en gras, avec la programmation de modules complexes,
composés de multiples procédures et fonctions complexes, faisant appel à des notions pointues de
programmation.
Mettons donc grâce à ce chapitre le premier orteil dans l'océan Visual Basic pour Application !
Pour suivre pas à pas ce mode d'emploi, je vous conseille fortement d'imprimer cette
page pour l'avoir à côté de votre PC pendant que vous essayez de réaliser cette macro.
3
Pour cet exemple, je vous propose d'écrire une petite macro toute minable qui se contente d'écrire
automatiquement CA MARCHE dans votre document.
OUF ! Vous pouvez respirer. L'enregistrement de la macro est terminé. Il ne reste plus qu'a voir si
cette macro fonctionne !
ET VOILA... SI tout s'est bien passé, vous devriez voir apparaître à l'écran Ca marche ! Ce n'est
pas plus compliqué que ça. Bravo !
4
L'instruction pour créer une boîte de dialogue comme celle-ci est MsgBox "Ca Marche".
1. Quittez Word, ne sauvegardez rien, et revenez dans Word (Simplement pour être sûr que nous
avons bien les mêmes écrans)
2. Faites Outils/Macros/Visual Basic Editor
3. Dans la partie de gauche, vous devriez voir ceci :
End Sub
7. Complétez le code en écrivant vous même MsgBox "Ca Marche", comme ceci :
Sub AfficheMessage()
MsgBox "Ca Marche"
End Sub
8. La macro est maintenant écrite. Cliquez quelque part entre Sub AfficheMessage et End Sub, et
appuyez sur la touche F5. Le message devrait apparaître, comme ceci :
Et voilà... vous avez écrit vous même votre première macro, et exécuté ! Félicitations ! Vous avez
donc appris plusieurs choses :
5
1. MsgBox permet d'afficher des messages
2. Le texte affiché avec MsgBox est écrit entre guillemets
3. Les macros commencent par Sub QuelqueChose() et se terminent par End Sub
4. On peut exécuter les macros directement depuis l'environnement VBA avec la touche F5
Mais on peut bien sûr exécuter cette macro depuis Word... Marche à suivre :
Un
Deux
1. Quittez Word, ne sauvegardez rien, et revenez dans Word (Simplement pour être sûr que nous
avons bien les mêmes écrans)
2. Faites Outils/Macros/Nouvelle Macro
3. Nom de la macro : MacroTest
4. Enregistrer la macro dans : Document1
5. Cliquez sur OK
: Vous êtes en train d'enregistrer !
6. Ecrivez simplement :
Un
Deux
7. Outils/Macros/Arrêter l'enregistrement
8. Faites Outils/Macros/Visual basic Editor
9. Dans la partie de gauche, vers le haut (dans l'explorateur de projets), cliquez sur le petit + à
côté de Modules
10. Ca fait apparaître NewMacros. Cliquez 2 fois dessus : Ca fait apparaître votre macro
enregistrée, comme ceci :
Sub MacroTest()
'
' MacroTest Macro
' Macro enregistrée le 05.01.2001 par Michel
'
6
[Link] Text:="Un"
[Link]
[Link] Text:="Deux"
End Sub
11. Remplacez
[Link] Text:="Un"
par
[Link] Text:="Le radeau de la méduse"
12. Faites Fichier/Fermer et retourner à Microsoft Word
13. Descendez un peu plus bas que votre Deux (en appuyant sur Enter 2 ou 3 fois)
14. Faites Outils/Macros/Macros, et exécutez MacroTest
Et voilà ! Si tout s'est bien passsé, votre écran devrait ressembler à ceci :
Un
Deux
Le radeau de la méduse
Deux
Vous avez réussi à corriger à la main une macro préenregistrée ! Vous avez appris de nouvelles choses
:
1. C'est une manière très sympathique d'apprendre petit à petit la syntaxe de visual basic
2. [Link] Text:="Truc machin" permet d'écrire du texte dans Word
3. [Link] fait comme si on appuyait sur ENTER
4. Il y a certaines lignes en vert, qui commencent par une apostrophe ('). Ce sont des lignes de
commentaires. C'est à dire que ces lignes sont totalement ignorées par Visual Basic, et vou
permettent de commenter votre code.
Bien. Maintenant que vous avez créé votre première macro, il s'agit de l'intégrer à votre
environnement Word. Parce que, entre nous, ce n'est pas bien pratique de devoir chaque fois aller
dans Outils/Macros/Macros pour éxécuter sa macro... Ce serait tellement plus simple de simplement
cliquer sur une icône et que la macro s'exécute automatiquement...
Attention les vélos, parce que ce n'est pas évident à expliquer, ni à comprendre, ni à réaliser.
Essayons :
Pour commencer, nous allons créer une barre d'outils. VOTRE barre d'outils, qui va contenir toutes les
macros que vous aurez le plaisir de créer. Ainsi, quand vous irez dans Affichage/Barres d'outils, vous
7
aurez la possibilité d'afficher ou non, non seulement les barres d'outils normales telles que Mise en
forme ou standard, mais également votre barre d'outils que nous allons nommer .
Marche à suivre :
1. Allez dans Affichage/Barres d'outils/Personnaliser
2. Cliquez sur "Nouvelle..."
3. Nom de la barre d'outils : Mes Macros. Utilisable par : "[Link]", et OK
A ce stade, vous devriez voir sur votre écran apparaître un petit carré gris tout riquiqui, avec juste une
petite croix pour le fermer. C'est votre barre d'outils. Elle est toute petite car elle est vide.
4. Vous êtes toujours dans la boîte de dialogue "Affichage/Barres d'outils/Personnaliser". Cliquez sur
l'onglet "Commandes"
5. Cherchez dans la liste de gauche "Macros". Cliquez dessus
6. Dans la partie de droite, vous voyez normalement votre macro
[Link]. Cliquez dessus
7. Laissez appuyé le doigt sur la souris, sur MaPremiereMacro. Un petit + apparaît. Faites glisser cette
macro jusqu'a au milieu de votre nouvelle toute petite barre d'outils Mes Macros.
8. Vous devriez maintenant avoir sur votre barre d'outils personnalisée un grand bouton avec marqué
dessus "[Link]"
Voilà. C'est terminé. Cliquez sur "fermer", et maintenant, vous n'avez plus qu'a cliquer sur ce bouton
pour exécuter la macro...
1. Affichage/Barres d'outils/Personnaliser
2. Ne vous occupez pas ce cette boîte de dialogue. Ne la regardez même pas...
3. Allez sur votre nouveau bouton, et cliquez dessus avec le bouton DROIT de votre souris
4. Un menu contextuel apparaît. Cliquez dans la zone "Nom:", et écrivez Ca marche
Et voilà...
ASTUCE Votre barre d'outils flotte au milieu de votre document Word... Pas terrible. Mettez la
pointe de la flèche de votre souris sur la barre bleue de titre de votre barre d'outils (ou c'est écrit Mes
Macros), et double-cliquez. Voilà. Elle est maintenant intégrée parmi les autres barres d'outils
Exercice
8
Créez de A à Z une nouvelle macro qui s'appelle "LettrePereNoel", et qui se contente s'écrire
automatquement "N'oublie pas mon petit soulier". Une fois cette macro créée, ET testée, vous devez
l'intégrer dans votre barre d'outils "Mes Macros", comme bouton supplémentaire, et qu'il soit écrit
sur ce bouton "Ma lettre au Père-Noël", plutôt que [Link]
Prenons un exemple imagé : Imaginez quelqu'un qui désire garer sa voiture dans un garage qu'il désire
louer. Pour commencer, il doit louer le garage, c'est à dire qu'il doit choisir la taille du garage et
l'emplacement de ce garage : ce n'est que quand le garage lui appartiendra qu'il pourra y garer sa
voiture.
En programmation, le fait de choisir un nom et une taille à la variable et de l'écrire suffit. On dit que
l'on DECLARE UNE VARIABLE.
Comme dans l'exemple de la location du garage, on ne fait que RESERVER la place que l'on désire
éventuellement occuper. Vous pouvez très bien louer un garage et ne jamais y mettre les pieds.
En programmation aussi, vous pouvez DECLARER UNE VARIABLE que vous n'utiliserez jamais...
Quand vous louez un garage, et que vous désirez vraiment y mettre votre voiture, vous allez vous
rendre compte de l'état dans lequel il est : En effet, peut-être que le locataire précédent y à laissé plein
de choses (des vieux pots de peinture, des chiffons, peut-être même une vieille bagnole qu'il vous
faudra évacuer). Vous commencez donc par vider le garage avant de mettre votre voiture. En
programmation, c'est exactement pareil : Le fait de DECLARER UNE VARIABLE (de réserver la
place) ne vous garantit pas du tout que cette place mémoire n'était pas occupée avant par d'autres
données, aussi, vous devez donc, au début du programme, vider cet emplacement (y mettre 0 par
exemple).
Cette opération est dite SEQUENCE D'INITIALISATION. C'est à dire que vous INITIALISEZ les
différentes variables à 0 (ou un autre chiffre qui devrait y être) afin d'être sûr des contenus de vos
variables dès le début du programme.
Les variables peuvent être de différents TYPES. C'est à dire qu'un TYPE de variable est une sorte de
variable. Pour reprendre l'exemple de la voiture dans le garage, la place doit varier en fonction de la
taille de la voiture. En programmation, vous pouvez stocker différentes choses dans les variables, dont
4 principales : les VALEURS ENTERES (INTEGER en Visial Basic), les VALEURS REELLES
(SINGLE en Visual Basic), et les CHAINES DE CARACTERES (STRING en Visual Basic).
9
Ainsi donc, suivant que vous ayez besoin d'une variable avec des décimales (par exemple pour stocker
le chiffre Pi : 3.14.159...), vous devrez prévoir (DECLARER) une variable de TYPE SINGLE. Par
contre, si vous avez besoin d'une variable qui ne contiendra que des nombres entiers (Par exemple un
compteur), vous devrez DECLARER UNE VARIABLE DE TYPE ENTIER (INTEGER), et si vous
avez besoin d'une variable qui contiendra une chaîne de caractères ("Texte", "Marcel", "Pas de
valeur"), vous aurez besoin de déclarer une VARIABLE DE TYPE CHAINE DE CARACTERE
(STRING)
Sub VariableNonDefinie()
A = 44
MsgBox A
A = "Chat"
MsgBox A
End Sub
Avec Option Explicit, on DOIT déclarer les variables (ici, une erreur est générée)
Option Explicit
Sub VariableNonDefinie()
A = 44
MsgBox A
A = "Chat"
MsgBox A
End Sub
Sub VariableV3()
Dim A As Integer
A = 44
MsgBox A
' A = "Chat" génère une erreur
End Sub
10
Sub VariableV4()
Dim A As Integer
A = "le gros lion"
MsgBox A
' A = 46 génère une erreur
A = "46" ' est correct
MsgBox A
End Sub
On définit une constante généralement parce qu'il est plus convivial de nommer par un nom que par un
chiffre. Par exemple, on peut définir les constantes suivantes :
Const Pi = 3.1415926535
Const MonAnimalPrefere = "Le chat"
Const Rouge = 255 ' En VB, 255 est souvent le code couleur du rouge
Const MaCouleurPreferee = Rouge ' Donc MaCouleurPreferee = 255
Sub Constante()
Const Himalaya = 8848
Himalaya = 44 ' Génère une erreur d'exécution
End Sub
Les tableaux
Lorsque vous avez besoin d'un emplacement pour mettre une seule voiture, il n'y à pas de problème :
Vous louez un seul garage. Quand vous avez besoin d'une seule variable, pas de problème non plus.
Mais si tout à coup vous avez 10 ou 50 voitures à caser, chacune dans un garage, vous pouvez
recherchez 10 ou 50 garages différents, mais ce sera long et difficile. Vous allez plutôt essayer de
louer un parking composé de garages les uns à côté des autres.
Le parking aura un nom, et chaque garage le composant sera numéroté. En programmation, c'est pareil
: Si vous avez besoin de plusieurs variables les unes à côté des autres (par exemple, la température du
1.1.2000, du 2.1.2000, du 3.1.2000, etc. jusqu'au 31 janvier), vous pourriez donc déclarer 31 variables
qui s'appelleront par exemple 1Janvier, 2Janvier, 3Janvier, etc. jusqu'à 31Janvier... N'est-ce pas
lourd ?
En fait, on pourrait simplement faire comme le parking : C'est à dire déclarer une variable qui
s'appellerait Janvier, et qui serait suivie d'un numéro pour savoir de quel jour il s'agit, comme ceci :
Janvier[1], Janvier[2], etc. jusqu'à Janvier[31]. Cette variable Janvier s'appelle un TABLEAU. Il faut
donc, dans ce cas, DECLARER un TABLEAU.
11
Exemple basique
Sub Tableau()
Dim Armoire(3)
Armoire(1) = "Assiette"
Armoire(2) = "Verre"
Armoire(3) = "Serviette"
MsgBox Armoire(1)
MsgBox Armoire(2)
MsgBox Armoire(3)
End Sub
Sub tableauV2()
Dim Tableau(1 To 10) As Integer
' Tableau(3) = "test" Génère une erreur
Tableau(4) = 775
End Sub
Sub TableauV3()
Dim Tableau()
NombreCase = Val(InputBox("Combien d'éléments voulez-vous ?"))
ReDim Tableau(15)
End Sub
Remplissage d'un tableau de taille personnalisée avec toujours 33 dans chaque élément
Sub TableauV4()
Dim Etagere() As Integer
Dim NombreCase As Integer
NombreCase = Val(InputBox("Combien d'éléments voulez-vous ?"))
ReDim Etagere(NombreCase)
For compteur = 1 To NombreCase
NombreCase (compteur = 33)
Next
End Sub
12
Remplissage d'un tableau de taille personnalisée avec l'aide de l'utilisateur
Sub TableauV5()
Dim Etagere() As Integer
Dim NombreCase As Integer
NombreCase = Val(InputBox("Combien d'éléments voulez-vous ?"))
ReDim Etagere(NombreCase)
For compteur = 1 To NombreCase
NombreCase = InputBox("Entrez le nombre N°" & compteur & " : ")
Next
End Sub
Sub TableauV6()
Dim Etagere() As Integer
Dim NombreCase As Integer
NombreCase = Val(InputBox("Combien d'éléments voulez-vous ?"))
ReDim Etagere(NombreCase)
For compteur = 1 To NombreCase
Etagere(compteur) = InputBox("Entrez le nombre N°" & compteur &
" : ")
Next
For compteur = 1 To NombreCase
[Link] Etagere(compteur)
[Link]
Next
End Sub
Sub TableauV7()
Dim Etagere() As Integer
Dim NombreCase As Integer
NombreCase = Val(InputBox("Combien d'éléments voulez-vous ?"))
ReDim Etagere(NombreCase)
For compteur = 1 To NombreCase
Etagere(compteur) = InputBox("Entrez le nombre N°" & compteur &
" : ")
Next
For compteur = 1 To NombreCase
13
[Link] Etagere(compteur)
[Link]
Next
Dim LePlusGrand As Integer
LePlusGrand = 0
For compteur = 1 To NombreCase
If Etagere(compteur) > LePlusGrand Then
LePlusGrand = Etagere(compteur)
End If
Next
[Link] "Le plus grand est " & LePlusGrand
End Sub
Sub TestInputBox()
Dim Reponse As String
Reponse = InputBox("Entrez votre prénom")
MsgBox Reponse
End Sub
Dans ce cas, on constate que comme il s'agit d'un String, Le + colle ensemble le prenom deux fois
(4545)
Sub Collage()
Dim Reponse As String
Reponse = InputBox("Entrez votre prénom")
Reponse = Reponse + Reponse
MsgBox Reponse
End Sub
14
Sub Collage2()
Dim Reponse As Integer
Reponse = InputBox("Entrez votre prénom")
Reponse = Reponse + Reponse
MsgBox Reponse
End Sub
Ici, le & colle dans TOUS LES CAS : 4545 (qu'il s'agisse d'un Integer ou String)
Sub Collage3()
Dim Reponse As Integer
Reponse = InputBox("Entrez votre prénom")
Reponse = Reponse & Reponse
MsgBox Reponse
End Sub
Sub Collage4()
Dim Reponse As String
Reponse = InputBox("Entrez votre prénom")
Reponse = "Tu t'appelles" & Reponse & "Tu es le meilleur"
MsgBox Reponse
End Sub
15
Premier programme : Simple utilisation de InputBox, sans autre
Sub TestLoop()
Dim Reponse As Integer
Reponse = InputBox("Entrez un chiffre")
End Sub
Ce programme demande un chiffre encore et encore tant que l'utilisateur s'évertue a entrer un autre
chiffre que 5
Sub TestLoop2()
Dim Reponse As Integer
Do
Reponse = InputBox("Entrez un chiffre")
Loop While Reponse <> 5
End Sub
Sub TestLoop3()
Dim Reponse As Integer
Do
Reponse = InputBox("Entrez un chiffre")
Loop While Reponse = 5
End Sub
On ajoute ici du code avant la boucle, et après, simplement pour montrer comment généralement un
programme se déroule : Une partie d'introduction, la boucle elle-même et ensuite, la conclusion.
Sub TestLoop4()
Dim Reponse As Integer
MsgBox "Début" ' Une seule fois avant la boucle
Do
Reponse = InputBox("Entrez un chiffre")
Loop While Reponse = 5
16
Avec Do While, le programme n'entre pas nécessairement dans la boucle. Si on entre le bon mot de
passe immédiatement, le programme s'arrête. Dans l'exemple d'avant on faisait DO quelque chose
WHILE une condition, donc on faisait au moins une fois cette chose, tandis qu'ici, c'est DO WHILE
une condition, on fait quelque chose. Le programme regarde IMMEDIATEMENT si la condition est
satisfaite
Sub TestLoop5()
Dim Reponse As String
Reponse = InputBox("Entrez le mot de passe")
Ici, par contre, avec le while a la fin de la boucle, le' programme fait AU MOINS une fois "Mauvaise
réponse",' meme si l'utilisateur répond tout de suite bien
Sub TestLoop6()
Dim Reponse As String
Reponse = InputBox("Entrez le mot de passe")
Do
Reponse = InputBox("Mauvaise réponse. Essayez encore")
Loop While Reponse <> "youpi"
End Sub
Ici, le principe est le même, mais on utilise UNTIL (Jusqu'a ce que). En fait, on peut passe toute sa vie
de programme en utilisant exclusivement WHILE sans jamais utiliser UNTIL. Il suffit de changer la
tournure de phrase. WHILE Reponse = "youpi" veut dire exactement la même chose que UNTIL
Reponse <> "youpi", Mais dans certains cas, c'est plus pratique d'utiliser WHILE, et dans d'autres cas
UNTIL, mais c'est très subjectif.
Sub TestLoop7()
Dim Reponse As String
Reponse = InputBox("Entrez le mot de passe")
Do Until Reponse = "youpi"
Reponse = InputBox("Mauvaise réponse. Essayez encore")
Loop
End Sub
17
Application complète de boucles pour l'obtention d'un mot de passe. On fait une première demande de
mot de passe : "Entrez le mot de passe". Et seulement si l'utilisateur se plante au premier
essai, on lui signale qu'il s'est trompé ("Mauvaise réponse. Essayez encore"), et ce
message, il va le voir jusqu'à ce qu'il arrête de se tromper (1 fois, 5 fois ou mille fois s'il est vraiment
très maladroit, ou s'il a la maladie de parkinson.). A la fin, quand il a enfin tapé le bon mot de passe, le
programme lui dit en combien d'essais il a trouvé.
Sub MotPasse()
' Déclaration des variables
Dim Reponse As String ' Contient l'essai de mot de passe
Dim NombreEssai As Integer ' Compte les essais
Pseudo-code
Affichage de bonjour à l'écran 10 fois.
18
POUR Ctr = 1 Jusqu'à 10
AFFICHE "Bonjour"
SUIVANT Ctr
REPETE
AFFICHE "Bonjour"
AFFICHE "Voulez-vous continuer ?"
ACCEPTE Reponse
JUSQU'A CE QUE Reponse = "non"
Visual Basic
Version simple : affichage une seule fois de bonjour
Sub AfficherBonjour()
[Link] "Bonjour"
End Sub
Sub AfficherBonjour5FoisV1()
[Link] "Bonjour"
[Link] "Bonjour"
[Link] "Bonjour"
[Link] "Bonjour"
[Link] "Bonjour"
End Sub
19
Sub AfficherBonjour5FoisV2()
For Ctr = 1 To 5
[Link] "Bonjour"
Next
End Sub
Sub AfficherBonjour5FoisV3()
[Link] "Bonjour"
[Link]
[Link] "Bonjour"
[Link]
[Link] "Bonjour"
[Link]
[Link] "Bonjour"
[Link]
[Link] "Bonjour"
[Link]
End Sub
Sub AfficherBonjour5FoisV4()
For Ctr = 1 To 5
[Link] "Bonjour"
[Link]
Next
End Sub
20
Sub AfficherBonjourTantQueOui()
Do
Reponse = InputBox("Voulez-vous afficher Bonjour ?")
[Link] "Bonjour"
[Link]
Loop While Reponse = "oui"
End Sub
Sub AfficherBonjourJusqueNon()
Do
Reponse = InputBox("Voulez-vous afficher Bonjour ?")
[Link] "Bonjour"
[Link]
Loop Until Reponse = "non"
End Sub
Sub AfficherBonjourTantQueOuiV2()
Reponse = InputBox("Voulez-vous afficher Bonjour ?")
Do While Reponse = "oui"
[Link] "Bonjour"
[Link]
Reponse = InputBox("Voulez-vous continuer à afficher Bonjour ?")
Loop
End Sub
21
Sub AfficherBonjourJusqueNonV2()
Reponse = InputBox("Voulez-vous afficher Bonjour ?")
Do Until Reponse = "non"
[Link] "Bonjour"
[Link]
Reponse = InputBox("Voulez-vous continuer à afficher Bonjour ?")
Loop
End Sub
Utilisation d'Exit Do
Sub ExitDo()
Do
Reponse = InputBox("Voulez vous écrire Bonjour à l'écran ?")
If Reponse <> "oui" Then
Exit Do
End If
[Link] "Bonjour"
[Link]
Loop
End Sub
Pseudo-code
Le programme réduit à sa plus simple expression
ACCEPTE NombreAnnee
Affiche NombreAnnee * 365 * 24 * 60 * 60
Visual Basic
Cette version génère un dépassement de capacité
Sub NombreSecondeAnnee()
Dim NombreAnnee As Integer
NombreAnnee = InputBox("Combien d'années ?")
22
MsgBox NombreAnnee * 365 * 24 * 60 * 60
End Sub
Sub NombreSecondeAnneeV2()
Dim NombreAnnee As Integer
Dim NombreSeconde As Currency
NombreAnnee = InputBox("Combien d'années ?")
NombreSeconde = CCur(NombreAnnee) * 365 * 24 * 60 * 60
MsgBox NombreSeconde
End Sub
Version qui exige un nombre entre 1 et 100, et qui donne un résultat plus convivial
Sub NombreSecondeAnneeV3()
Dim NombreAnnee As Integer
Dim NombreSeconde As Currency
NombreAnnee = InputBox("Combien d'années ? (1 - 100)")
Do While NombreAnnee < 1 Or NombreAnnee > 100
NombreAnnee = InputBox("Nombre invalide. Combien d'années ? (1 -
100)")
Loop
NombreSeconde = CCur(NombreAnnee) * 365 * 24 * 60 * 60
MsgBox "Dans " & NombreAnnee & ", il y a " & NombreSeconde
End Sub
Sub NombreSecondeAnneeV4()
Dim NombreAnnee As Integer
Dim NombreSeconde As Currency
NombreAnnee = Val(InputBox("Combien d'années ? (1 - 100)"))
Do While NombreAnnee < 0 Or NombreAnnee > 100
NombreAnnee = Val(InputBox("Nombre invalide. Combien d'années ?
(1 - 100)"))
Loop
If NombreAnnee = 0 Then
MsgBox "Vous n'avez pas entré d'années !"
Else
NombreSeconde = CCur(NombreAnnee) * 365 * 24 * 60 * 60
23
MsgBox "Dans " & NombreAnnee & " ans, il y a " & NombreSeconde &
" secondes."
End If
End Sub
Change de monnaie
Ce programme permet d'entrer une somme en francs suisses, et d'obtenir le résultat en argent
étranger.
Pseudo-code
AFFICHE "Entrez la somme en francs suisses : "
ACCEPTE CHF
AFFICHE "Entrez le nom de la monnaie étrangère : "
ACCEPTE NomArgent
AFFICHE "Pour un franc suisse, combien obtenez vous de " NomArgent "
?"
ACCEPTE TauxChange
Resultat = CHF * TauxChange
AFFICHE "Pour " CHF "francs suisses, vous obtenez " Resultat " "
NomArgent
Visual Basic
Change de 100 CHF en lires, avec un taux de 300
Sub ChangeMonnaie()
MsgBox "Pour 100 CHF, vous aurez " & 100 * 300 & " lires"
End Sub
Sub ChangeMonnaieV2()
Dim CHF As Integer
CHF = Val(InputBox("Combien de francs suisses changez vous ?"))
MsgBox "Pour " & CHF & " francs suisses, vous aurez " & CHF * 300
& " lires"
End Sub
24
Sub ChangeMonnaieV3()
Dim CHF As Integer
CHF = Val(InputBox("Combien de francs suisses changez vous ?"))
ValeurChange = Val(InputBox("Pour 1 CHF, combien obtenez-vous de
lires"))
MsgBox "Pour " & CHF & " francs suisses, vous aurez " & CHF *
ValeurChange & " lires"
End Sub
Sub ChangeMonnaieV4()
Dim CHF As Integer
Dim MonnaieEtrangere As String
Dim ValeurChange As Currency
MsgBox "Pour " & CHF & " francs suisses, vous aurez " & CHF *
ValeurChange & " " & MonnaieEtrangere
End Sub
Exercice : Il faudrait que d'un montant en francs suisses, on aie la correspondance en plusieurs autes
monnaies : une ou deux autres, ou même mieux : Un nombre indéterminé de monnaies
Pseudo-code
NbATrouver = Hasard (1 à 1000)
FlagTrouve = FAUX
TANT QUE FlagTrouve = FAUX
AFFICHE "Entre un nombre : "
ACCEPTE Essai
SI Essai = Nombre ALORS
FlagTrouve = VRAI
25
FIN SI
FIN TANT QUE
AFFICHE "BRAVO. Tu as trouvé"
AMELIORATIONS :
Visual Basic
Génération d'un nombre aléatoire entre 1 et 100 : Utilisation de la fonction RND
Sub NombreAleatoire()
NombreAuHasard = Rnd ' Nombre entre 0 et 1 (0.7894654)
MsgBox NombreAuHasard
NombreAuHasard = NombreAuHasard * 100 ' Nombre entre 0 et 99, avec
des décimales (78.94654)
MsgBox NombreAuHasard
NombreAuHasard = Int(NombreAuHasard) ' Nombre entre 0 et 99 sans
décimales (78)
MsgBox NombreAuHasard
NombreAuHasard = NombreAuHasard + 1 ' Nombre entre 1 et 100 sans
décimales (79)
MsgBox NombreAuHasard
Sub NombreAleatoireV2
NombreAuHasard = Int((100 * Rnd) + 1) ' (79)
End Sub
Sub UtilisationEtCommercial()
Dim Nom As String, Prenom As String, Age As Integer
26
Nom = InputBox("Entrez votre nom")
Prenom = InputBox("Entrez votre Prénom")
Age = InputBox("Entrez votre age")
MsgBox "Vous vous appelez " & Prenom & " " & Nom & ". Vous avez "
& Age & " ans"
End Sub
Utilisation du if
Sub TropGrandTropPetitV1()
NombreATrouver = Int((1000 * Rnd) + 1)
Proposition = InputBox("Faites une propostion")
If Proposition = NombreATrouver Then
MsgBox "Vous avez trouvé le bon nombre"
End If
End Sub
Sub TropGrandTropPetitV2()
Dim NombreATrouver As Integer
NombreATrouver = Int((1000 * Rnd) + 1)
Proposition = InputBox("Faites une propostion (" & NombreATrouver
& ")")
If Proposition > NombreATrouver Then
MsgBox "Nombre trop grand"
Else:
MsgBox "Nombre trop petit"
End If
End Sub
Sub SelectCase()
Dim Nombre
Nombre = 8
Select Case Nombre
Case Is <= 5
MsgBox "Entre 1 et 5"
Case 6, 7, 8
MsgBox "Entre 6 et 8"
27
Case 9 To 10
MsgBox "9 ou 10"
Case Else
MsgBox "Plus grand que 10"
End Select
End Sub
Utilisation du Select ... Case dans le jeu du plus grand plus petit
Sub TropGrandTropPetitV3()
Dim NombreATrouver As Integer
NombreATrouver = Int((1000 * Rnd) + 1)
Proposition = InputBox("Faites une propostion (" & NombreATrouver
& ")")
Select Case Proposition
Case Is < NombreATrouver
MsgBox "trop petit"
Case Is > NombreATrouver
MsgBox "trop grand"
Case NombreATrouver
MsgBox "GAGNE !!!"
End Select
End Sub
Sub TropGrandTropPetitV4()
Dim NombreATrouver As Integer, Proposition As Integer
NombreATrouver = Int((1000 * Rnd) + 1)
MsgBox NombreATrouver
Proposition = 0
28
Loop
End Sub
Sub TropGrandTropPetitV5()
Dim NombreATrouver As Integer, Proposition As Integer,
NombreEssais As Integer
NombreATrouver = Int((1000 * Rnd) + 1)
Proposition = 0
NombreEssais = 0
Sub TropGrandTropPetitV6()
Dim NombreATrouver As Integer, Proposition As Integer,
NombreEssais As Integer, Recommencer As String
Recommencer = "oui"
29
Case Is < NombreATrouver
MsgBox "trop petit"
Case Is > NombreATrouver
MsgBox "trop grand"
Case NombreATrouver
MsgBox "GAGNE en " & NombreEssais & " essais !!!"
End Select
Loop ' Entrer une autre proposition
Recommencer = InputBox("Voulez-vous recommencer ?")
Loop ' Recommencer le jeu
End Sub
30
MsgBox InStr(0, "abc", "B", 1)
End Sub
Sub CompteVoyelle()
Dim Phrase As String
Phrase = "Ceci est une phrase"
For Compteur = 1 To Len(Phrase)
MsgBox Mid(Phrase, Compteur, 1)
Next
End Sub
31
Comptage des e
Sub CompteVoyelleV2()
Dim Phrase As String
Dim NombreE As Integer
Sub CompteVoyelleV3()
Dim Phrase As String
Dim NombreVoyelle As Integer
Sub CompteVoyelleV4()
Dim Phrase As String
Dim NombreVoyelle As Integer
Dim A, E, I, O, U, Y
32
A = 0
E = 0
I = 0
O = 0
U = 0
Y = 0
[Link] "Il y a " & A & " A dans " & Phrase
[Link]
[Link] "Il y a " & E & " E dans " & Phrase
[Link]
[Link] "Il y a " & I & " I dans " & Phrase
[Link]
[Link] "Il y a " & O & " O dans " & Phrase
[Link]
[Link] "Il y a " & U & " U dans " & Phrase
[Link]
[Link] "Il y a " & Y & " Y dans " & Phrase
[Link]
End Sub
Améliorations possibles :
- Compter toutes les lettres de l'alphabet
- N'afficher que les lettres présentes
- Montrer la lettre la plus courante
- Laisser le choix de la phrase à l'utilisateur
- Plus difficile : Compter le nombre de mots d'une phrase
Pseudo-code
33
AFFICHE "Entre une phrase quelconque : "
ACCEPTE Phrase
POUR Ctr = LONGUEUR (Phrase) JUSQU'A 1
AFFICHE Phrase[Ctr]
SUIVANT Ctr
Visual Basic
Sub PhraseALenvers()
Dim Phrase As String
Dim PhraseEnvers As String
Phrase = "Tu l'as trop écrasé, César, ce port-salut"
For compteur = Len(Phrase) To 1 Step -1
PhraseEnvers = PhraseEnvers & Mid(Phrase, compteur, 1)
Next
MsgBox PhraseEnvers
End Sub
Améliorations :
34
Pas de chance... Il n'y en a aucun. Bon on continue avec les 4. On va trouver 4X2 = 8, puis avec les 5 il
n'y en a aucun, avec les 6 non plus, les 7 non plus, les 8 : Il y en a 1 : 8X1 = 8.
Bon alors comment on met ça en route ? avec une boucle imbriquée, comme ceci
Pseudo-code
AFFICHE "Entre le nombre à analyser"
ACCEPTE Nombre
POUR Ctr = 1 JUSQUA Nombre
POUR Ctr2 = Ctr JUSQUA Nombre
SI Ctr * Ctr2 = Nombre
AFFICHE Ctr " fois " Ctr2 " égale " Nombre
FIN SI
SUIVANT Ctr2
SUIVANT Ctr
Améliorations possibles :
Visual Basic
Message Box successifs
Sub Diviseur()
Dim QuelNombre As Long
Dim Ctr As Long
Dim Ctr2 As Long
QuelNombre = Val(InputBox("Quel nombre voulez-vous analyser ?"))
For Ctr = 1 To QuelNombre
For Ctr2 = 1 To QuelNombre
If Ctr * Ctr2 = QuelNombre Then
MsgBox Ctr & " est diviseur de " & QuelNombre
End If
Next Ctr2
Next Ctr
End Sub
35
Sub DiviseurV2()
Dim QuelNombre As Long
Dim Ctr As Long
Dim Ctr2 As Long
Dim ListeDiviseur(1000)
Dim Flag As Long
Flag = 0
QuelNombre = Val(InputBox("Quel nombre voulez-vous analyser ?"))
For Ctr = 1 To QuelNombre
For Ctr2 = 1 To QuelNombre
If Ctr * Ctr2 = QuelNombre Then
Flag = Flag + 1
ListeDiviseur(Flag) = Ctr
End If
Next Ctr2
Next Ctr
Stockage dans un tableau de taille variable avec ReDim (pour optimiser la place mémoire)
L'utilisation de Preserve évite d'effacer chaque fois le tableau
Sub DiviseurV3()
Dim QuelNombre As Long
Dim Ctr As Long
Dim Ctr2 As Long
Dim ListeDiviseur()
Dim Flag As Long
Flag = 0
QuelNombre = Val(InputBox("Quel nombre voulez-vous analyser ?"))
For Ctr = 1 To QuelNombre
For Ctr2 = 1 To QuelNombre
If Ctr * Ctr2 = QuelNombre Then
Flag = Flag + 1
ReDim Preserve ListeDiviseur(Flag + 1)
ListeDiviseur(Flag) = Ctr
End If
Next Ctr2
Next Ctr
36
For Ctr = 1 To Flag
[Link] ListeDiviseur(Ctr)
[Link]
Next
End Sub
Si le nombre n'est divisible que par 1 et par lui même (23 par exemple), il est premier.
Nous allons l'indiquer
Sub DiviseurV4()
Dim QuelNombre As Long
Dim Ctr As Long
Dim Ctr2 As Long
Dim ListeDiviseur()
Dim Flag As Long
Flag = 0
QuelNombre = Val(InputBox("Quel nombre voulez-vous analyser ?"))
For Ctr = 1 To QuelNombre
For Ctr2 = 1 To QuelNombre
If Ctr * Ctr2 = QuelNombre Then
Flag = Flag + 1
ReDim Preserve ListeDiviseur(Flag + 1)
ListeDiviseur(Flag) = Ctr
End If
Next Ctr2
Next Ctr
If Flag = 2 Then
[Link] QuelNombre & " est un nombre premier que rien
ne divise."
[Link]
Else
For Ctr = 1 To Flag
[Link] ListeDiviseur(Ctr)
[Link]
Next
End If
End Sub
37
Jusqu'ici, nous avons utilisé 2 boucles imbriquées pour voir si un nombre multiplié par un autre donne
le résultat recherché. En fait, on gaspille un temps de programmation précieux. Nous avons la
possibilité d'utiliser la fonction MOD (Modulo). MOD permet de trouver le reste d'une division. Par
exemple 15 MOD 2= 1. Parce que 15/2 = 7, mais il reste 1 (7*2 = 14 + ce fameux 1) = 15. Ca à l'air
idiot comme ça, mais dans notre cas, ça va nous rendre de précieux services. Par exemple, si on
cherche les diviseurs de 20 :
ça ne sert à rien d'aller plus loin que la moitié. On se doute bien que 20 n'est pas divisible par
11,12,13,14,15,16,17,18 ni 19. En fait, avec ce MOD, on constate simplement que lorsque le modulo =
0, 20 est divisible par ce nombre (2, 4, 5 et 10). Voici une version largement plus rapide du
programme de recherche des diviseurs :
Sub DiviseurOptimise()
Dim QuelNombre As Long
Dim Ctr As Long
QuelNombre = Val(InputBox("Quel nombre voulez-vous analyser ?"))
' Nous partons de 2, parce que ça ne sert a rien de tester 1,
' et on va jusqu'à la moitié du nombre, car on sait qu'il n'y a
plus aucun diviseur après.
For Ctr = 2 To QuelNombre / 2
If QuelNombre Mod Ctr = 0 Then
MsgBox Ctr & " est diviseur de " & QuelNombre
End If
Next Ctr
End Sub
Sub et Function
Premier appelle Deuxieme
Sub Premier()
MsgBox "Je suis dans Premier"
38
Deuxieme
End Sub
Sub Deuxieme()
MsgBox "Je suis dans Deuxieme"
End Sub
Sub Troisieme()
MsgBox "Premiere phrase"
Exit Sub
MsgBox "Deuxième Phrase phrase"
End Sub
Sub Quatrieme()
MsgBox "Phrase 1, Quatrieme"
Cinquieme
MsgBox "Phrase 2, Quatrieme"
End Sub
Sub Cinquieme()
MsgBox "Phrase 1, Cinquieme"
Exit Sub
MsgBox "Phrase 2, Cinquieme"
End Sub
Sub Sixieme()
Septieme 44
End Sub
Sub Septieme(LeParametre)
MsgBox "Sixieme vient de m'envoyer " & LeParametre
End Sub
39
Utilisation de 2 paramètres
Sub Huitieme()
Neuvieme 32, "Chat"
End Sub
Sub Proc1()
Dim Armoire(2)
Armoire(1) = "Bidule"
Armoire(2) = "machin"
Proc2 Armoire
MsgBox Armoire(2) ' Coucou et pas machin !
End Sub
Sub Proc2(MonTab())
MsgBox MonTab(1) ' Bidule
MonTab(2) = "Coucou"
End Sub
Sub Dixieme()
MsgBox Onzieme
End Sub
Function Onzieme()
Onzieme = 32
End Function
Sub Douzieme()
MsgBox LeDouble(34)
End Sub
40
Function LeDouble(QuelNombre)
LeDouble = QuelNombre * 2
End Function
Sub Treizieme()
MsgBox Additionne(4, 6)
End Sub
Sub Quatorzieme()
MsgBox ChiffreEnLettre(3)
End Sub
Function ChiffreEnLettre(QuelChiffre)
Select Case QuelChiffre
Case 1: ChiffreEnLettre = "Un"
Case 2: ChiffreEnLettre = "Deux"
Case 3: ChiffreEnLettre = "Trois"
Case Else: ChiffreEnLettre = "##ERREUR##"
End Select
End Function
Appel à une fonction nettement plus élaborée, qui renvoie le chiffre en anglais ou en français
Sub Quinzieme()
MsgBox ChiffreEnLettreAnglaisFrancais(3, "Anglais")
MsgBox ChiffreEnLettreAnglaisFrancais(2, "Français")
MsgBox ChiffreEnLettreAnglaisFrancais(66, "Français")
MsgBox ChiffreEnLettreAnglaisFrancais(66, "Anglais")
MsgBox ChiffreEnLettreAnglaisFrancais(2, "Italien")
End Sub
41
Case "Français":
Select Case QuelChiffre
Case 1: ChiffreEnLettreAnglaisFrancais = "Un"
Case 2: ChiffreEnLettreAnglaisFrancais = "Deux"
Case 3: ChiffreEnLettreAnglaisFrancais = "Trois"
Case 4: ChiffreEnLettreAnglaisFrancais = "Quatre"
Case Else: ChiffreEnLettreAnglaisFrancais = "NOMBRE INCONNU"
End Select
Case "Anglais"
Select Case QuelChiffre
Case 1: ChiffreEnLettreAnglaisFrancais = "One"
Case 2: ChiffreEnLettreAnglaisFrancais = "Two"
Case 3: ChiffreEnLettreAnglaisFrancais = "Three"
Case 4: ChiffreEnLettreAnglaisFrancais = "Four"
Case Else: ChiffreEnLettreAnglaisFrancais = "NUMBER UNKNOWN"
End Select
Case Else
ChiffreEnLettreAnglaisFrancais = "LANGUE INCONNUE"
End Select
ChiffreEnLettreAnglaisFrancais = ChiffreEnLettreAnglaisFrancais
End Function
Vous avez cliqué sur un lien qui était censé vous afficher une page web, et vous tombez ici !!!
C'est ce qu'on appelle une "Erreur 404". Vous allez donc recevoir une amende de 1'000 euros pour
avoir osé générer cette erreur !
Bon, trêve de plaisanterie, il est possible que j'aie renommé ou déplacé une page web, ou que je me
sois trompé dans l'orthographe... C'est à dire que la page demandée n'a pas le nom attendu par le lien
sur lequel vous avez cliqué...
Bref, vous n'en pouvez absolument rien, je vous rassure, vous n'avez rien cassé ;-)
Vous pourriez vous dire que les webmasters devraient être plus soigneux, et contrôler leurs liens !!!
Oui, mais vous n'imaginez pas le travail de fourmi que de tout vérifier tout le temps... Croyez-moi,
c'est vraiment difficile d'éviter les "fausses routes"... Vous en trouverez même chez des grands tels que
Yahoo ou Microsoft...
Allez, soyez sympa, puisque vous avez débusqué une erreur, envoyez-moi un petit e-mail sur
mdefawes@[Link] que je puisse la réparer (Cliquez sur le bouton "Précédent", copiez
42
l'adresse (qui commence par [Link] et envoyez-la moi en me disant sur quoi vous
avez cliqué qui ne marche pas... Ca permettra d'éviter aux dix milliards de visiteurs suivant de
retomber sur le même lien cassé (Ouiiii dix milliards, j'exagère un peu, je sais :-)
43