Tutorat VBA

Algorithmique du S1

En VBA, les commentaires sont un apostrophe, mais comme ça cassait mon API, j'ai mis des % à la place.

Le VBA, c'est quoi ?

Le VBA pour Visual Basic for Applications est un langage permettant d'interagir avec les outils Office.

Notamment utilisé pour Excel, il permet de manipuler la feuille de calcul de façon automatisée.

Les variables

Notion de variable

Les variables sont très importantes en informatique. Elles permettent de contenir une information.
Pour réussir à l'examen, il n'y pas besoin de savoir précisément comment elles sont gérées par votre ordinateur.
Par contre, vous aurez besoin de savoir deux choses essentielles sur leur fonctionnement.

Schéma pratique de la variable

Les variables sont organisée de la façon suivante sur votre ordinateur :

Note : La référence d'une variable peut-être vu comme son adresse postale. Elle permet d'identifier la variable dans la mémoire.

Déclarer une variable en VBA

La syntaxe pour déclarer une variable est la suivante :
% Procédure principale nécessaire % On verra plus tard les procédures Sub main() Dim nomDeMaVariable As Type End Sub

Il existe plusieurs types en VBA, les principaux utilisé seront :

  • Les entiers : Integer et Long
  • Les réels : Single et Double
  • Les chaines de caractères : String
  • Les valeurs de vérité : Boolean
  • Tout les types : Variant

Attention ! Une variable doit être initialisée avant d'être utilisée.

On aurait ainsi le code suivant :
Sub main() Dim entier As Integer, chaine As String % Valeurs neutres (souvent utilisée) entier = 0 chaine = "" % Valeurs personnalisées entier = 42 chaine = "La réponse à l'univers, la vie et tout le reste." End Sub

Opérations sur les variables

Opérations sur les réels et les entiers

Il est possible d'effectuer les opérations arithmétiques élémentaires sur ces deux types.
Sub main() Dim nombre1 As Integer, nombre2 As Integer nombre1 = 5 nombre2 = 2 % --- Opérations arithmétiques élémentaires --- nombre1 + nombre2 % Vaut 7 nombre1 - nombre2 % Vaut 3 nombre1 * nombre2 % Vaut 10 nombre1 /. nombre2 % Vaut 2.5 % --- Division euclidienne --- nombre1 \ nombre2 % Vaut 2 nombre1 Mod nombre2 % Vaut 1 % Car 5 = 2 * 2 + 1 End Sub

Opérations sur les chaines de caractères

Il est possible de concaténer deux chaines de caractères avec l'opérateur de concaténation.
Sub main() Dim chaine1 As String, chaine2 As String chaine1 = "Hello" chaine2 = "World" % --- Concaténation --- chaine1 & ", " & chaine2 & " !" % Vaut "Hello, World !" End Sub

Les tableaux

Les tableaux permettent d'avoir plusieurs variables de même type sous un même nom. Ils peuvent être de plusieurs dimensions :

  • 1 Dimension : une liste
  • 2 Dimensions : une matrice
  • 3 Dimensions : un tableau 3D
  • etc…

Pour choisir la taille du tableau, on a deux possibilités :

  • Un intervalle d'indices entre min et max choisis
  • Un intervalle d'indices de 0 à max choisi

Ca donne ça en VBA :
Sub main() % Créer un tableau de 11 entier (indice de 0 à 10) Dim tableau0(10) As Integer % Créer un tableau de 10 chaînes de caractères (indice de 11 à 20) Dim tableau1(11 To 20) As String % Créer un tableau 3D de réels de taille 10 x 10 x 10 Dim tableau2(9, 0 To 9, 9) As Simple End Sub

Comme pour toute variables, on ne connaît pas la valeur par défaut des cases des tableaux créés, il faut donc les initialiser avec une boucle (qu'on verra plus tard).

Pour accéder à une case d'un tableau, on utilise la syntaxe suivante :
Sub main() % Créer un tableau de 11 entier (indice de 0 à 10) Dim tableau(10) As Integer % Je modifie la case numéro 6 (7ième position) tableau(6) = 42 % Je cherche à obtenir la valeur tableau(6) % Vaut 42 End Sub

Instructions Entrée/Sortie (E/S)

Les instructions d'Entrée/Sortie permettent d'interagir avec l'utilisateur.

Entrée

Elle permet d'affecter une variable à la demande de l'utilisateur.
Sub main() Dim age As Integer % L'utilisateur voit une fenêtre qui lui demande son âge age = InputBox("Quelle est votre âge ?") End Sub

Sortie

Elle permet d'afficher une fenêtre à l'utilisateur avec un message.

On utilisera souvent l'opérateur de concaténation pour afficher des messages plus compréhensibles pour l'utilisateur.
Sub main() Dim age As Integer age = 18 % On affiche le résultat (sans oublier les espaces) MsgBox "Vous avez " & age & " ans !" % -> Vous avez 18 ans ! End Sub

Exercice 1

Écrire une procédure qui demande l'âge de l'utilisateur et renvoie les deux années de naissances possibles.

Les conditions

Lorsqu'on programme, on souhaite souvent qu'un morceau de code soit exécuté sous certaines conditions, c'est pour cela qu'il existe les conditions :
Sub main() If condition Then % Code 1 ElseIf condition 2 Then % Code 2 Else % Code 3 End If End Sub

On vérifie que la condition soit vraie selon les calculs Booléens (soit 0, soit 1, 1 étant 'vrai').
Ainsi, si on choisit que la condition soit une variable qui vaut 1, la condition sera toujours vraie.

L'ordinateur vérifie les choses dans cet ordre :
Si la condition du If est vérifiée (donc vraie), il exécute le code 1
Sinon, si la condition du ElseIf est vérifiée, il exécute le code 2
Sinon, il exécute le code 3.


Vous noterez bien que les parties ElseIf et Else sont optionnelles. Il est possible d'avoir uniquement :
Sub main() If condition Then % Code 1 End If End Sub

Les conditions sont des relations simples entre deux variables :
Sub main() Dim first As Integer, second As Integer first = 5 second = 7 % --- Opérateurs de comparaison --- first = second % - Différent - first <> second % ------------- first < second first > second first <= second first >= second % --- Opérateurs booléens --- condition 1 Or condition 2 condition 1 And condition 2 Not condition 1 End Sub

Exercice 2

Écrire une procédure qui demande l'âge de l'utilisateur et affiche s'il est majeur ou mineur.

Les boucles

Pour les parcours de tableaux, ou pour pouvoir faire plusieurs fois la même chose sans avoir à s'embêter, les boucles permettent d'exécuter plusieurs fois un même morceau de code.

Les boucles utilisent des conditions. Tant que celles-ci sont vraies, on continue d'éxécuter le code dans la boucle.

Il faut faire attention lorsque qu'on écrit une boucle à ne pas provoquer de boucles infinies.
C'est-à-dire que la condition ne devient jamais fausse et que le programme ne s'arrête jamais.

Les boucles While et Do While

Ces deux boucles sont extrêmement simples. Elles se contentent de vérifier une condition pour recommencer.

La seule différence entre les deux est le moment de la vérification de la condition.
Là où la boucle While vérifie la condition avant de commencer le code à l'intérieur, la boucle Do While vérifie la condition après avoir éxécuté le code.
Sub main() % La boucle While Do While condition % Code Loop % La boucle Do While Do % Code Loop While condition End Sub

La boucle For

Un peu plus complexe, la boucle For se comporte comme une boucle While dont la condition est un compteur.

Il y a plusieurs façon de l'écrire, mais dans tous les cas, il est nécessaire de déclarer une variable qui sera notre compteur.
Sub main() % Déclaration du compteur Dim i As Integer % Version complete For i = depart To fin Step pas % Code Next i % Il est possible d'utiliser le compteur dans deux boucles % Version simple For i = depart To fin % Code Next i End Sub

Exercice 3

Écrire une procédure qui initialise un tableau en demandant à l'utilisateur les valeurs à rentrer.

Les fonctions et procédures

Imaginons des étapes A, B et C.
On vous demande alors de faire ces étapes dans un ordre différent selon l'objet de départ.

Comment procéder de façon efficace ?

Une façon de faire est de créer les étapes A, B et C de façon isolée. Et c'est exactemet ça que sont les procédures et les fonctions.

Plutôt que d'écrire 100 fois le même code, il suffit de le détacher en une procédure ou une fonction pour pouvoir l'utiliser plusieurs fois.

Les procédures

Vous en avez déjà utilisé, c'est le Sub de vos programmes.

Pour déclarer une procédure, il faut respecter la syntaxe suivante :
% Procédure à appeler Sub nomDeLaProcedure(arguments) % Code End Sub % Procédure principale Sub main() Call nomDeLaProcedure(arguments) End Sub

Pour appeler un procédure depuis un endroit dans le code, on utilise l'instruction Call :
% Procédure à appeler Sub nomDeLaProcedure(arguments) % Code End Sub % Procédure principale Sub main() Call nomDeLaProcedure(arguments) End Sub

Les fonctions

Les fonctions sont comme des procédure, la seule différence est qu'elles renvoient un valeur. Une fonction est donc typée.

Pour déclarer une fonction, il faut respecter la syntaxe suivante :
Function nomDeLaFonction(arguments) As Type % Code % Fin de la fonction : nomDeLaFonction = valeur a renvoyer End Function

Pour appeler une fonction, il suffit d'écrire son nom avec ses arguments :
% Fonction à appeler Function nomDeLaFonction(arguments) As Type % Code % Fin de la fonction : nomDeLaFonction = valeur a renvoyer End Function % Procédure principale Sub main() nomDeLaFonction(arguments) End Sub

Les arguments

Les arguments sont des variables d'entrée pour les procédures et les fonctions.

Comme nous l'avons vu, une variable correspond grossièrement à une référence et une valeur. C'est pour ça que les arguments peuvent être passés par valeur ou par référence

Qu'est-ce que ça implique ?

Une variable passée par référence doit être une variable. Si celle ci est modifiée dans la fonction ou procédure, elle le sera aussi pour le code en dehors de la procédure/fonction.

Une variable passée par valeur peut être une variable ou un résultat de calcul. Si celle ci est modifiée dans la fonction ou procédure, elle ne le sera pas pour le code en dehors de la procédure/fonction.

Petit exemple permettant de voir comment définir des arguments :
% ByRef permet de passer la variable par référence % ByVal permet de passer la variable par valeur Function maFonction(ByRef ref As Integer, ByVal val As Integer) As Integer ref = 42 maFunction = val End Function % Procédure principale Sub Main() Dim a As Integer, b As Integer, c As Integer a = 10 b = 15 c = maFonction(a, a + b) MsgBox a & ", " & b & ", " & c End Sub

Affichera 42, 15, 25

Intéragir avec la feuille de calcul

Pour cela, on utilise la fonction Cells(ligne, col).

Cela permet à la fois d'affecter une valeur et de la récupérer.

Ainsi, si on veut récupérer la valeur de la case A1, on fera :
Sub main() Dim a As Integer a = Cells(1, 1) End Sub

A l'inverse, si on veut affecter une valeur à la case A1, on fera :
Sub main() Cells(1, 1) = 42 End Sub