Aller au menu - Aller au contenu

Icône Le VBA : un langage orienté objet

Avatar
Avatar
Avatar
Mise à jour : 05/09/2011
Difficulté : Facile Facile Creative Commons BY-NC-SA
9 728 visites depuis 7 jours, dont 582 sur ce chapitre classé 26/786
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 maitriser, ça va de soit. 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.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

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 :

Code : VB.NET
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 :

Code : VB.NET
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 :

Image utilisateur


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é. :euh: Un schéma pour mieux comprendre :

Image utilisateur


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 :

Image utilisateur


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 :

Code : VB.NET
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 :

Image utilisateur


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 :

Code : VB.NET
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" :D

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 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 » :

Image utilisateur


Une fenêtre s'ouvre, il suffit de remplir le champ « Nom » et de cliquer sur « OK » :

Image utilisateur


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.

Image utilisateur


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).

Image utilisateur


Aller, hop hop hop, ouvrez VBE ! :pirate: On commence à coder :

Code : VB.NET
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 :

Code : VB.NET
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 :p . Après un clic dessus, la magie opère :

Image utilisateur


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) :

Code : VB.NET
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é :

Image utilisateur


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) :

Code : VB.NET
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 :

Code : VB.NET
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 ...
Code : VB.NET
1
2
3
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)
Code : VB.NET
1
Maisons("Ma_Maison").couleur= "Rouge"
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.
Code : VB.NET
1
2
3
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.
Code : VB.NET
1
2
3
4
5
6
7
8
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 ! :euh:


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 :

Code : VB.NET
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é :

Code : VB.NET
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 :p )
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 :

Code : VB.NET
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 à :

Code : VB.NET
 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.

Code : VB.NET
 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

Q.C.M.

Un objet est caractérisé par...
On peut imager plusieurs notions du VBA par : des plans, un objet à partir d'une classe, un groupe d'objet. Quels sont les noms techniques de ces images (dans le même ordre que les images ans la question) ?
Comment se fait l'accès aux objets ?
Quel est l'objet le plus haut dans la hiérarchie VBA ?
Quelles classes désignent tous les classeurs ouverts et toutes les feuilles d'un classeur ?
Que fait ce code ?

Code : VB.NET
1
2
3
4
5
Sub selection()

 Range("A1:B4").Select

End Sub
De quel type est cette valeur d'objet ?

Code : VB.NET
1
Worksheets("Feuil1").Range("A1").Value = "7"
Quelle structure est utilisée pour faciliter la notation des objets ?

Statistiques de réponses au QCM

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, faîtes 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.
Chapitre précédent Sommaire Chapitre suivant

Partager

7 commentaires pour "Le VBA : un langage orienté objet"
Note moyenne : 3.67 / 4 (100 votes)
Pseudo Commentaire
Hors ligne bidouille77 # Posté le 19/12/2010 à 12:44:29

bonjour,

je voulais remercier Silflex car ça fait un moment que je galère avec les propriétés du texte et en effet il y a un problème d'interaction avec le module Selection et le module texte.
En supprimant le module Selection, le module Texte fonctionne.
Néanmoins ce tutoriel est excellent !!!
encore merci pour tout le travail effectué...
Hors ligne ScorpU # Posté le 12/02/2011 à 18:50:59
Avatar

Avis : Bon

Ouaip ! Je suis tombé dans le panneau, j'aurai du regarder les commentaires avant car cela fait un petit moment que je tourne en rond... (1h30 environ :colere: )
Hors ligne Etienne # Posté le 12/02/2011 à 19:54:03
Have you mooed today ?
Avatar
Groupe : Anciens

Salut,

Tout ceci sera rectifié lors de la prochaine mise à jour :) .
Hors ligne DiagMan # Posté le 19/02/2011 à 05:58:08
Créer c'est partager
Avatar

Bonjour,
Je suis tombé dans le panneau de Selection() moi aussi...
Et puis j'ai aussi trouvé une erreur dans :
Sub texte()
...
.Font.Bold = true
...
".Font" étant répété dans la boucle, ça bloque

Quoiqu'il en soit, un grand MERCI pour toute cette aide
J'y retourne !
Hors ligne gwiiix # Posté le 14/03/2012 à 16:10:32

Avis : Très bon

Merci pour ce tuto.
Je comprends ENFIN ce qu'on e ressasse depuis 8semaines.
j'aurai du commencer par ici avant d'aller en cours.
bref, petite remarque tout de même

vu que je comprends mieux, j'ai essayé quelque chose qui rend encore la vie plus simple (ouiii, feignante, mais je l'assume)

'Selection.Font.Underline = True
ça donne le même résultat que la constante utilisée et que je serai dans l'incapacité totale de mémoriser.
n'est ce pas merveilleux?

en tout cas, merci encore pour ce tuto

Voir tous les commentaires