Vous êtes sur la page 1sur 75

KASHEMA Aïda Prof: C.

MAULE 2023-2024

Cours de VBA Excel


19/09/2023

INTRODUCTION

Comment accéder à VBA :


Excel → Option → Personnaliser le ruban → Cocher « Développeur » → Cliquer sur l’onglet
« Développeur » → Cliquer sur « Visual Basic » → Clique droit Feuille → Module →
Insertion→ Taper « Option Explicit » en 1ère ligne de code
Sauvegarder (changement d’enregistrement) :
- Sélectionner « Classeur Excel (prenant en charge les macros) » → .xlsm

Le Sub est une procédure qui n’a pas de valeur retour.


Il est aussi utilisé pour définir des sous-procédures effectuant des tâches spécifiques
dans VBA (elles sont ensuite appelées pour exécuter des actions définies) (from
ChatGpt).
Début : Sub test()
Fin : End Sub

Faire un commentaire → commencer par une apostrophe


Mettre en gras → ActiveCell.Font.Bold = True permet d’affecter le style gras à la
cellule sélectionnée

Cells(n°ligne, n°colonne).Value

Range(« coordonnée de la cellule »).Value


Entrer des données dans une cellule
Exemple technique cells :
Sub test()
'envoyer dans la cellule C4 des données: 1234
Cells(4, 3).Value = 1234
End Sub

Exemple technique range :


Sub test()
'envoyer dans la cellule C4 des données: 1234
Range("C5").Value = 1234
End Sub

Faire une operation arithmétique:


Sub test()

'envoyer dans la cellule C4 des données: 1234


Cells(4, 3).Value = 1234
Range("C5").Value = 1234

'recuperer le contenu de A4 et le diviser par 2

Cells(4, 1).Value = Cells(4, 1).Value / 2


End Sub

Faire un calcul arithmétique


Sub test()

'envoyer dans la cellule C4 des données: 1234


Cells(4, 3).Value = 1234
Range("C5").Value = 1234

'recuperer le contenu de A4 et le diviser par 2


Range(“A4”).Value = Range(“A4”).Value / 2

End Sub
Faire un calcul arithmétique

Sub test()

'envoyer dans la cellule C4 des données: 1234


Cells(4, 3).Value = 1234
Range("C5").Value = 1234

'recuperer le contenu de A4 et le diviser par 2

Cells(4, 1).Value = Cells(4, 1).Value / 2


'calculer le carré de A4 et le mettre dans B4
Cells(4, 1).Value = 5
Cells(4, 2).Value = Cells(4, 1).Value * Cells(4, 1).Value
End Sub

Avec range:
Range(“B4”).value = range(“A4”).Value * range(“A4”).Value
Pour avoir la racine carrée
Range(“B4”).value = sqr((Range(“A4”).Value))

Ecrire du texte “Bonjour” + Copier le contenu d’une cellule dans une autre
cellule(C6→ D6)
Sub test()

'envoyer dans la cellule C4 des données: 1234


Cells(4, 3).Value = 1234
Range("C5").Value = 1234
Range("C6").Value = "Bonjour"
Range("D6").Value = Range("C6").Value

'recuperer le contenu de A4 et le diviser par 2

Cells(4, 1).Value = Cells(4, 1).Value / 2


'calculer le carré de A4 et le mettre dans B4
Cells(4, 1).Value = 5
Cells(4, 2).Value = Cells(4, 1).Value * Cells(4, 1).Value

End Sub

Créer des macros


Enregister une macro
Sélectionner la cellule + Modification (exemple : Changer la couleur)

Accéder
Retourner dans Visual et sélectionner le Module 2

Déplacer le contenu d’une cellule dans une cellule d’une autre feuille
➔ Utiliser Le point d’exclamation pour indiquer que c’est une feuille

Sub testmultifeuille()
'recopier A1 de la feuille client vers A1 de la feuille produit
Range("produits!A1").Value = Range("clients!A1").Value

End Sub

Autre technique
Sub testmultifeuille()
'recopier A1 de la feuille client vers A1 de la feuille produit
Range("produits!A1").Value = Range("clients!A1").Value

'idem avec cells


Worksheets("produits").Cells(2, 1).Value = Worksheets("clients").Cells(2, 1).Value
End Sub

Tt ce qui sera executer dans une feuille → Activate

Sub testmultifeuille()

'recopier A1 de la feuille client vers A1 de la feuille produit


Range("produits!A1").Value = Range("clients!A1").Value

'idem avec cells


Worksheets("produits").Cells(2, 1).Value = Worksheets("clients").Cells(2, 1).Value

'activation d'une feuille de calcul


Worksheets("produits").Activate
'dans la feuille de calcul produit
Range("A10").Value = 200
Range("B10").Value = 200

Worksheets("clients").Activate
'dans la feuille client
Range("A10").Value = 200
Range("B10").Value = 200
End Sub

➔ Faire un Worksheets (« nom de la feuille »). Activate pour savoir où va être


exécuter le code

Déclarer une variable

On utilise « dim » → Dimensionner une variable/ Réserver de l’espace en mémoire


pour stocker une variable

Sub testactivate()
Dim variable_compteur As Integer
Dim variable_chaine As String

End Sub

Rappel:
1 octet → 8bits (en anglais = byte)
1 tera → 1000 milliards d’octets
1 caractère =1 octet = 8 bits

Stocker une variable en mémoire pour la réutiliser :


Sub testactivate()

Dim variable_vrai_faux As Boolean


Dim variable_compteur As Integer
Dim variable_chaine As String

variable_compteur = 50
Range("A5").Value = variable_compteur
End Sub

Il faut rafraichir le contenu de la variable :


Sub testactivate()

Dim variable_vrai_faux As Boolean


Dim variable_compteur As Integer
Dim variable_chaine As String

variable_compteur = 50

Range("A5").Value = variable_compteur
variable_compteur = variable_compteur + 1
'rafraichissement de A5 avec la nouvelle valeur
Range("A5").Value = variable_compteur

End Sub

Décrire un programme permettant de prendre 2 cellules et d’ intervertir les 2


valeurs contenues dans ces cellules (Swaper)
Utiliser une seule variable de type Integer
Maximum 4 lignes de code (sans les Sub)
A la base : C2 = 45 /// D2 = 60

Sub swaper()
Dim sumo As Integer
sumo = Range("C2").Value
Range("C2").Value = Range("D2").Value
Range("D2").Value = sumo
End Sub

26/09/2023

INTERRO -Correction
Consigne : Swaper les variables x et y (pas de range et cells)
X=5
Y = 10

Z=x
x=y
y=z

Correction dans VBA

Sub swap()

Dim x, y, z As Integer
x=5
y = 10

z=x
x=y
y=z

Debug.Print x
Debug.Print y
Debug.Print z

End Sub

Fenêtre d’exécution (onglet Affichage):


10
5
5
Effacer le contenu d’une cellule :
Sub effacer()
Range("A1).Select
Selection.Clear

End Sub

Effacer le contenu de plusieurs cellules


Sub effacer()
Range("A1:D1).Select
Selection.Clear

End Sub
Avec les Cellules B1 et B2 (même exo)
Sub swapB1B2()

Dim sumo As Integer


sumo = Range("B1").Value
Range("B1").Value = Range("B2").Value
Range("B2").Value = sumo

End Sub
Avec un “String”
Sub swapC1C2()

Dim x As String
X = Range("C1").Value
Range("C1").Value = Range("C2").Value
Range("C2").Value = x
End Sub

Sauvegarder uniquement le code


Clique droit Module → Exporter→ NomDuFichier.bas

Les CONDITIONS

Ecrire un message
Sub IF_THEN()
If 3 > 2 Then
MsgBox "3 est plus grand que 2"
End If

End Sub

Ecrire un message avec Else

Sub IF_THEN()

If 3 > 2 Then
MsgBox "3 est plus grand que 2"
Else
MsgBox "condition du if non validée"
End If
End Sub

Sub compareA1A2()

If Range("A1").Value > Range("A2").Value Then


MsgBox "A1 est plus grand que A2"

Else
MsgBox "A2 est plus grand que A1"
End If

End Sub
Avec Elseif
Sub compareA1A2()

If Range("A1").Value > Range("A2").Value Then


MsgBox "A1 est plus grand que A2"

ElseIf (Range("A2").Value > Range("A1").Value) Then


MsgBox "A2 est plus grand que A1"

Else
MsgBox "A1 = A2"
End If

End Sub

➔ If fermé par un « End If »


Les BOUCLES

Il existe 6 sortes de boucles en VBA mais on utilisera que 3 types


de boucle :
While / For / Do While

EXERCICE : compter le nombre de a dans les 5ères cellules de la


colonne F (sans boucles juste if)

Sub compter_les_a_dans_F()

Dim compteur As Integer


Dim lettre As String

compteur = 0
lettre = "a"

If Range("F1").Value = lettre Then


compteur = compteur + 1

End If

If Range("F2").Value = lettre Then


compteur = compteur + 1

End If

If Range("F3").Value = lettre Then


compteur = compteur + 1

End If
If Range("F4").Value = lettre Then
compteur = compteur + 1

End If

If Range("F5").Value = lettre Then


compteur = compteur + 1

End If
MsgBox "il y a " & compteur & " lettres a"
End Sub

DEVOIR pour le 03/10 - EXERCICE :On a 3 nombres : 10 , 11 et 12 →


afficher le plus grand des 3 nombres

03/10/2023
Devoir (ma réponse) :
Sub le_plus_grand()

Dim nb1 As Integer


Dim nb2 As Integer
Dim nb3 As Integer

nb1 = 10
nb2 = 11
nb3 = 12

If (nb1 > nb2) And (nb1 > nb3) Then


MsgBox "nb1 est le plus grand"

ElseIf (nb2 > nb1) And (nb2 > nb3) Then


MsgBox "nb2 est le plus grand"

Else
MsgBox "nb3 est le plus grand"
End If

End Sub

Avec les cellules

Sub le_plus_grand_dans_la_cellule()

If Range("A1").Value > Range("B1").Value And Range("A1").Value >


Range("C1").Value Then
MsgBox (Range("A1").Value & " est le plus grand")

ElseIf Range("B1").Value > Range("A1").Value And Range("B1").Value >


Range("C1").Value Then
MsgBox (Range("B1").Value & " est le plus grand")

Else
MsgBox (Range("C1").Value & " est le plus grand")
End If

End Sub

Mettre dans l’ordre décroissant

Sub du_plus_grand_au_plus_petit()

Dim nb1, nb2, nb3 As Integer

nb1 = 10
nb2 = 10
nb3 = 0

If (nb1 > nb2) And (nb1 > nb3) Then


If nb2 > nb3 Then
MsgBox nb1 & nb2 & nb3
Else
MsgBox nb1 & nb3 & nb2
End If

ElseIf (nb2 > nb1) And (nb2 > nb3) Then


If nb1 > nb3 Then
MsgBox nb2 & nb1 & nb3
Else
MsgBox nb2 & nb3 & nb1
End If
Else
If nb2 > nb1 Then
MsgBox nb3 & nb2 & nb1
Else
MsgBox nb3 & nb1 & nb2
End If
End If

End Sub

10/10/2023

Test VBA
Ecrire un programme qui affiche le produit négatif, positif ou nul SANS
PASSER PAR UN CALCUL DE PRODUIT

Sub produit_neg_pos()

Dim x As Integer
Dim y As Integer

x = -4
y=5

If (x < 0) And (y < 0) Then


MsgBox ("Produit positif")

ElseIf (x < 0) Or (y < 0) Then


MsgBox ("Produit négatif")

ElseIf (x = 0) Or (y = 0) Then
MsgBox ("Produit nul")

Else
MsgBox ("Produit positif")

End If

End Sub

Avec valeurs déjà dans les cellules

Sub produit_neg_pos()

Dim x As Integer
Dim y As Integer

x = Range("A1").Value

y = Range("B1").Value

If (x < 0) And (y < 0) Then


MsgBox ("Produit positif")

ElseIf (x < 0) Or (y < 0) Then


MsgBox ("Produit négatif")

ElseIf (x = 0) Or (y = 0) Then
MsgBox ("Produit nul")

Else
MsgBox ("Produit positif")

End If

End Sub

Afficher des nombres de 1 à 10


Sub compteur()

Dim compteur As Integer

For compteur = 1 To 10

'affichage du compteur
Debug.Print compteur

Next compteur
End Sub

Remplir une colonne avec des chiffres de 1 à 10

Sub compteur_colonne()

Dim compteur As Integer

For compteur = 1 To 10
'affichage du compteur
Debug.Print compteur
Cells(compteur, 1).Value = compteur

Next compteur

End Sub

Remplir une ligne avec des chiffres de 1 à 10

Sub compteur_colonne()

Dim compteur As Integer

For compteur = 1 To 10

'affichage du compteur
Debug.Print compteur
Cells(1, compteur).Value = compteur

Next compteur

End Sub

Afficher la table de 5 sur 10 lignes dans la 2e colonne

Sub table_cinq()
Dim compteur As Integer
For compteur = 1 To 10

'affichage du compteur
Debug.Print compteur
Cells(compteur, 2).Value = compteur * 5

Next compteur

End Sub

Remplir une ligne en DIAGONALE avec des chiffres de 1 à 10

Sub de_1à10_en_diagonale_vers_la_droite()

Dim compteur As Integer

For compteur = 1 To 10

'affichage du compteur
Debug.Print compteur
Cells(compteur, compteur).Value = compteur

Next compteur

End Sub
17/10/2023

Ecrire → Debug.int
Lire → InputBox

Tracer un carré de 10 sur 10

Sub tracer_carre()

Dim largeur, compteur As Integer


largeur = 9

For compteur = 1 To largeur

'bordure supérieure
Cells(1, compteur).Interior.Color = vbBlack

'bordure inférieure
Cells(9, compteur).Interior.Color = vbBlack

'bordure gauche
Cells(compteur, 1).Interior.Color = vbBlack

'bordure droite
Cells(compteur, 9).Interior.Color = vbBlack

'diagonale de gauche à droite


Cells(compteur, compteur).Interior.Color = vbBlack

'diagonale de droite à gauche


Cells(compteur, 10 - compteur).Interior.Color = vbBlack

Next compteur
End Sub

Faire un triangle à partir du coin inférieur droit du carré précédent

Sub ligne()

Dim largeur, compteur_ligne, compteur_colonne As Integer


largeur = 5

For compteur_ligne = 1 To largeur


For compteur_colonne = 1 To largeur

Cells(compteur_ligne, compteur_colonne) = compteur_colonne

Next compteur_colonne

Next compteur_ligne

End Sub
Ecrire de 1 jusqu’à 25

Sub ligne()

Dim largeur, compteur_ligne, compteur_colonne, chiffre As Integer


largeur = 5
chiffre = 1

For compteur_ligne = 1 To largeur

For compteur_colonne = 1 To largeur

Cells(compteur_ligne, compteur_colonne) = chiffre


chiffre = chiffre + 1

Next compteur_colonne

Next compteur_ligne

End Sub

DEVOIR : Faire un triangle à partir du coin inférieur droit du carré précédent


24/10/2023

Téléchargement de Freefdp sur Softonic :


https://freedfd.fr.softonic.com/telecharger
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++
Puis extraire tout et ouvrir la version anglaise
Afficher 1 à 10

Table de n’importe quel chiffre


Sub multi()

Dim nombre, compteur, chiffre As Integer

nombre = InputBox("Quelle table? ")

For compteur = 1 To 10 Step 1


chiffre = compteur * nombre
Debug.Print chiffre

Next compteur
End Sub
Faire une boucle imbriquée

Sub boucle_imbriq()

Dim ligne, colonne As Integer

For ligne = 1 To 4 Step 1


For colonne = 1 To 4

Debug.Print "ligne = " & ligne & "colonne = " & colonne

Next colonne
Next ligne
End Sub
'ligne = ' , ligne, 'colonne = ' , colonne
Afficher de 1 à 25

Afficher exposant 2
Sub expo_De_deux()

Dim ligne, colonne, chiffre As Integer

chiffre = 1

For ligne = 1 To 3 Step 1


For colonne = 1 To 3
Cells(ligne, colonne).Value = chiffre
chiffre = chiffre * 2

Next colonne
Next ligne

End Sub

Le damier

Sub damier()

Dim ligne, colonne, chiffre As Integer

chiffre = 1

For ligne = 1 To 9
For colonne = 1 To 9
Cells(ligne, colonne).Value = chiffre
chiffre = chiffre + 1
If chiffre Mod 2 = 0 Then

Cells(ligne, colonne).Interior.Color = vbBlack

Else
Cells(ligne, colonne).Interior.Color = vbYellow

End If

Next colonne
Next ligne

End Sub

DEVOIR : Faire une pyramide avec 2 boucles imbriquées

07/11/2023
Faire un carré

Sub carre25()

Dim hauteur, colonne, ligne As Integer

hauteur = 10

For ligne = 1 To hauteur


For colonne = 1 To hauteur
Debug.Print ligne, " ", colonne
Next colonne

Next ligne

End Sub
14/11/2023

Damier avec le if et des 1 et 2

Sub exo_damier()

Dim n, cased, ligne, colonne, x As Integer


n=5
cased = 1

For ligne = 1 To n
If ligne Mod 2 = 1 Then
cased = 2
Else
cased = 1
End If

For colonne = 1 To n
Cells(ligne, colonne).Value = cased
cased = 3 - cased

Next colonne

Next ligne
End Sub

Damier sans le if

Sub exo_SansIF1()
Dim h, premierecase, cased, ligne, colonne, x As Integer

h=6
cased = 1
premierecase = 1

For ligne = 1 To h
'initialiser cased
cased = premierecase

For colonne = 1 To h
Cells(ligne, colonne).Value = cased
cased = 3 - cased 'changement de valeur

Next colonne

'calcul de la premiere case pour la ligne suivante

premierecase = 3 - premierecase

Next ligne
End Sub

Pour faire l’escalier


Sub pyramide()

Dim h, cased, ligne, colonne, premierecasedeligne As Integer

h=6
For ligne = 1 To h
For colonne = 1 To ligne

'colorier en noir
Cells(ligne, colonne).Interior.Color = vbBlack

Next colonne

Next ligne
End Sub

Pour faire l’escalier dans l’autre sens


Sub pyramide()

Dim h, cased, ligne, colonne, premierecasedeligne As Integer

h=6
For ligne = 1 To h
For colonne = ligne To h ‘1-6; 2-6 ; 3-6

'colorier en noir
Cells(ligne, colonne).Interior.Color = vbBlack

Next colonne
Next ligne
End Sub

Autre pyramide
Sub pyramide()

Dim h, cased, ligne, colonne, premierecasedeligne As Integer

h=6
For ligne = ligne To h
For colonne = h + 1 - ligne To h ‘6-6 ; 5-6 ; 4-6 ; 3-6

'colorier en noir
Cells(ligne, colonne).Interior.Color = vbBlack

Next colonne

Next ligne
End Sub

CODE FINAL PYRAMIDE

Sub pyramide()

Dim h, cased, ligne, colonne, premierecasedeligne As Integer


h=6
For ligne = ligne To h
For colonne = h + 1 - ligne To h - 1 + ligne

'colorier en noir
Cells(ligne, colonne).Interior.Color = vbBlack

Next colonne

Next ligne
End Sub
BOUCLE « While »

➔ Si on ne remplit pas la condition, on ne rentre pas dans la boucle

Les SYMBOLES et OPÉRATEURS


Compter les x (pré-écris dans le tableau excel)

Sub compterlesX()

Dim i, compteur as Integer


compteur = 0

For i = 1 To 99999

If (Cells(i, 1).Value = "x") Then

compteur = compteur + 1

End If

Next i

Debug.Print compteur

End Sub

Continuer à boucler tant que la cellule est remplie

Sub bouclewhile()

Dim compteur, ligne As Integer


compteur = 0
ligne = 1
‘boucler tant que je ne suis pas arrivée sur une cellule vide
While (Cells(ligne, 1).Value <> "")
‘si je rencontre un X j’incrémente le compteur
If (Cells(i, 1).Value = "x") Then

‘incrémenter le compteur
compteur = compteur + 1

End If
‘passer à la ligne suivante
ligne = ligne + 1

Wend ‘fin du while

Debug.Print compteur
End Sub

Ecrire de 1 à 10 dans la colonne B

Sub while10()
'remplir la 2de colonne avec 1 à 10

Dim compteur As Integer

compteur = 1

While (compteur <= 10)

Cells(compteur, 2).Value = compteur


compteur = compteur + 1
Wend
End Sub

21/11/2023

DEVOIR
Sub deviner ()
Dim x as Integer
x = 50
‘ecrire une boucle qui sans s’arrêter demande 1 chiffre à l’utilisateur jusqu’à ce qu’on
tape le bon chiffre x

Sub deviner()

Dim x, y As Integer

x = 50

While y <> x

y = InputBox("Entrez un chiffre: ")

If y = x Then
MsgBox " VOUS AVEZ TROUVÉ!"

Else
MsgBox "Pas le bon! Essayez encore: "

End If
Wend

End Sub

28/11/2023 (vacances)

05/12/2023
Rappel boucle For + While
Sub boucle_for()

Dim i As Integer

For i = 1 To 10

Cells(i, 1).Value = i * 5

Next i

End Sub

Sub boucle_while()
'table de 5 dans la 2e colonne
'10 lignes

Dim compteur As Integer

compteur = 1 ‘initialisation à 1 IMPORTANT AVANT UTILISATION DU compteur

While (compteur <= 10)

Cells(compteur, 2).Value = compteur * 5


compteur = compteur + 1

Wend

End Sub

BOUCLE « Do While »

➔ Faire ce qu’il y a dans la boucle au moins 1 fois puis on teste la condition puis
on voit si on peut reboucler
➔ Do… Loop While

Table de 5 dans la 3e colonne

Sub boucle_do_while()
Dim i As Integer
i=1
Do
Cells(i, 3).Value = i * 5
i=i+1
Loop While (i<=10)

End Sub

Vérifier si ce que l’utilisateur a entré est un chiffre puis lui redemander si ce


qu’il a entré n’est pas un chiffre (jusqu’à ce que ce soit un chiffre)
+Choisir le bon type de boucle
➔ On choisit la boucle DO WHILE
Sub verif_de_saisie()

Dim pin_code As Integer


Dim saisie As String
pin_code = 1234

'vérif du pin code


'le pin code doit etre numerique
'vérifier si la saisie est correcte
'si pas correct: redemander à l'utilisateur nou

'obliger de demander au moins 1 fois à l'utilisateur


'demande à l'utilisateur de taper le pin code

Do

saisie = InputBox("Tapez le pin code: ")

'redemander tant que la saisie n'est pas de type numérique


Loop While (Not IsNumeric(saisie) Or Len(saisie) <> 4)

'ici on est sur que la saisie est numérique


'comparer avec le pin code

If (Val(saisie) = pin_code) Then 'Val signifie convertir en valeur numérique


MsgBox ("le pin code est CORRECT!")
Else
MsgBox ("le pin code est INCORRECT!")
End Sub
Verifier si l’utilisateur a bien entré une adresse e-mail

InStr et Mid
Les fonctions InStr et Mid sont souvent utilisées pour manipuler des chaînes de
caractères.
InStr (In String):
La fonction InStr est utilisée pour trouver la position d'une sous-chaîne dans une
chaîne principale.
Syntaxe : InStr([start], string1, string2, [compare])
- start (optionnel) : spécifie la position de départ de la recherche.
-string1 : la chaîne dans laquelle vous recherchez.
-string2 : la sous-chaîne que vous recherchez.
-compare (optionnel) : spécifie le type de comparaison. La plupart du temps, vous
pouvez le laisser vide.

EXEMPLE :
vbaCopy code
Dim position As Integer position = InStr(1, "Hello World", "World")
MsgBox position ' Affichera 7, car "World" commence à la position 7 dans "Hello
World".

Mid (Mid String):


La fonction Mid est utilisée pour extraire une partie d'une chaîne.
Syntaxe : Mid(string, start, [length])
-string : la chaîne d'origine.
-start : la position de départ de l'extraction.
-length (optionnel) : la longueur de la sous-chaîne à extraire. Si omis, il extrait jusqu'à
la fin.
EXEMPLE 1 :

Dim sousChaine As String


sousChaine = Mid("Hello World", 7)
MsgBox sousChaine ' Affichera "World", car l'extraction commence à la position 7.

EXEMPLE 2 :

Dim sousChaine As String


sousChaine = Mid("Hello World", 7, 3)
MsgBox sousChaine ' Affichera "Wor", car l'extraction commence à la position 7 et a
une longueur de 3.

(from ChatGPT)

Sub validation_email()

Dim saisie As String


'verifier si saisie est un adresse email
'verifier si on retrouve l'@'

saisie = InputBox("Tapez votre adresse email: ")

If (InStr(saisie, "@") > 0) Then


'cest une adresse email
MsgBox "adresse email OK"
Else
MsgBox "adresse email PAS OK"

End If
End Sub

Les FONCTIONS

On ne commence plus par un « Sub ». À la place on écrit « Function » et on


termine le code par « End Function ».

Créer une fonction qui vérifie les emails (verifier_email)

Function verifier_email(saisie As String) As Boolean


'fonction renvoyant un booleen
'cette fonction renvoie VRAI si saisie est un email

If (InStr(saisie, "@") > 0) Then

'return True
verifier_email = True

Else
'return False
verifier_email = False

End If

End Function

Exemple 1 d’appel de fonction (verifier_email)


Sub validation_email_do_while()

'tant que l'utilisateur ne tape pas un email valide


'on lui redemande son email

Dim saisie As String

'boucler tant que l'email n'est pas correct

Do
saisie = InputBox("Tapez votre email :")

Loop While (verifier_email(saisie) = False)


'appel de fonction
End Sub

Exemple 2 d’appel de fonction (verifier_email)


Sub validation_email_do_while_2()

'AVEC RESULT : récuperer la sortie de la fonction


'tant que l'utilisateur ne tape pas un email valide
'on lui redemande son email

Dim saisie As String


Dim result As Boolean

'boucler tant que l'email n'est pas correct

Do
saisie = InputBox("Tapez votre email :")
result = verifier_email(saisie)

Loop While (result = False)


'appel de fonction
End Sub
EXERCICE (pdf du cours slide 79)

Code ASCII
Alt 64 = @
Alt 65 = A , Alt 66 = B, etc. // Alt 97 = a , Alt 98 = b, etc.

Remplir une colonne avec les nombres de 1 à 100

Sub boucle_1à100()

Dim i As Integer

For i = 1 To 100

Cells(i, 9).Value = i

Next i

End Sub

Remplir une colonne avec les lettres de A à Z →majuscule


Sub exercice_seq_lettres_MAJ()

'MsgBox(Chr(65))
Dim i As Integer

For i = 1 To 26
Cells(i, 1).Value = Chr(64 + i)

'minuscule : Chr(96 +i)

Next i

End Sub

Remplir une colonne avec les lettres de A à Z →minuscule dans la 5e colonne


Sub exercice_seq_lettres_MIN()

'MsgBox(Chr(65))
Dim i As Integer

For i = 1 To 26
Cells(i, 5).Value = Chr(96+ i)
Next i

End Sub
Remplir une colonne avec les puissances de 2 (2,4,8,16.. 2^x)

Sub puissanceDe2()

Dim i As Integer
Dim compteur As Integer

compteur = 1 'initialisation à 1 IMPORTANT AVANT UTILISATION DU compteur

While (compteur <= 10)

Cells(compteur, 8).Value = 2 ^ compteur


compteur = compteur + 1

Wend

End Sub
12/12/2023

Les TABLEAUX

Créer d’un tableau (0 à 9)

Sub creation_tableau()

Dim monTableau(9) As Integer


Dim i As Integer

'remplir le tableau de 1à10

For i = 0 To 9

monTableau(i) = i + 1

Next i

'visualisation/recopier dans une feuille Excel

For i = 0 To 9

Cells(i + 1, 1) = monTableau(i)

Next i

End Sub
Créer un tableau (1 à10)

Sub creationTab2()

Dim monTableau(1 To 10) As Integer


Dim i As Integer

'remplir le tableau de 1à10

For i = 1 To 10

monTableau(i) = i

Next i

'visualisation/recopier dans une feuille Excel

For i = 1 To 10

Cells(i, 2) = monTableau(i)

Next i

End Sub
Les fonctions :
LBound et UBound

LBound (Lower Bound) et UBound (Upper Bound) sont utilisées pour obtenir les
indices de limite inférieure et supérieure d'un tableau ou d'une collection. Ces
fonctions sont souvent utilisées dans le cadre de la manipulation des tableaux.

LBound :

La fonction LBound retourne l'indice de la limite inférieure d'un tableau dans une
dimension donnée.
Syntaxe : LBound(Array, [Dimension])
Array : Le tableau pour lequel vous souhaitez obtenir la limite inférieure.
Dimension : Facultatif. La dimension pour laquelle vous souhaitez obtenir la limite
inférieure. Par défaut, la première dimension est utilisée.
Exemple :
Dim myArray(1 To 10) As Integer
Dim lowerBound As Integer

lowerBound = LBound(myArray)
MsgBox "Lower Bound: " & lowerBound ' Affiche 1

UBound :

La fonction UBound retourne l'indice de la limite supérieure d'un tableau dans une
dimension donnée.
Syntaxe : UBound(Array, [Dimension])
Array : Le tableau pour lequel vous souhaitez obtenir la limite supérieure.
Dimension : Facultatif. La dimension pour laquelle vous souhaitez obtenir la limite
supérieure. Par défaut, la première dimension est utilisée.
Exemple :

Dim myArray(1 To 10) As Integer


Dim upperBound As Integer

upperBound = UBound(myArray)
MsgBox "Upper Bound: " & upperBound ' Affiche 10

Créer un tableau (avec les Bound)

Sub creationTab3()

Dim monTableau(1 To 10) As Integer


Dim i As Integer

'remplir le tableau de 1à10

For i = LBound(montTableau) To UBound(monTableau)

monTableau(i) = i

Next i

'visualisation/recopier dans une feuille Excel

For i = 1 To 10

Cells(i, 3) = monTableau(i)
Next i

End Sub

Faire un tableau 2D (5 sur 5)

Sub tableau2D()

Dim monTableau2D(1 To 5, 1 To 5) As Integer


Dim i, j As Integer

'remplir le tableau 2D

For i = 1 To 5
For j = 1 To 5

monTableau2D(i, j) = i + j

Next j
Next i
'visualiser le tableau dans une feuille de calcul

For i = 1 To 5
For j = 1 To 5

Cells(i, j).Value = monTableau2D(i, j)

Next j
Next i
End Sub
Rechercher le mininum ou maximum dans un tableau + Créer des fonctions

Function maximum(tableau As Variant) As Integer


'renvoie le maximum du tableau
Dim max, i As Integer

max = tableau(LBound(tableau))

For i = LBound(tableau) To UBound(tableau)

If tableau(i) > max Then


max = tableau(i)

End If

Next i
'return
maximum = max

End Function

Appel de la fonction maximum (exercice précédent) → renvoie logiquement 66

Sub test_maximum()

'test de la fonction maximum

Dim monTableau(1 To 10) As Integer


monTableau(1) = 10
monTableau(2) = 27
monTableau(3) = 28
monTableau(4) = 62
monTableau(5) = 40
monTableau(6) = 66
monTableau(7) = 50
monTableau(8) = 2
monTableau(9) = 55
monTableau(10) = 42

MsgBox maximum(monTableau) ‘appel de la fonction

End Sub

Modifier les valeurs d’un tableau + utilisation de ReDim

ReDim
ReDim est utilisée pour redimensionner un tableau (array) existant. On peut l'utiliser pour
modifier la taille d'un tableau existant en spécifiant le nouveau nombre d'éléments dans une
ou plusieurs dimensions.
« Redim » est une instruction/ commande et pas une fonction car elle ne renvoie aucune
valeur.

→ Syntaxe de base :
ReDim NomDuTableau(NouvelleTaille)

Exemple :

Sub ExempleRedim()
Dim monTableau() As Integer
ReDim monTableau(1 To 5) ' Crée un tableau avec 5 éléments
' Utilisation du tableau initial
For i = LBound(monTableau) To UBound(monTableau)
monTableau(i) = i * 10
Next i

' Affichage du tableau initial


MsgBox Join(monTableau, ", ") ' Affiche "10, 20, 30, 40, 50"

' Redimensionnement du tableau


ReDim monTableau(1 To 8) ' Redimensionne le tableau avec 8 éléments

' Utilisation du tableau redimensionné


For i = LBound(monTableau) To UBound(monTableau)
monTableau(i) = i * 10
Next i

' Affichage du tableau redimensionné


MsgBox Join(monTableau, ", ") ' Affiche "10, 20, 30, 40, 50, 60, 70, 80"
End Sub

(from ChatGpt)

Function multiplier_tableau(tableau As Variant, multiplicateur As Integer) As Variant

'multiplication des valeurs d'un tableau


'renvoie un tableau

Dim tableau_resultat As Variant


Dim i As Integer
ReDim tableau_resultat(LBound(tableau) To UBound(tableau))

For i = LBound(tableau) To UBound(tableau)

tableau_resultat(i) = tableau(i) * multiplicateur

Next i

'return
multiplier_tableau = tableau_resultat

End Function

Appel de la fonction multiplier_tableau (exercice précédent)

Sub tester_multiplier_tableau()

Dim i As Integer
Dim resultat As Variant
Dim monTableau(1 To 10) As Integer

monTableau(1) = 10
monTableau(2) = 27
monTableau(3) = 28
monTableau(4) = 62
monTableau(5) = 40
monTableau(6) = 66
monTableau(7) = 50
monTableau(8) = 2
monTableau(9) = 55
monTableau(10) = 42

resultat = multiplier_tableau(monTableau, 2) 'appel de la fct

'visualisation du resultat
For i = LBound(resultat) To UBound(resultat)

Cells(i, 10).Value = resultat(i)

Next i

End Sub

Fonction multiplier_modifier_tableau

Function multiplier_modifier_tableau(tableau As Variant, multiplicateur As Integer) As


Variant

'multiplication des valeurs d'un tableau


'renvoie un tableau

Dim tableau_resultat As Variant


Dim i As Integer

ReDim tableau_resultat(LBound(tableau) To UBound(tableau))

For i = LBound(tableau) To UBound(tableau)


tableau(i) = tableau(i) * multiplicateur

Next i

'return
multiplier_modifier_tableau = tableau_resultat

End Function

Appel de la fonction multiplier_modifier-tableau()


Sub tester_multiplier_modifier_tableau()

Dim i As Integer
Dim resultat As Variant
Dim monTableau(1 To 10) As Integer

monTableau(1) = 10
monTableau(2) = 27
monTableau(3) = 28
monTableau(4) = 62
monTableau(5) = 40
monTableau(6) = 66
monTableau(7) = 50
monTableau(8) = 2
monTableau(9) = 55
monTableau(10) = 42

resultat = multiplier_modifier_tableau(monTableau, 2) 'appel de la fct


'visualisation du resultat
For i = LBound(resultat) To UBound(resultat)

Cells(i, 11).Value = monTableau(i)

Next i

End Sub

Passage d’argument par référence


(dans le cours :CoursCM1Bureautique slide 73)

« ByVal » et « ByRef » sont utilisés pour spécifier le passage de paramètres dans


les procédures (sub-procédures ou fonctions). Ils déterminent comment les
arguments sont transmis à la procédure.

ByVal (By Value):

Lorsque vous utilisez ByVal, la valeur réelle de l'argument est passée à la procédure.
Cela signifie que toute modification apportée à la valeur du paramètre à l'intérieur de
la procédure n'affectera pas la variable d'origine à partir de laquelle la procédure a
été appelée.
Dans l’exemple qui suit :
→Le x est modifié à l'intérieur de ExampleByVal
→la variable num à l'extérieur de la procédure reste inchangée.
Sub ExampleByVal(ByVal x As Integer)
x=x+1
MsgBox "Inside Sub: " & x
End Sub

Sub TestByVal()
Dim num As Integer
num = 5
ExampleByVal num
MsgBox "Outside Sub: " & num
End Sub

REPONSE :
Inside Sub: 6
Outside Sub: 5

ByRef (By Reference):

Lorsque vous utilisez ByRef, un lien vers la variable d'origine est passé à la
procédure.
Cela signifie que toute modification apportée à la valeur du paramètre à l'intérieur de
la procédure affectera également la variable d'origine.

Sub ExampleByRef(ByRef y As Integer)


y=y+1
MsgBox "Inside Sub: " & y
End Sub

Sub TestByRef()
Dim num As Integer
num = 5
ExampleByRef num
MsgBox "Outside Sub: " & num
End Sub

REPONSE :
Inside Sub: 6
Outside Sub: 6
(from ChatGpt)
Différent type de fonction (ByVal, Call, ByRef)
Sub Calcul()

Dim Montant As Integer


Montant = 10
Call Produit1(Montant, 2) 'appel une procedure
MsgBox "Montant = " & Montant

End Sub

Sub Produit1(ByVal Nb As Integer, n As Integer) ‘la fonction


Nb = Nb * n
End Sub

Sub Produit2(ByRef Nb As Integer, n As Integer)


Nb = Nb * n
End Sub
On prend une variable puis on la multiplie

Function Produit1_fun(ByVal Nb As Integer, n As Integer) As Integer


Nb = Nb * n
Produit1_fun = Nb
End Function

Function Produit2_fun(ByRef Nb As Integer, n As Integer) As Integer


Nb = Nb * n
Produit2_fun = Nb
End Function
Sub Calcul2()

Dim Montant As Integer


Montant = 10

MsgBox Produit1_fun(Montant, 2) & " Montant= " & Montant


MsgBox Produit2_fun(Montant, 2) & " Montant= " & Montant

End Sub

Faire des tris

Méthode : LE TRI À BULLES


Le tri à bulles (Bubble Sort en anglais) est un algorithme simple de tri qui fonctionne
en comparant et en échangeant les éléments adjacents s'ils sont dans le mauvais
ordre (from ChatGpt).

Sub tri_bulle(ByRef tableau As Variant)

Dim indice_depart As Integer


Dim indice_max As Integer
Dim i As Integer

indice_depart = LBound(tableau)
indice_max = UBound(tableau)
'boucle des passes

For i = indice_depart To indice_max - 1

'comparaison et swap
If tableau(i) > tableau(i + 1) Then
Call swap(tableau(i), tableau(i + 1))

Next i

End Sub
--------------------------------------------------------------------------------------------------
Sub swap(ByRef tableau As Variant, i As Integer, ByRef j As Integer)

Dim tampon As Integer

tampon = tableau(i)
tableau(i) = tableau(i + 1)
tableau(i + 1) = tampon
End If

End Sub
-------------------------------------------------------------------------------------------
Sub test_tri_bulle()

Dim monTableau(1 To 10) As Integer


Dim i As Integer

monTableau(1) = 10
monTableau(2) = 27
monTableau(3) = 28
monTableau(4) = 62
monTableau(5) = 40
monTableau(6) = 66
monTableau(7) = 50
monTableau(8) = 2
monTableau(9) = 55
monTableau(10) = 42

For i = LBound(monTableau) To UBound(monTableau)

Cells(i, 1).Value = monTableau(i)

Next i

End Sub

Faire des tris (partie 2)

Sub tri_bulle(ByRef tableau As Variant)

Dim indice_depart As Integer


Dim indice_max As Integer
Dim i, passe As Integer

indice_depart = LBound(tableau)
indice_max = UBound(tableau)
'boucle des passes

For passe = 1 To (indice_max - indice_depart - 1)


For i = indice_depart To indice_max - passe

'comparaison et swap
If tableau(i) > tableau(i + 1) Then
Call swap(tableau, i, i + 1)

End If

Next i

Next passe

End Sub

Sub swap(ByRef tableau As Variant, ByVal i As Integer, ByVal j As Integer)

Dim tampon As Integer

tampon = tableau(i)
tableau(i) = tableau(j)
tableau(j) = tampon

End Sub

Sub test_tri_bulle()

Dim monTableau(1 To 10) As Integer


Dim i As Integer
monTableau(1) = 10
monTableau(2) = 27
monTableau(3) = 28
monTableau(4) = 62
monTableau(5) = 40
monTableau(6) = 66
monTableau(7) = 50
monTableau(8) = 2
monTableau(9) = 55
monTableau(10) = 42

Call tri_bulle(monTableau)
For i = LBound(monTableau) To UBound(monTableau)

Cells(i, 1).Value = monTableau(i)

Next i

End Sub
Exercice SUPP

Fait avec ChatGpt

Afficher en bleu la cellule qui contient la plus petite valeur numérique de la


colonne A

Sub MettreEnSurbrillancePlusPetiteValeur()
Dim colonneA As Range
Dim celluleMin As Range

' Définir la plage dans la colonne A à partir de la deuxième ligne


Set colonneA = ActiveSheet.Range("A1:A" &
ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row)

' Trouver la cellule avec la plus petite valeur


Set celluleMin =
colonneA.Cells(Application.WorksheetFunction.Match(Application.WorksheetFunctio
n.Min(colonneA), colonneA, 0))

' Mettre en surbrillance en bleu


celluleMin.Interior.Color = vbBlue
End Sub

Afficher la table de multiplication (tableau 10X10)

Sub AfficherTableMultiplication()
Dim i As Integer
Dim j As Integer
' Remplir le tableau de multiplication
For i = 1 To 10
For j = 1 To 10
Cells(j, i).Value = i * j
Next j
Next i
End Sub

Rechercher dans la cellule contenant le mot "cible" et afficher ses


coordonnées (ex: A4)

Sub RechercherEtAfficherCoordonnees()
Dim ws As Worksheet
Dim rechercheCellule As Range

' Définir la feuille de calcul


Set ws = ThisWorkbook.Sheets("TableMultiplication") ‘ma feuille s appelle
TableMultiplication

' Rechercher le mot "cible" dans la colonne A


Set rechercheCellule = ws.Columns("A").Find("cible", LookIn:=xlValues)

' Vérifier si le mot a été trouvé


If Not rechercheCellule Is Nothing Then
' Afficher les coordonnées de la cellule
MsgBox "Coordonnées de la cellule contenant 'cible': " &
rechercheCellule.Address
Else
' Si le mot n'a pas été trouvé
MsgBox "Le mot 'cible' n'a pas été trouvé dans la colonne A."
End If
End Sub

Explication du code :

• "Set" est utilisé pour créer une référence d'objet.


• "ws" est le nom de la variable qui va contenir cette référence d'objet (dans ce
cas, une feuille de calcul).
• "ThisWorkbook" est un mot-clé qui fait référence au classeur (workbook)
dans lequel le code est en cours d'exécution.
• "Sheets("NomDeVotreFeuille")" est une méthode qui récupère une référence
à une feuille spécifique du classeur. Vous devez remplacer
"NomDeVotreFeuille" par le nom réel de votre feuille de calcul.
• "rechercheCellule" est le nom de la variable qui va contenir cette référence
d'objet (dans ce cas, une plage de cellules).
• "ws.Columns("A").Find("cible", LookIn:=xlValues)" est une expression qui
recherche le mot "cible" dans la colonne A de la feuille de calcul référencée
par "ws".
• "Columns("A")" sélectionne toute la colonne A de cette feuille.
• ".Find("cible", LookIn:=xlValues)" recherche le mot "cible" dans cette
colonne en utilisant la méthode Find. Les options "LookIn:=xlValues"
spécifient que la recherche doit être effectuée dans les valeurs des
cellules.

Rechercher dans la cellule contenant le nombre 999 et afficher ses


coordonnées (ex: A4)

Sub RechercherNombre999()
Dim ws As Worksheet
Dim rechercheCellule As Range

' Définir la feuille de calcul


Set ws = ThisWorkbook.Sheets("TableMultiplication") ‘ma feuille s appelle
TableMultiplication

' Rechercher le nombre 999 dans la colonne A


Set rechercheCellule = ws.Columns("A").Find(999, LookIn:=xlValues)

' Vérifier si le nombre a été trouvé


If Not rechercheCellule Is Nothing Then
' Afficher les coordonnées de la cellule
MsgBox "Coordonnées de la cellule contenant '999': " &
rechercheCellule.Address
Else
' Si le nombre n'a pas été trouvé
MsgBox "Le nombre '999' n'a pas été trouvé dans la colonne A."
End If
End Sub

Vous aimerez peut-être aussi