Cours Excel VBA
Cours Excel VBA
En quelques mots :
Ces macros sont ‟attachées” aux applications Office, plus précisément à un document d’Office
- attachée à un classeur Excel, Une application VBA ne peut pas se lancer si
- attachée à un document Word, aucun des produits Office n’est installé
Une macro, ou application VBA, est un ‟texte” en langage spécial (le VBA) composé d’éléments :
- commandes,
VBA et son IDE sont proposés ‟en standard”
- instructions, avec toute applications Office
- objets spéciaux (tels que les interfaces)
L’ensemble de ce qui est ‟fait” en VBA et attaché à un classeur Excel se nomme le ProjetVBA (VBAProject)
ainsi, deux fichiers Excel différents auront chacun leur ProjetVBA.
Méthode de travail : nous allons alterner entre exercices pratiques et éléments théoriques.
1
VBA – INITIATION : Parcours pratique
Ici, non. Car l’onglet Développeur n’est pas présent dans le ruban.
Avant de débuter un cas pratique, commençons par vérifier que les outils de codage (écriture) des macros sont accessibles…
2
Étape de réglage préliminaire
3
Étape de réglage préliminaire
On coche, puis, on valide par le bouton OK (en bas de cette fenêtre, non visible sur cette capture d’écran).
4
L’onglet Développeur est désormais disponible
Ouvrons l’outil (EDI) à partir duquel nous allons pouvoir coder du VBA :
L’éditeur Visual Basic est un ‟IDE” c’est-à-dire un environnement de développement : ensemble d’outils qui facilitent le développement
d’applications (de la plus petite, voire inutile…, à la plus importante et complexe).
5
Cet outil se nomme l’éditeur Visual Basic
Cet IDE comporte différentes fenêtres que l’on peut fermer/ouvrir à volonté, notamment grâce au menu Affichage.
6
Pour écrire notre premier code, insérons un ‟module”
définition : les modules de code contiennent toutes les macros
utilisées par le tableur : déclarations, procédures et fonctions
C’est ici que l’on écrit les lignes de codes, et autres sortes
de lignes utiles pour commenter le code.
C’est un ‟traitement de texte” avec de bonnes propriétés.
Dans le menu de l’éditeur Visual Basic : Insertion Module N.B. Nous ne parlons, ici, que
Par défaut, il est nommé Module1, et le curseur attend la saisie de lignes de code, des modules ‟standards”
Notre nouveau Module sera lié à notre fichier Excel, et sauvegardé avec ce dernier quand nous sauvegarderons ce fichier (au bon format). 7
Rédigeons notre premier code !
définition : une procédure est un bloc d’instructions
Le bloc de code ‟de base” s’appelle une ‟procédure”. délimité par 2 Mots-clés (un pour le début, un pour la fin)
le code qui s’exécute est toujours celui d’une procédure
3 types de procédure :
- 2 courantes : Sub et Function
- 1 complexe : Property
Insérons le texte ci-dessus dans le Module1. Ce petit programme doit avoir un nom, ici c’est ‟essai”
Puis, retournons dans la feuille Excel. Attention à la syntaxe pour dénommer un Sub (il y a des caractères interdits…)
Mettons la souris dans la cellule B3 (par exemple).
Retournons maintenant dans Excel. Là, dans l’onglet Développeur, cliquons sur le bouton Macro (voir slide suivant). 8
Lançons l’exécution de notre première macro VBA (nom courant d’un code ou programme VBA)
1°) dans l’onglet Développeur d’Excel, puis 2°) cliquons sur Exécuter pour exécuter la seule
groupe Code, cliquons sur : macro ici présente
Le fait d’avoir écrit (page précédente) Sub essai() a nommé cette macro ‟essai”, et nous retrouvons ce nom dans cette boîte de dialogue de
lancement des macros.
Un type de Sub spécial : la Fonction. Elle renvoie obligatoirement un résultat (telle que le fait une fonction courante d’Excel). Nous les verrons plus loin. 9
Observons le résultat de cette macro
Puisque le curseur était en B3 (qui est donc la cellule active), la macro a écrit "Bonjour le monde !" en B3.
Résultat certes modeste, mais nous venons de respecter la coutume informatique qui consiste à débuter l’apprentissage d’un langage en ‟codant”
le message "Hello world !" 10
Observons notre premier code et détaillons ses éléments :
5°) nous avons inséré le code à proprement parlé, à savoir ActiveCell = "Bonjour le monde !"
ActiveCell est un mot-clé qui représente la cellule active de la feuille Excel (il est ‟réservé”)
= est un symbole d’affectation (de la partie à droite dans la partie à gauche du signe =)
"Bonjour le monde !" est une chaine de caractère, car délimitée par les ""
Commentaire du 2°) : Sub est un mot-clé (spécial) du langage VBA, il se met automatiquement en bleu.
Nous reprendrons en détail chacun de ces éléments.
2ème Niveau de lecture : ActiveCell est un objet
Il s’agit, ici, d’une prise de contact avec les éléments de langage du VBA. dont on modifie ici la propriété par défaut : Value
Il n’est pas nécessaire de l’indiquer 11
Enregistrons (sauvegardons…) notre Fichier Excel contenant maintenant notre première macro
1°) nous pouvons quitter l’éditeur Visual Basic : Fichier Fermer et retourner à Microsoft Excel
Le nom est caché (par défaut). Il faut donc aller l’afficher (ruban)
On y mettra des macros pratiques et souvent utilisées, telles que du
formatage de feuille,…
On peut créer des macros par enregistrement des manipulations d’Excel recherchées. Ce mode de création par enregistrement n’est pas optimal et
génère des lignes inutiles (on l’utilise quand on cherche comment écrire quelques lignes dont la syntaxe est complexe – pour le codeur…) 12
L’avertissement de sécurité au lancement d’un fichier Excel qui contient des macros
13
Que permet le VBA ?
Ce n’est pas de la théorie !
Juste de la terminologie => c’est donc très pratique !
14
Éléments théoriques Histoire du langage BASIC : Beginner's All-purpose Symbolic Instruction Code
C’est un langage publié le 1er mai 1964 par John G. Kemeny et Thomas E. Kurtz et
mis en œuvre sous leur direction par une équipe d'étudiants du Dartmouth College.
Il existe Word VBA, PowerPoint VBA, Access VBA… même si les macros concernent le plus souvent Excel.
Une macro peut faire ‟communiquer” toutes les applications Office entre elles (Word, Excel, Powerpoint, Access…).
Une macro peut aussi faire ‟communiquer” toutes les applications Office avec d’autres applications extérieures, par exemple; une base de données,
de simples fichiers textes, un site internet, un système complexe comme Bloomberg,… 15
Éléments théoriques : première description de l’éditeur de code VBA
Chaque classeur Excel possède son projet associé (Project). L’explorateur de projet :
Un clic-droit sur le dossier Modules permet aussi d’insérer un nouveau module de code
Ce mélange est très pratique (grande souplesse d’utilisation, de création), mais potentiellement risqué
Les informaticiens professionnels n’apprécient pas cela car DANGEREUX si mal maîtrisé.
Les langages professionnels sont évalués – entre autres – par rapport à la sécurité offerte dans
l’écriture du code (test de celui-ci…).
Comment apprendre VBA ? Apprendre par morceau; chaque morceau de code ou d’outil lié au code s’apprend seul. Puis, par exercices simples, on
apprend à les combiner. Enfin, on apprend à ‟penser” l’application que l’on souhaite élaborer. Aussi petite soit-elle, il faut la penser ‟sur le papier”
avant que de se lancer dans l’écriture de celle-ci.
18
Pratique : première modification de notre macro et premier contact avec un objet
On parle aussi d’une procédure l’Affectation en informatique : mettre ce qui est à droite du signe =
dans ce qui est à gauche (un objet ou une variable)
BUT : Nous allons écrire notre salutation dans une autre cellule que la cellule active, quelle que soit celle-ci.
Ai-je bien compris l’affectation ??
Préparation de l’exercice : dans la feuille Excel Test :
25 = Range ("A2")
effaçons le texte en B3. Possible ou impossible ??
Écriture :
Allons dans l’éditeur, dans le module 1.
dans le texte de essai() :
remplaçons ActiveCell
par Cells(1,3)
Exécution :
Voir slide 13 pour le lancement
Ou encore : la lancer par ALT+F8
Résultat :
Au moment où l’on tape "(" , on voit apparaître une aide à la saisie
Le texte s’est écrit dans la cellule C1 qui nous indique les paramètres attendus par le mot-clé "Cells"
Explication : nous avons affecté à l’objet ‟la cellule d’adresse C1” le texte "Bonjour le monde !"
La cellule est désignée par ‟Cells” puis ses coordonnées (ligne, colonne).
Puissance et difficulté du VBA : plusieurs moyens de désigner une cellule : ici,
‟de la collection des cellules, on considère celle de coordonnées Row = 1, Column = 3”
Autrement dit : la cellule 1ère ligne et 3ème colonne; soit en Excel de base : C1
Préparation de l’exercice :
dans Excel, effaçons le texte précédent.
Écriture :
Allons dans l’éditeur, dans le module 1.
plus bas que essai(), écrivons un nouveau :
Sub : essai_1()
MsgBox "Bonjour le monde"
Exécution :
Voir slide 13 pour le lancement, ou encore ALT+F8
et choisissons cette fois-ci essai_1
Nous n’avons pas encore utilisé la richesse de cette fonction. Dans le slide suivant, nous allons utiliser plusieurs de ses paramètres,
Précision, pour quitter cette boite, on peut aussi valider par Entrée au clavier.
VBA dialogue/communique soit avec les données présentes dans les cellules Excel, soit avec l’utilisateur pour demander/fournir des données. 20
Boîte de dialogue : où trouver les paramètres de réglage de celle-ci ?
VBA nous permet d’observer cet élément à l’aide de l’explorateur d’objet
21
Résultats de la consultation de l’aide Microsoft Office pour VBA
Ici :
https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/msgbox-function
22
Bonne méthode pour apprendre à utiliser un ‟objet” de l’environnement VBA :
Tester, une par une, les possibilités des paramètres
Dans le code de essai_1(), nous avons déjà saisi, sans le savoir, le 1er paramètre, le message dit ‟prompt”
Ajoutons une virgule après ce prompt,
C’est une variable, c’est-à-dire une ‟boîte” en mémoire vive de l’ordinateur : elle a une taille et un usage => le type de donnée qu’elle peut contenir. 23
Voici quelques résultats possibles, selon le choix du paramètre buttons
En fait, on peut remplacer ces constantes par leurs valeurs numériques liées (nombres entiers). Un slide, plus loin, donne plus d’explication…
La documentation les fournit (ainsi que leur combinaison).
Exemple : vbAbortRetryIgnore = 2, vbCritical = 16,
Et … si je veux les deux ensembles, il me suffit d’additionner 2 + 16 (soit 18 !) 24
Mais, la fonction MsgBox permet d’enrichir encore l’interface avec l’utilisateur
Si le 2ème paramètre est une chaine de caractère alors ce sera le titre de la boîte de dialogue
Ici, ce test utilise la structure conditionnelle If… Then… Else… End If Macro en plusieurs lignes ;
attention à l’ordre de ces lignes
(que l’on abordera bientôt)
Si deux/trois/n… boutons sont posés sur la feuille, et que l’on souhaite affecter à chacun une macro différente,
c’est possible (bien sûr).
Alors on peut retrouver la macro affectée chaque bouton par simple clic-droit sur celui-ci puis – dans le menu
contextuel – aller sur "affecter une macro". Là, il nous indique quelle est la macro déjà affectée à ce bouton
(on peut garder ou modifier ce choix).
Il est aussi possible d’affecter la macro à une image (=> lancement de la macro en cliquant sur l’image).
Afin de tester plus simplement nos petits morceaux de code, nous lancerons leur exécution à l’aide d’un simple clic sur un bouton.
2ème Niveau de lecture : deux familles : les contrôles de formulaires
(anciens) et les contrôles ActiveX (plus récents). Microsoft maintient
les anciens pour compatibilité entre les versions. 26
Avant d’aller plus loin, On parle, ici, des Types
Éléments théoriques : les différents types de données que manipule VBA prédéfinis par le langage
À l’aide du langage VBA, on peut : - manipuler des données ‟objets Excel” (on les verra plus loin),
- manipuler des données (propres au programme) : ci-dessous
Les différentes ‟manipulations” d’une variable : la 1ère est sa création (**). 2 modes : prudent, dangereux
- prudent : création par déclaration (explicite) en début du code de la procédure (= avant utilisation)
- dangereux : création lors de la 1ère utilisation dans le code de la procédure
Complément :
* VBA manipule aussi des tableaux et des objets, voir plus loin
** La 2ème manipulation d’une variable est son changement de valeur, la 3ème son changement de type (un peu plus complexe…).
Une utilisation un peu spéciale : la vérification du Type (dans le but d’éviter une erreur en corrigeant le type) => slide 36 27
Les différents types de données que manipule VBA : précision
Principe : ne pas prendre
un type trop « lourd »
Chaque Type a un usage précis qui dépend de ses limites à respecter; valeur minimale, valeur maximale, pas
▪ Les valeurs numériques : À ne pas savoir par cœur, mais avoir une idée de l’ordre de grandeur
✓ Entières :
Byte occupe 1 octet : nombre entier entre 0 et 255
Integer occupe 2 octets : nombre entier entre -32768 et 32767
Long occupe 4 octets : nombre entier long entre -2 147 483 648 et 2 147 483 647
✓ Décimales :
Single simple précision : nombre à virgule flottante compris entre
-1,401298 10-45 et -3,402823 1038 ou 1,401298 10-45 et 3,402823 1038
Double double précision : nombre à virgule flottante compris entre
-1,79769373486232 10308 et -4,94065645841247 10308 ou …
Currency occupe 8 octets : monétaire : nombre à virgule fixe, avec 15 chiffres avant la virgule
pour la partie entière, et 4 chiffres après (pour la décimale)
▪ Les chaines de caractères : String (limitée à 65000 caractères, la plus petite est la chaine vide : "")
▪ Les dates : Date occupe 8 octets : de 01/01/100 à 31/12/9999 nombre dont jour est la partie entière
La création explicite d’une constante ou d’une variable : mot clé Const ou Dim
exemple : pour une variable
Dim Prénom as String : contient des chaines de caractères On peut déclarer plusieurs
Dim Total as Single : contient des nb décimaux simple précision variables sur une même ligne,
mais il faut à chaque variable
Dim Effectif as Integer : contient des entiers courts indiquer son type :
exemple : pour une constante Dim Var1 as Type1, Var2 as Type2
28
Un type de données spéciale : créé par l’utilisateur lui-même ! Tous les grands langages
possèdent ce type de donnée
Attention, un type personnalisé ( = un UDT ) doit se créer en haut du module, avant toute procédure !!
Et ainsi le complément automatique d’instruction s’en servira lorsque vous utiliserez ce type…
On utilise alors un élément particulier de ce Tableau : On peut utiliser des UDT dans d’autres UDT.
Patients(1).Nom = ‟Dupont” Attention à la complexité, car le but est de
Patients(1).Age = 31 réduire celle-ci et non l’inverse.
Patients(1).Poids = 68,3
29
Compléments sur les données
À ne pas savoir par cœur, mais savoir les retrouver dans la doc
Les constantes symboliques prédéfinies : VBA propose des noms représentant des valeurs constantes qui reviennent souvent !
Constantes générales
Null : valeur d’une variable Variant qui ne contient aucune valeur valide
Error : valeur d’une variable Variant pour signaler une erreur
Empty : valeur d’une variable ou propriété non initialisée
Dernier type un peu spécial : l’énumération : on liste toutes les valeurs possibles du Type (voir la doc et slide suivant)
ENUM Nom_choisi
choix 1 = …
choix 2 = …
END ENUM
Enfin : le type Variant est à réserver à des usages précis, car trop gourmand et rend le code difficile à comprendre
30
Exemple de variable de type avancé : l’énumération
À lire en 2ème lecture… La plupart des langages possèdent ce type
Slide à passer en première lecture !
Créons, par exemple, une liste des jours ouvrés : de Lundi à Vendredi
On nomme la liste en commençant par e de façon à retrouver plus vite notre liste dans l’Intellisense
On liste toutes les valeurs possibles du Type (voir la doc)
On écrit cette énumération en dehors des Sub et Function et en tête du module
ENUM eJourOuvré
eLundi = …
eMardi = …
…
eVendredi = …
END ENUM
2°) Affectation
LeJour = eJourOuvré.
31
Déclaration, Affectation, Modification de la valeur d’une Variable
On peut s’obliger à déclarer toute variable d’un
module : Option Explicit en tête du module
Après avoir été déclarée (mode prudent…) Le mode imprudent consiste à utiliser un mot comme variable dès sa première
utilisation. On peut empêcher ce mode par une option en en-tête de module…
par interaction avec le modèle objet et/ou l’utilisateur Voir exemple slide précédent
La pratique rend tout ceci simple. Mais, les possibilités sont très vastes.
Il existe des variables tableaux (autrement dit des ‟matrices”), voir Slide 39,
et enfin il existe un type ‟global” qui convient à tout : Variant.
À utiliser avec précaution. C’est le type par défaut, et il est ‟lourd” en ressources mémoire de l’ordinateur. 32
Conversion d’une Variable : les fonctions C…
Portée limitée à la procédure signifie qu’une fois l’exécution de la procédure finie, la variable est détruite. Et, lors de l’exécution suivante on
recommence comme si rien ne s’était passé précédemment avec cette variable.
Signifie aussi qu’une autre procédure peut utiliser le même nom pour une autre variable dans un tout autre contexte, d’une tout autre façon.
34
Accessibilité d’une procédure
Bien lire le pavé du bas de cette page
a. la plus petite portée : la procédure (ou la fonction) est appelée uniquement depuis le module où elle se trouve
Private Sub exemple ()
Dim Prénom as String
…
End Sub
b. au-dessus : la procédure est appelable par l’ensemble des procédures de tous les modules
Public Sub calcul()
…
End Sub
c. autre cas : que deviennent les variables locales de la procédure une fois celle-ci finie ?
leurs valeurs conservées pour repartir de celles-ci lors d’une éventuelle relance de la procédure
Static Sub dessine()
…
End Sub
d. appel d’une procédure : appel direct (depuis une procédure, d’une autre procédure)
Call dessine()
ATTENTION : nous pouvons interrompre – ou quitter – une procédure avant sa fin, grâce à l’instruction EXIT Sub, ou Exit Function
Revenons au cas d. appel direct d’une procédure : (depuis une procédure, d’une autre procédure)
1ère façon : les arguments sont simplement listés
Sub dessine()
Call crayon(Argument1, Argument 2)
…
End Sub
…
…
Sub crayon(Arg1, Arg2)
…
End Sub
3ème façon : les arguments sont listés avec leur type, certains sont optionnels
…
Sub crayon(Arg1 = "Lundi", Arg2 as Integer, Optional Arg3)
…
End Sub
36
Opérations sur Variables :
opérateurs arithmétiques : +, -, *, /, \, ^ et Mod
Chaque type de variable possède ses opérations possibles sur son type.
38
Variables très différentes mais indispensables : les Tableaux
Groupe d’éléments d’un même type, qui possèdent un nom identique
et référencés par un rang, ou encore numéro d’index
Déclaration :
La variable Tableau se voit attribuée son nom, éventuellement ses limites et son type
Déclaration simpliste mais valable
Dim Mon_Tableau()
Déclaration plus complète, on précise le type des données. Ici, pour un ensemble de chaines de caractères
Dim Prénoms() as String
Déclaration plus complète pour un ensemble de notes d’étudiants (on suppose des classes <= à 50 étudiants)
Dim Les_Notes(1 to 50) as Integer
Nous allons tester cette fonction sans rien faire dans Excel, à l’aide de l’exécution pas-à-pas détaillé (touche F8)
En laissant le curseur
quelque part dans le
code de ce Sub,
Ce mode d’écriture du code, en le testant par petits morceaux, est très pratique et prudent.
40
Et enfin , dernière opération sur les variables : destruction d’une variable …
À lire après avoir étudié le slide 50,
mais logique de présenter ce point ici
Dans tout langage, donc en VBA, il est possible de détruire une variable !
Pourquoi ? pour libérer de l’espace mémoire
Donc, à ne faire que si vous en avez besoin : le faire au bon moment (= au bon endroit du code)
exemple : un tableau ! Quand – vraiment – je n’en n’ai plus besoin
exemple de moins en moins utile : à la fin du code (très souvent, le système le fera de lui-même)
Même si vous ne l’utilisez pas, bon à savoir pour la compréhension générale d’un code et d’un ordinateur…
41
Opération prudence pour tout un code, s’obliger à déclarer toutes les variables du projet
42
Pratique : troisième macro et premier contact avec le modèle objet de VBA pour Excel
Un objet correspond aux éléments d’Excel
L’objet Excel le plus ‟petit”, ou plutôt élémentaire : la cellule (et le groupe de plusieurs cellules = plage)
Une fois l’objet cellule désigné, VBA permet 2 actions : Ecrivons le code ci-dessus
et affectons le à un bouton.
- Accéder ou modifier une propriété de l’objet ( un état, une caractéristique, de celui-ci) Observons le résultat
- Appliquer une méthode à l’objet
Chaque objet a ses caractéristiques : sa liste de propriétés, et ses comportements : sa liste de méthodes
Il suffit de les connaître et de savoir les utiliser…
Désignation absolue d’une plage de cellules : Bien noter la position des guillemets : début et fin
écriture : Range("A1, A2, A3") Soit de manière générale : Range("<Liste>")
la virgule permet de désigner des plages ou cellules non contigües
On peut préciser, entre guillemets, la feuille concernée si ce n’est pas la feuille active :
Range("Feuil2!A1:B2") qui est équivalent à Worksheet("Feuil2!").Range("A1:B2")
On peut construire à l’aide de variable String les chaines de caractères représentants des adresses !
Dim Adr as String, NomFeuille as String, NumLigne as Integer
Adr = NomFeuille + "!A" + Cstr(NumLigne)
Range(Adr) 44
Les façons de désigner une cellule, une plage de cellule :
Cas classiques, intéressants et pratiques
N.B. Il y a toujours plusieurs façons d’écrire un code, même aussi simple que celui-ci
Nous avons déjà vu, depuis le début de ce manuel, comment modifier la propriété Value de cellules :
Après
Ce cas, ultra-simple, pour illustrer la modification d’une propriété d’un objet (ultra-simple – lui aussi – mais ultra-utile en VBA).
Allez… faisons du apparemment compliqué avec l’écriture générale de modification d’une propriété : On se détend : les crochets <> indiquent
<Expression>.<nom de propriété> = <Valeur> la présence d’un argument obligatoire 47
Un peu de pratique (et explications théoriques) :
on peut récupérer une propriété d’un objet dans une variable,
variable dont on peut faire l’usage que l’on veut par la suite
Bien sûr, il faut d’abord créer la variable dans laquelle on récupère la propriété :
Notez bien l’ordre dans lequel l’ordinateur exécute la ligne : 1°) évaluation de la multiplication, 2°) affectation
Avant
Après
Là encore, puisque qu’on modifie la propriété par défaut du range A6, pas besoin de préciser cette propriété
Ce cas, ultra-simple, pour illustrer la récupération d’une propriété d’un objet dans une variable et l’exploitation de celle-ci dans un calcul.
Bien sûr, toute propriété d’un objet peut se récupérer et s’affecter à un autre objet (couleur, taille et type de police,…) : code très classique!!
48
Une première liste (non exhaustive) de propriétés d’un Range (ou d’une seule cellule)
L’aide à la saisie nous permet de découvrir les propriétés et méthodes attachées à un objet
Ici, le Range A1 :
Propriétés :
Mise en forme du texte
- Font. Avec des sous-propriétés
Méthode
- Font.Bold = True
texte en gras (booléen) Propriété
- ClearContents
efface tout (méthode)
- Borders.Value = 1
ajoute des bordures à A1
Mais aussi :
- Range("A2").Font.Size =
Range("A1").Font.Size
donne au texte de la cellule A2 la taille Une propriété peut avoir des sous-
propriétés, qui peuvent avoir, elles-
du texte de la cellule A1 mêmes, des sous-sous-propriétés…
Alors que :
Range("A1","A2").ClearContents
n’efface que le contenu, pas le formatage
Une propriété se lit (dans une variable) ou se modifie. Ok, certaines propriétés ne sont ‟accessibles » qu’en lecture ! => voir exemples Slides 68,69
l’explorateur d’objets permet de le savoir !! (tout en bas)
Une méthode s’applique, quelques exemples de méthodes :
pour une cellule : copier, coller, effacer,… pour une feuille : déplacer, supprimer, renommer,… 50
Pratique : deuxième contact avec une boîte de dialogue : InputBox
VBA permet à notre utilisateur de saisir des données utiles à la macro Dans l’aide, cette fonction a
5 paramètres disponibles
L’utilisateur peut être amené à saisir des informations, demandées par la macro et récupérées par celle-ci.
1er moyen : la fonction InputBox
Ici, écriture directe de la réponse du NOM en cellule A1
Et écriture en 2 temps du Prénom, en cellule A2, après récupération de la réponse dans une variable Prénom
51
Pratique : La boîte de dialogue : InputBox
Usage plus complet avec la méthode Sert à la saisie et à d’autres
actions sur la feuille
Un type utile est le type 8 : référence de cellule sous forme d’un objet Range
Écrivons le code :
Cells(1, 3) = "Bonjour le monde !"
il s’agit de la cellule C1 de la feuille dans laquelle se trouve le curseur
L’application Excel ‟sait” toujours dans quelle feuille se trouve ce curseur
Cette feuille est d’ailleurs manipulable en VBA, désignée par ActiveSheet
Écrivons le code :
Worksheets("Feuil1").Cells(1, 3) = "Bonjour le monde !"
il s’agit de la cellule C1 de la feuille Feuil1 quelle que soit la feuille où est le curseur
Là, j’impose – par mon code – la manipulation de telle cellule dans telle feuille
par défaut il s’agit du classeur actif, lui encore connu et désigné par ActiveWorkbook
Écrivons le code :
Application.Workbooks("Classeur2.xlsx").(Worksheets("Feuil1").Cells(1, 3) = "Salut!"
il s’agit de la cellule C1 de la feuille Feuil1 du classeur Classeur2.xlsx
Là, j’impose – par mon code – la manipulation de telle cellule dans telle feuille dans tel classeur
quel que soit le classeur actif (celui où est le curseur!)
2ème lecture : La notion d’objet actif est à la fois puissante et demande d’être comprise et maîtrisée.
À chaque instant, il y a :
- l’application Excel : Application Application est parent de la collection Workbooks
- un classeur actif : ActiveWorkbook Workbook est parent de la collection Worksheets
- une feuille active : ActiveSheet et de la collection Charts
- une cellule active : ActiveSheet
Worksheet est parent de la collection Names, des objets Range,…
53
Les Objets actifs : comment y accéder…
le classeur actif :
Application.ActiveWorkbook l’écriture complète
ActiveWorkbook l’écriture minimale
MAIS, pour les propriétés de l’application Excel, il est nécessaire de spécifier Application :
Exemple : la barre de titre d’Excel est modifiable par :
Application.Caption = "Mon tableau mensuel"
l’omission de Application ne fonctionnerait pas
54
Pratique : les références de champs
Nous allons référencer un champ de la Feuille(1) alors que la cellule active est dans une autre feuille lors du
lancement de la macro.
Ecrivons le code :
Worksheets("Feuil1").Cells(1, 3) = "Bonjour le monde !"
Essayons de lancer cette macro (ALT+F8) après avoir placé auparavant le curseur dans une autre feuille !
Non seulement le résultat est bien en C1, mais la cellule active reste bien là où l’on se trouve lors du lancement
de la macro.
Bien sûr cette macro peut se terminer en rendant active la cellule où l’on vient d’écrire, ou bien n’importe
quelle autre cellule.
Exercice simple : à l’aide de MsgBox comptons le nombre de feuilles dans notre classeur
Une feuille est un objet Worksheet, elle fait partie de la collection de feuilles (observez le "s" à la fin du nom)
Worksheets
Bien sûr, pour connaître le nombre d’éléments dans une collection, on dispose de la propriété : Count
Ecrivons le code :
Worksheets.Add(After:= Worksheets("Feuil1")).Name = "MaFeuille"
- maintenant la nouvelle feuille est après la feuille spécifiquement désignée et le nom est choisi
Ecrivons le code :
Sheets.Add(After:= Worksheets(Worksheets.Count)).Name = "NouvelleFeuille"
- maintenant la nouvelle feuille est après la dernière feuille du classeur et le nom est choisi
c’est un truc simple et classique de codage, même quand on ne connaît pas le nombre d’éléments de la collection manipulée
56
Allons plus loin dans : les références de champs
Un ensemble de cellules : une zone, une sélection
Un ensemble de cellules peut se manipuler comme un objet : on le créé sur mesure, on le modifie…
Écrivons le code : Attention, rappel :
Dim plage as range Un objet défini, et utilisé, comme
L’objet plage vient d’être créé, par sa déclaration, mais il ne ‟contient” rien ! une variable doit être :
Nous disposons, pour cet objet, de propriétés et de méthodes. - déclaré et typé,
- affecté ( initialisé)
Problème, VBA nous annonce une erreur ! L’affectation ne fonctionne pas comme pour les autres variables.
Dans l’IDE :
Exécution Réinitialiser
pour réparer notre erreur !
57
Abordons la création d’objets : création de champs Mot-clé Set
Définition d’un champ : une zone, une sélection
Corrigeons le code :
Dim plage as Range Après créations de la variable plage de type Range,
Set plage = Range("A1" ; "A2"; ; "B1"; "B2") nous lui affectons une plage concrète !
Et, afin de vérifier, sélectionnons cette zone
Plage.Select
Cette 2ème syntaxe est puissante uniquement pour les zones où toutes les cellules sont contigües et
forment un rectangle, puisqu’on donne les coordonnées des coins opposés.
Troisième syntaxe, très pratique. Si nous avons déjà nommé un champ dans Excel (exemple TABLO).
Set plage = Range("TABLO")
Si le champ TABLO n’existe pas dans Excel, une erreur surviendra !
Bien lire la documentation Excel/VBA pour les syntaxes de définition des zones multi-cellules. Ca va du plus simple au plus surprenant.
Pratique : on peut aisément sélectionner toute une colonne. Exemple : Range("C:C") est la colonne C. (voir slide 41)
Enfin, si on a nommé une colonne on pourra utiliser le nom de ce champ colonne pour sélectionner toute la colonne!
58
Quelques propriétés utiles d’un champ zone multi-cellules
Chaque cellule de cette zone a un numéro dans la collection que constitue le champ.
Pour illustrer ce point, inscrivons dans chaque cellule son numéro :
Plage.Cells(1) = 1
Nous découvrons dans quel ordre VBA
Plage.Cells(2) = 2 numérote les éléments de la collection,
Plage.Cells(3) = 3 ici les cellules
Plage.Cells(4) = 4
Puissance de VBA pour Excel (et source d’erreurs si mal maîtrisé) : désignation relative
Inscrivons 12 en une adresse relative à Plage. Corrigeons le code par :
Plage.Cells(Cells(7, 4)) = 12
mais, plus généralement, en prenant comme ancrage de départ n’importe quelle cellule :
Range("B11").Cells(-1, 2) = "Target"
Enfin, la propriété Offset qui permet un pilotage précis de désignation d’une zone Offset : on parle de la gestion
des déplacements dans la feuille
Plage.Cells(3).Offset(5, 4) = "Cible"
Si <nb-lignes> >0 décalage vers le bas (ou à droite), donc attention à ne pas provoquer une erreur en allant en dehors de la feuille Excel. 59
Éléments théoriques : le modèle OBJET d’Excel
et sa hiérarchie…
60
Utilisation des Objets du modèle OBJET d’Excel
Quelques trucs et astuces
2ème Niveau de lecture
Exemple : quelle que soit une plage de cellule dans une feuille,
NOMFEULLE = plage.Parent.Name
Sans argument, la propriété Cells renvoie la plage de toutes les cellules de la feuille active, donc :
TotalCellules = Cells.Count
donne le nombre de cellules d’une feuille Excel
NonVide = WorkSheetfunction.CountA(Cells)
donne le nombre de cellules non vides d’une feuille Excel (l’équivalent de NBVal)
Attention, la propriété Name renvoie un Objet ! Donc, pour le nom prendre Name de Name !
Exemple : NomPlage = Plage.Name.Name
et renvoie erreur si la plage n’a pas été nommée, à récupérer suite à On Error Resume Next
61
Avançons dans l’écriture du code : élément de base d’un algorithme, la structure de contrôle
les Boucles
Vitesse de l’ordinateur…
Ce mode de lancement d’un code permet de suivre l’évolution de telle ou telle variable afin de traquer les erreurs.
Grâce à une boucle For Each – Next parcourons tous les éléments de la collection de cellules :
Reprenons le comptage d’éléments de la collection plage
plage.Count
Structure simple de cette boucle : on parle – parfois – d’énumération quand on parcourt une collection
Pour utiliser cette technique, créons la variable cellule :
Dim cellule As Range
For Each cellule In Plage
‘ code utilisant cellule
Next
63
Deuxième structure algorithmique de base : les Tests
Dans la littérature informatique, les Tests font partie des instructions de contrôle
On parle de TEST car il y a un CONDITION qui est exprimée, puis testée :
Selon que la CONDITION soit VRAI ou FAUSSE, telle ou telle ACTION est exécutée ou non
IF Condition THEN
‘ action si la condition est VRAI
…
ELSE
‘ action si la condition est FAUSSE
…
End If
L’écriture de la CONDITION est souvent de tester si telle valeur est supérieure, égale ou inférieure à telle autre :
Par exemple :
IF Time > 0,5 THEN
‘ action si la condition est VRAI
MsgBox "Nous sommes le matin"
ELSE
‘ action si la condition est FAUSSE
…
End If
C’est la structure de contrôle la plus simple, mais la plus pratique lors d’un codage rapide.
Slide suivant : les écritures plus puissantes de la structure de Test!
64
Le Test : Deuxième construction : SELECT CASE
Cette construction est très pratique pour tester plusieurs conditions, les unes après les autres
Structure simple d’un SELECT CASE :
SELECT CASE Variable
CASE ‘ expression de cette 1ère condition : la Variable est dans tel état1
‘ action si la condition1 est VRAI
CASE ‘ expression de cette 2ème condition : la Variable est dans tel état2
‘ action si la condition2 est VRAI
CASE ELSE
‘ action si aucunes conditions précédentes n’est vraie
…
End Select
Il y a des variantes…
C’est la structure de contrôle la plus pratique pour traiter des cas qui s’enchainent bien.
Il faut, néanmoins, bien veiller à cet enchainement
65
Conditions d’un Test : les structures de contrôles utilisent des
opérateurs de comparaison
Supériorité stricte
IF A > B THEN
Égalité de deux objets
‘ action si A > B est VRAI IF A is B THEN
… ‘ action si l’objet A et l’objet B
ELSE sont identiques
‘ action si A > B est FAUX …
… ELSE
End If ‘ action si A > B est FAUX
…
End If
Infériorité large
IF A <= B THEN
‘ action si A <= B est VRAI Opérateurs logiques : de même entre 2 expressions
…
ELSE
‘ action si A > B est FAUX Or : X Or Y au moins l’une des 2 est VRAIE
… Xor : X Xor Y une seule des 2 est VRAIE
End If
And : X And Y les 2 sont VRAIES
Différence
IF A <> B THEN Eqv : X Eqv Y les 2 sont VRAIES ou
‘ action si A <> B est VRAI les 2 sont FAUSSES
…
ELSE
‘ action si A > B est FAUX Not : Not X FAUX si X est VRAIE
66
VRAIE si X est FAUX
Avançons dans le VBA pour Excel : les événements et leur programmation :
VBA avancé
67
Les formulaires personnalisés : UserForm
1. Dessin du formulaire :
on place des ‟contrôles” sur la feuille (parmi une liste fournie par l’IDE)
chaque contrôle a ses propriétés, ses méthodes et ses événements
68
Les formulaires personnalisés : UserForm (2)
69
Les formulaires personnalisés : UserForm (3)
70
Les formulaires personnalisés : UserForm (4)
Outil Sélection
Contrôle Label : zone texte pour identifier
Les contrôles sur un Userform permettent de se recréer une interface très complète, mais l’apprentissage prend un peu de temps…
La boîte à outils en présente un certain nombre, de base, mais il est possible d’en ajouter.
71
Un formulaire classique : la saisie d’un nouvel article dans une base de données
Tout d’abord, créons le formulaire (ou Userform) ! Deux boîtes apparaissent alors :
La boîte à outils de gestion du UserForm n’apparaît que quand on clique sur le UserForm
72
Un formulaire classique : la saisie d’un nouvel article dans une base de données (2)
73
Notre formulaire de saisie d’un nouvel article : premier aperçu
74
Notre formulaire de saisie d’un nouvel article : Ajoutons les zones de notre Formulaire
soit 6 intitulés et 6 zones de texte à l’aide de la boîte à outils
75
Exemple de question
76
À l’aide de l’explorateur d’objet : premier élément de réponse
77
Une fois l ’élément sélectionné, cliquer sur le point d’interrogation, lecture de la doc Microsoft
78
Exemple de question
Vous créez une ligne de code juste dans le but de surligner le mot, puis cliquez sur le point d’interrogation pour consulter la doc
Microsoft
Voir page suivante la réponse
79
Réponse trop imprécise, on tape alors le mot Integer dans la barre de recherche de l’aide en
ligne Microsoft
Là, cette nouvelle requête va nous fournir la solution ! Réponse compliquée à trouver.
80
Exemple de question
Un objet UserForm c’est : une fenêtre, ou une boîte de dialogue, qui entre dans la composition d’une interface utilisateur
Premier travail : 1°) afficher un formulaire vide Par défaut, notre première boîte de dialogue
à partir de la fenêtre propriétés : sera modale, c’est-à-dire que l’utilisateur
personnaliser son nom : frmVide devra la refermer avant de pouvoir effectuer
personnaliser le titre de celui-ci : Mon premier formulaire tout autre opération
Deuxième travail : 1°) afficher une boîte de dialogue : formulaire non modale, et posons dedans quelques contrôles
à partir de la fenêtre propriétés :
personnaliser son nom : frmTestNonModal
personnaliser le titre de celui-ci : Mon formulaire Test
83
Exemple de question
84
Exemple de question
85
Exemple de question
Premiers constats :
Nous allons devoir créer :
- Une Input Box
- Une Msgbox
Sub essai_accueil()
' solution questionnaire d'accueil
Dim Reponse As String, Reponse_Accueil As String
Dim Texte_dans As String, Texte_Entete As String
86
Exemple de question
87
Exemple de question
88
Exemple de question
Sub essai_infini()
' solution
For i = 1 to 2
i = i – 1
Next i
End Sub
89
Exemple de question :
Ecrire une macro qui écrive une donnée quelconque dans une cellule choisie de la Feuil1
Puis, permettez à l’utilisateur de lancer cette macro par un clic sur un bouton présent sur cette Feuille
Première possibilité :
Sub essai_1()
Cells(2, 3) = 37
End Sub
Deuxième possibilité :
Sub essai_ecrit()
Range("C2") = 37
End Sub
Troisième possibilité :
Sub essai_ecrit()
Worksheets("essai").Cells(2, 3) = 37
End Sub
Quatrième possibilité :
Sub essai_ecrit()
Worksheets("essai").Range("C2") = 37
End Sub
90
Exemple de question : Portée d’une variable
A l’intérieur d’une procédure, la variable est uniquement utilisable, accessible, à l’intérieur de cette procédure, et pendant la
durée de vie de celle-ci
Sub Exemple_1 ()
Dim X
…
End Sub
Pour qu’elle garde cette valeur (et resserve…) après la fin de l’exécution de la procédure, il faut la déclarer avec le mot STATIC
Sub Exemple_1 ()
Static X
X = X + 1
…
End Sub
A l’extérieure des procédures d’un module MAIS déclarée en tête de celui-ci, section Déclarations (avant, donc, toute procédure),
la variable est alors utilisable, accessible, dans toutes les procédures de ce module
Dim X
…
Sub Exemple_1 ()
…
End Sub
Pour qu’une variable soit accessible par toutes les procédures de tous les modules des Projets VBA ouverts, il faut la déclarer
dans la section Déclarations de n’importe quel module, à l’aide du mot-clé : Public
91
Exemple
92
Exemple de question : procédure événementielle
93
Exemple de question
94
Exemple de question :
Cliquer sur le ? Du Menu de l’IDE, puis, dans la doc MSFT écrire en zone de recherche le mot-clé ChDir (et choisir le résultat « avec VBA »)
95
Exemple de question :
Ne sera effectif qu’après sauvegarde du dossier, fermeture de celui-ci, lors de la prochaine ouverture.
96
Exemple de question :
97
Exemple de question :
98
Exemple de question :
quelles sont les propriétés de l’objet Application qui sont en lecture seule
99
Exemple de question :
100
Exemple de question :
101
Exemple de question :
102
Exemple de question :
103
Exemple de question :
104
Exemple de question :
105
Exemple de question :
106
Exemple de question :
107
Exemple de question :
108
Exemple de question :
109
Info pratique : les macros complémentaires
110