Après un premier chapitre d'introduction au VBA, il est temps de rentrer dans le concret. !
Si nous résumons, vous savez déclarer une macro et placer un commentaire dans un code. Nous avons même constaté qu'une liaison a été établie entre votre macro et le tableur à "proprement parlé" puisque, sans passer par l'enregistreur de macro, vous pouvez affecter votre bout de code à un objet sur votre quadrillage.
Ce chapitre introduit des notions fondamentales pour cette troisième partie du cours. Allez-y à votre rythme, mais ne brulez pas les étapes. Si vous ne comprenez pas tout, même après relectures, passez à la suite. Vous aurez peut-être un « déclic » en pratiquant. Il est vrai que cette partie est fondamentale par la suite donc il est préférable de la maîtriser, ça va de soi. Le fait de passer à autre chose (chapitre suivant) vous permettra peut-être de comprendre puisque les connaissances acquises seront utilisées d'une manière différente.
Orienté quoi ?
Le VBA est un langage orienté objet. On dira également que vous faites de la Programmation Orientée Objet (POO). Ces mots n'ont probablement aucun sens pour vous, à moins que vous n'ayez déjà fait du C++ ou encore du Java. Nous allons tenter d'étudier le concept en lui-même, puis en suite de l'appliquer à notre problème.
Dans la vie courante, vous reconnaissez un objet parce qu'il a un état physique, il est visible et vous pouvez le toucher. Une brosse à dents est un objet, un verre est un objet, un ordinateur en est un également… bref, la liste est longue. L'objet peut être reconnaissable grâce à sa couleur, par exemple, mais vous pouvez aussi effectuer des actions dessus. Nous allons prendre comme exemple votre maison (ou appartement, ne me dites pas que vous habitez dans un bateau… même si ça ne change pas grand-chose). Une maison est caractérisée par ses propriétés : elle a une année de construction, une couleur… mais on peut aussi y faire beaucoup d'action : Nettoyer, Regarder la télé … on parle alors de méthodes .
À partir de ces propriétés et méthodes, vous pouvez imaginer plein de maisons différentes, en faisant varier le nombre de pièces, par exemple. Les propriétés permettent d'identifier la maison, de la caractériser, de la singulariser. Les méthodes forment toutes les actions que l'on peut exécuter à partir de cet objet. Toutes ces maisons ont donc été fabriquées à partir d'un plan. On parle d'une classe. Lorsque vous fabriquez un objet à partir d'une classe, on dit que vous faites une instance de classe.
M@teo21 a une belle image pour ceci : imaginez un architecte qui dessine un plan de maison. Le plan correspond ici à ma classe et les maisons aux objets : en effet, à partir du plan, vous pouvez bâtir autant de maisons que vous le voulez !! J'ajoute que la définition de toutes les maisons de l'Univers, même imbriquées dans des classes différentes s'appelle une collection d'objets. !
Une classe porte le nom mis au pluriel des objets qu'elle regroupe. Ainsi, toutes vos maisons peuvent être regroupées autour de la classe Maisons
La maison : propriétés, méthodes et lieux
Continuons avec notre exemple de la maison.
Vous êtes dans votre maison et vous voulez prendre un bain (c'est une méthode), vous allez donc devoir vous rendre dans la salle de bain. Pour cela, il y a un ordre à respecter. Vous devez d'abord trouver la ville dans laquelle se trouve la maison, puis l'adresse précise et enfin trouver la salle de bain. Puisque toutes les villes se ressemblent, nous pouvons considérer la classe Villes. De là, vous trouvez votre ville à vous, qui est une instance de Villes, ou un objet issu de Villes. Il en est de même pour la classe Maisons. Des maisons, il y en a des tonnes, mais la vôtre se distingue parce que c'est votre maison. L'itinéraire à suivre est donc le suivant :
Ville > Maison > Salle de Bain > Bain En code VBA, cet itinéraire se précise en partant du plus grand conteneur ; ici, la ville contient la maison, qui contient la salle de bain, et il y a la baignoire que nous désirons. C'est comme les poupées russes : la ville est la plus grosse poupée qui contient toutes les maisons. Les lieux et objets sont séparés par un point. Le code serait donc ceci :
1 2 3 4 | Villes("Reims").Maisons("Ma_Maison").Salle_de_bains("Bain") ' Dans la classe Villes, votre ville se distingue des autres par son nom : Reims. ' Reims est un objet créé à partir de la classe Villes, qui contient aussi bien Paris que Bordeaux. |
Vous accédez ainsi à l'objet "Bain". Entre parenthèses et guillemets, vous donnez des précisions. En effet, la baignoire se différencie des autres parce qu'elle permet de prendre un bain, vous ne pourriez pas construire un objet "Lavabo" à partir de la classe "Salle_de_bain" pour faire un bain. Nous pouvons même rajouter une méthode à la fin, puisque vous désirez vous laver :
1 | Villes("Reims").Maisons("Ma_Maison").Salle_de_bains("Bain").Frotter_le_dos |
Et si vous désiriez vous laver les mains, on aurait pu créer ce fameux objet Lavabo, toujours issu de la classe Salle_de_bains !
Tout ceci n'est que schéma bien sûr, mais la syntaxe correspond à celle d'un vrai code VBA. Vous prenez donc l'objet crée à partir de la classe Salle_de_bain, vous prenez une instance de la classe Baignoire.
Retenir :
L'accès aux objets se fait comme suit :
nom_de_la_classe("Nom de l'instance de cette classe")
La POO en pratique avec la méthode Activate
Maintenant, il est temps de tester la POO en pratique, donc dans Excel (parce que les maisons, c'est bien, mais nous nous éloignons). Je propose toutefois un schéma qui va aider à comprendre la suite :
On voit, par exemple, que les couleurs sont des instances de la classe Maison : ils ont quelque chose en commun, comme la forme de la maison. De même pour l'appartement du 3ème étage, qui est une instance de la classe Appartement. Le tout est contenu dans un grand objet : la ville.
Pour Excel, c'est un peu la même chose : le big des big objets, c'est Application, qui désigne l'application Microsoft Excel. Lui-même contient la classe Workbooks, qui regroupe tous les classeurs Workbook ouverts. Et Workbook contient la classe Worksheets, qui contient toutes les feuilles Worksheet du classeur désigné. Un schéma pour mieux comprendre :
La POO en pratique
Nous allons faire nos débuts en POO avec la méthode Activate, qui active (qui vous amène) là où vous lui demandez. Par exemple, je veux aller de la première feuille à la deuxième. Il va falloir donc nommer notre classeur et deux feuilles, afin de donner un itinéraire.
Enregistrez votre classeur en le nommant "Essai". Renommez une première feuille "Départ" et l'autre "Arrivée". (l'explication se trouve dans la seconde annexe). Vous obtenez quelque chose dans ce genre :
Placez-vous sur la feuille Départ, ouvrez la fenêtre de VBA, créez un nouveau module. Maintenant, réfléchissons à l'itinéraire. On part de l'application, pour aller vers le classeur "Essai" et vers la feuille "Arrivée". Le code serait donc :
1 2 3 4 5 6 7 8 | Sub trajet() Application.Workbooks("Essai").Worksheets("Arrivée").Activate 'On part de l'application vers l'instance Essai de la classe Workbooks 'ensuite, on va à l'objet Arrivée de la classe Worksheets End Sub |
Notez que le logiciel peut vous proposer une liste de classes :
Toutefois, on peut le raccourcir : c'est comme avec les pièces de la maison, si vous êtes dans la maison, il est inutile de préciser qu'il faut aller dans cette ville et à l'adresse de la maison, puisque vous y êtes déjà. Ici, vous êtes bien sûr l'application Microsoft Excel (logique) et vous êtes aussi sur le classeur "Essai". Le bon code est donc :
1 2 3 4 5 | Sub trajet() Worksheets("Arrivée").Activate End Sub |
Il ne vous reste plus qu'à aller sur la feuille "Départ", d'y dessiner un rectangle, d'affecter votre macro et de cliquer dessus, vous serez "téléporté" vers la feuille "Arrivée"
A retenir
La classe Workbooks désigne tous les classeurs ouverts. La classe Worksheets désigne toutes les feuilles du classeur actif.
D'autres exemples
Nous allons sélectionner une plage de cellules en tapant un code VBA (bien que nous pourrions le faire par le biais de l'enregistreur de macros, mais cette partie deviendrait donc dépourvue d'utilité ) Tout d'abord, il serait bien de ne pas avoir à taper des plages dans un code via les coordonnées : il y a tellement de chiffres, de lettres, de caractères (guillemets, deux points) qu'on s'y perdrait. Je vais donc vous apprendre à … nommer une plage de cellules ! D'ailleurs, vous pourrez trouver son utilité dans les formules, bref, ça clarifie un code. Ainsi, vous appellerez la plage par son nom.
Voici comment on nomme une plage de cellule. Sélectionnez une plage de cellule, quelle qu'elle soit. Lorsque cette plage est sélectionnée, faites un clic droit et cliquez sur « Définir un nom » :
Une fenêtre s'ouvre, il suffit de remplir le champ « Nom » et de cliquer sur « OK » :
Vous remarquez que, à gauche de la barre de formule, apparait le nom de votre plage. C'est ce nom de plage que vous pouvez utiliser.
Vous pouvez retrouver votre plage à partir de cette liste déroulante en cliquant sur le nom de votre plage.
Mais revenons à notre feuille de calculs et préparons le terrain : mettons une bordure rouge autour de notre plage nommée et dessinons un rectangle, afin d'y appliquer la macro de sélection (que nous allons coder).
Aller, hop hop hop, ouvrez VBE ! On commence à coder :
1 2 3 4 5 | Sub MaSelection() ' on placera le code ici End Sub |
Rien de palpitant. Les cellules sont sous la tutelle de la classe Range, que ce soit une cellule ou une plage de cellules (jointes ou non). Nous allons utiliser également la méthode Select, qui sélectionne ce que vous lui demandez de sélectionner. Je rappelle qu'il ne sera pas nécessaire de faire mention du classeur ou de la feuille de calculs active, puisque nous y sommes déjà (donc inutile de dire d'y aller ). Voici le code :
1 2 3 4 5 | Sub MaSelection() Range("Ma_Plage").Select End Sub |
Retour à notre feuille de calculs, où nous affectons la macro MaSelection au zoli rectangle . Après un clic dessus, la magie opère :
Vous rappelez-vous le nom et de la fonction particulière de la cellule de la sélection en haut à gauche, qui n'est pas sur fond bleu ? Mais oui, c'est la cellule active ! Pour rappel, si vous saisissez des données directement sur votre sélection, elles seront rentrées dans la cellule active. Puis pour le fun, nous allons changer l'emplacement de cette cellule en VBA ! Il va falloir relever ses coordonnées ; dans mon cas, je prends C11, qui est une cellule de ma plage. Il va falloir utiliser la méthode Activate (vue ci-dessus) :
1 2 3 4 5 6 7 8 9 | Sub MaSelection() Range("Ma_Plage").Select ' on sélectionne la plage Ma_Plage, qui relève de la classe Range, à l'aide de la méthode Select Range("C11").Activate 'la cellule C11 devient la cellule active de la sélection, avec la méthode Activate End Sub |
Et après un clic sur le rectangle, l'emplacement de la cellule active est effectivement modifié :
Voilà pour les méthodes. Il y en a beaucoup d'autres. Nous les verrons en temps voulu car chacune a une fonction bien particulière. L'idée était surtout de vous initier aux manipulations des méthodes.
Les propriétés
Bien, nous avons fait joujou avec la méthode Activate, histoire de mettre en application ces histoires de classes et d'instances. La technique vue ci-dessus est valable pour toutes les méthodes, ce qui signifie que c'est comme ça qu'on en applique une. Maintenant, nous allons nous intéresser aux propriétés de l'objet ( = instance).
Les propriétés : la théorie
Nous allons reprendre (et ce, pour encore un bout de temps), l'exemple de la maison. Si vous avez pigé tout ce qui a été dit avant (dans le cas contraire, n'hésitez pas à commenter ce chapitre en précisant les points obscurs), vous devriez être capables de dresser une petite liste des propriétés possibles d'une maison :
- Elle a une couleur : couleur
- Un nombre de pièces : nombre_de_piece
Voici comment nous pourrions accéder à ces propriétés (toujours en supposant que notre maison est bien issue de la classe Maisons et que l'objet se nomme Ma_Maison) :
1 2 3 | Maisons("Ma_Maison").couleur = "verte" 'On dit que nous souhaitons accéder à l'objet Ma_Maison, de la classe Maisons 'nous accédons à la propriété couleur et nous lui affectons une valeur |
Nous pouvons faire de même avec la propriété nombre_de_piece, car la syntaxe est la même :
1 | Maisons("Ma_Maison").nombre_de_piece = 7 |
Vous remarquez que nous pouvons affecter différents types de valeurs :
Type de valeur |
Exemple |
---|---|
Numérique |
1, 5, 12 365 … ```vbnet Maisons("Ma_Maison").nombre_de_piece = 7 '7 pièces par exemple ``` |
Chaîne de caractères |
Bonjour, a, jojo, 1234 (ici, 1234 sera lu comme une suite de caractères : 1, 2, 3, 4, et non plus comme un nombre)
|
Booléen |
TRUE, FALSE : le booléen ne peut prendre que deux valeurs, TRUE ou FALSE (vrai ou faux). Ainsi, nous pourrions imaginer le choix d'une maison avec étage ou de plain-pied. Si elle est avec étage, la propriété Etage pourrait valoir FALSE et si elle est de plain-pied, elle pourrait valoir TRUE. ```vbnet Maisons("Ma_Maison").Etage = TRUE ' Notre maison a au moins un étage ``` |
Constante |
La constante est… assez particulière, mais pourtant très utilisée. Une constante est une valeur qui ne change pas. Par exemple, plusieurs constantes peuvent être valables pour notre objet. Elles peuvent ici désigner le type de notre maison. ```vbnet Maisons("Ma_Maison").Type = VILLA ' Notre maison est une villa Maisons("Ma_Maison").Type = APPARTEMENT ' Notre maison est un appartement ``` Les constantes propres à Excel commencent par le préfixe xl. |
Les propriétés : la pratique
Il faut maintenant appliquer toute cette théorie à notre bon vieux VBA.
Afin de voir en une fois nos quatre types de propriétés, nous allons créer une macro qui répond aux consignes suivantes :
-
- Taille du texte : 14
-
- Police du texte : Euclid
-
- Texte souligné
-
- Texte en gras
Vous l'avez sans doute compris, nous allons travailler sur une sélection de texte.
Mais je ne sais pas situer une sélection de texte, moi !
Plus pour longtemps. Pour travailler sur la sélection, nous allons utiliser l'objet Selection. De plus, c'est l'objet Font qui gère les polices. Décortiquons les étapes à suivre :
La taille du texte
La taille du texte est contenue dans une propriété appelée Size. Cette propriété n'accepte que des valeurs numériques (la taille du texte ). Un exemple juste parce que c'est le premier :
1 2 3 4 5 6 7 | Sub taille() Selection.Font.Size = 12 'nous modifions la taille du texte sélectionné à 12 End Sub |
La police du texte
La police se trouve dans la propriété Name. Cette propriété attend une chaîne de caractères.
Le soulignement
Le soulignement est géré par la propriété underline. Cette propriété n'accepte que des constantes. Oui, ces mystérieuses constantes qui commencent par xl. Sachez que la valeur xlUnderlineStyleSingle applique un soulignement simple au texte. En effet, avec xlUnderlineStyleDouble, on peut appliquer au texte deux traits de soulignement.
Le gras
Le gras est une propriété à lui tout seul : Bold, qui signifie "gras" en anglais. Vous remarquerez d'ailleurs au fil du cours que le VBA a une syntaxe très proche de l'anglais. Bold n'accepte que deux valeurs : True ou False ; c'est donc un booléen. Si la propriété vaut True, le texte sélectionné sera mis en gras. Dans le même genre, sachez qu'il existe la propriété Italic, qui est également un booléen et qui gère la mise en italique du texte.
Avez-vous su écrire la macro avec toutes ces indications ? Voici le corrigé :
1 2 3 4 5 6 7 8 | Sub texte() Selection.Font.Size = 14 Selection.Font.Name = "Euclid" Selection.Font.Underline = xlUnderlineStyleSingle Selection.Font.Bold = true End Sub |
Et si en plus de ça je veux mettre mon texte en italique, en couleur, et le centrer dans la cellule ? Je ne vais tout de même pas réécrire Selection.Font 50 000 fois !?
Et pourquoi pas ? Plus sérieusement, les concepteurs du VBA ont pensé à ce cas là bien avant vous. Ils ont même une solution de feignants (les programmeurs sont des feignants, on ne le dira jamais assez )
L'idée est d'expliquer à VBA qu'on va travailler un certain temps sur Selection.Font. Pour ce faire, nous allons utiliser une nouvelle notion : la structure en With ... End With
Une alternative de feignants : With … End With
Cette structure est utilisée pour faciliter les modifications des propriétés sur un même objet. Sa syntaxe est la suivante :
1 2 3 4 5 6 7 8 | With nom_de_votre_objet 'on fait ici nos modifications sur les propriétés par exemple : .propriété_1 = valeur_1 .propriété_2 = valeur_2 .propriété_3 = valeur_3 End With |
Ainsi, le code de la modification du texte équivaut à :
1 2 3 4 5 6 7 8 9 10 11 12 | Sub texte() With Selection.Font .Size = 14 .Name = "Euclid" .Underline = xlUnderlineStyleSingle .Bold = true End With End Sub |
On peut voir l'utilité de cette fonction lorsque l'on utilise des objets dont le nom est très long à écrire.
1 2 3 4 5 6 7 8 9 10 11 | Sub test() With Application.Workbooks("classeur1").Worksheets("feuil1").Range("A1") .propriété_1 = valeur_1 .propriété_2 = valeur_2 ... End With End Sub |
Voilà, c'est fini pour la partie un peu théorique. Au menu du chapitre suivant : pause bien méritée !
En attendant, si vous en voulez encore, faites des tests. Il n'y a que comme ça que vous progresserez et la POO ne s'assimile pas du jour au lendemain. Il faut absolument avoir compris l'idée de ce concept, sans quoi il est inutile de poursuivre.