Skip Navigation Links
Accueil
Java Standard EditionExpand Java Standard Edition
Java EE 5Expand Java EE 5
Visual Basic .Net 2005Expand Visual Basic .Net 2005
Visual C++ .Net 2005Expand Visual C++ .Net 2005
Visual C# .Net 2005Expand Visual C# .Net 2005
Cours ASP .Net 2.0Expand Cours ASP .Net 2.0
PostgresqlExpand Postgresql
LinuxExpand Linux
Visual Studio 2008Expand Visual Studio 2008
ASP 3.0 ClassiqueExpand ASP 3.0 Classique
Cours Javascript - DOM - DHTMLExpand Cours Javascript - DOM - DHTML
Cours AjaxExpand Cours Ajax
VBAExpand VBA
AssembleurExpand Assembleur
PerlExpand Perl
MembresExpand Membres
L'auteur du site
Nouveautés sur le site
Contacts
Plan du site
Accueil > VBA > VBA Excel 2003
____________________________________________________________________________________________________
Connexion

VBA SUR EXCEL 2003

VBA = Visual Basic for Applications

Langage de programmation de la suite bureautique Office. Langage de Microsoft. Ici nous l’étudierons sur Excel 2003, de Microsoft Office 2003.

C’est un langage qui a la particularité d’être intégré à une application( Excel ici). Un langage de programmation permet d’apporter à une application(ici Excel) une puissance de déclaration de nos objectifs d’actions inégalable avec la simple interface d’Excel. L’intérêt est de pouvoir automatiser des tâches, qu’on devrait faire manuellement sinon avec le logiciel en question( Excel ici). Forcément, un langage de programmation intégré à une application concerne uniquement cette application. Il est destiné par conséquent à améliorer les apports de l’application ( Excel pour nous). VBA est intégré à Office : il y a VBA pour Excel, VBA pour Word, VBA pour Access, VBA pour Outlook, VBA pour PowerPoint. Il y a donc 5 VBA, avec bien sûr une grande base commune, plus des instructions spécifiques à l’application à laquelle il est rattaché. Car chaque application a des actions spécifiques à elle-même( par exemple outlook a besoin d’instructions VBA en rapport avec le courrier). VBA est surtout utile pour Excel.

Une autre façon de voir les choses serait de penser que VBA pour Excel( par exemple), c’est comme si vous développiez vous-même une application tableur, et qu’on vous donne la possibilité, dans VBA, d’utiliser des primitives élémentaires de tableur, pour vous éviter d’avoir à tout rééecrire.

I)Un langage plutôt orienté objet

VBA est un langage qui, comme VBScript, reprend les concepts principaux de la programmation orientée objet( d’ailleurs VBScript est un sous-ensemble de VBA). Mais on ne peut pas dire que VBA est un langage orienté objet, car tous les concepts n’y sont pas( pas d’héritage par exemple), mais les notions « vitales » sont présentes. On ne dispose pas de la classe des objets, ce qui ferme beaucoup les choses( et peut-être les simplifie pour vous en même temps !). On ne peut pas dire que VBA n’est pas objet, car tout est basé quand même sur l’objet : l’interface avec le programmeur, c’est-à-dire comment le programmeur exprime ce qu’il veut et comment il obtient les résultats, est basée sur les objets. Et c’est essentiellement ce qu’on a gardé des objets, juste le côté très pratique d’interfaçage.

La notion d’objet est présente. Et un objet possède, comme en POO, des propriétés et des méthodes.

Exemple de propriétés en VBA :

monObjet.prenom = « Jean »
ou encore monObjet.age = 26

Bien entendu, les propriétés peuvent être elle-même des objets.

b.1) La déclaration des propriétés avec With..End With

On peut déclarer les propriétés d’un objet de cette manière :

With Range("C1")
   .Value = "Valeur C1"
   .Font.Bold = True
End With

Donc:

With objet
   .prop1 = valeur
   .prop2 = valeur
   .prop3 =
   …
End With

b.2) Les propriétés « par défaut »

Certains objets possèdent ce que j’appelle une propriété « par défaut ». Prenons un exemple :
ActiveCell.Value = « jean »

Peut s’écrire ActiveCell = « jean ».
Il s’agit d’un raccourci d’écriture, intéressant car la propriété Value est souvent utilisé pour les objets cellules.

c) Les méthodes

Exemple de méthode sans paramètres :

monObjet.rouler
On remarque qu’il n’ya pas de parenthèses vides ( ). Mais nous reviendrons sur la présence ou non de parenthèses, ci-dessous.

Exemple de méthode avec paramètre :

monObjet.accelerer 200, 10 'accélere à 200 kms, pendant 10 secondes

On remarque qu’il n’y a pas de parenthèses autour des paramètres.

Autre exemple : monObjet.ecrire « Hello World »

d) Visual Basic Editor

Visual Basic Editor est l’éditeur de macros. C’est donc un éditeur de texte, avec un équivalent d’intellisense de .net( c’est-à-dire une aide à la frappe). Visual Basic Editor s’ouvre dans une fenêtre à lui, qui est distincte de la fenêtre Excel. Cette fenêtre s’appelle d’ailleurs « Microsoft Visual Basic ».

d.1) Ctrl + space

Contrôle + espace dans VBE permet de compléter automatiquement la frappe. Exemple : on tape « App » sur une nouvelle ligne, puis on fait ctrl + espace. L’éditeur nous suggère alors les diverses possibilités.

e) Les parenthèses

Prenons la fonction MsgBox. Tapons MsgBox dans Visual Basic Editor, et appuyons sur F1 pour obtenir l’aide. Une aide s’affiche en français, qui nous indique qu’il s’agit d’une fonction( et non pas une méthode, sinon « méthode » serait écrit dans l’aide).

Syntaxe affichée dans l’aide :

MsgBox(prompt[, buttons] [, title] [, helpfile, context]) 'il manque le retour qui est un integer

On nous dit que MsgBox retourne un integer, donc ceci manque à la déclaration de syntaxe ci-dessus.

On peut remarquer qu’on nous indique des parenthèses dans la syntaxe, et qu’on nous donne l’exemple :

Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Msg = "Souhaitez-vous continuer?" ' Définit le message.
Style = vbYesNo + vbCritical + vbDefaultButton2 ' Définit les boutons.
Title = "Démonstration de MsgBox " ' Définit le titre.
Help = "DEMO.HLP" ' Définit le fichier d'aide.
Ctxt = 1000 ' Définit le contexte de
' la rubrique.
' Affiche le message.
Response = MsgBox(Msg, Style, Title, Help, Ctxt)
If Response = vbYes Then ' L'utilisateur a choisi Oui.
MyString = "Oui" ' Effectue une action.
Else ' L'utilisateur a choisi Non.
MyString = "Non" ' Effectue une action.
End If

Lors de l’appel de la fonction MsgBox ici, on a mis les paramètres entre parenthèses. La raison est qu’on utilise la valeur de retour ici, donc que la fonction est utilisée en tant que fonction, et pas en tant que procédure. Pourquoi cette différence de syntaxe ? Je suppose que c’est pour nous simplifier la vie. En effet, les parenthèses représentent bien une fonction( comme les fonctions mathématiques, par exemple). Alors que quand c’est une procédure( et on peut dire que c’est une procédure si on utilise pas la valeur de retour !), il peut paraître plus intuitif de ne pas mettre de parenthèses.

Autre intérêt : la programmation est rendue plus sûre, car on indique explicitement ce qu’on veut( utiliser en tant que procédure ou en tant que fonction). Ainsi, si on n’utilise pas la valeur de retour d’une fonction, on est certain que le programmeur l’aura fait consciemment, et pas par erreur ou par oubli.

En essayant d’enlever les parenthèses, VBE( Visual Basic Editor) nous annonce une erreur de syntaxe. De même, en enlevant la valeur de retour, et en essayant de laisser les parenthèses, on a ici aussi une erreur de syntaxe.

e.2) Cas du passage par valeur et des parenthèses

Attention, il existe un cas particulier, pour les fonctions qui n’ont qu’un paramètre.
Par exemple, on appelle la fonction maProc

maProc monParam

Dans ce cas, c’est comme d’habitude.

Mais on a le droit de faire, dans ce cas particulier d’un seul paramètre :

maProc( monParam) 'on indique expressément qu’on passe monParam par valeur

Ici, les parenthèses indiquent expressément qu’on passe monParam par valeur, et non par référence comme cela aurait été le cas par défaut.

Il s’agit ici d’une syntaxe particulière, propre aux fonctions à un seul paramètre. Microsoft exploite une possibilité de syntaxe laissée libre, pour faire une syntaxe signifiant qu’on veut passer le paramètre par valeur( c’est la signification de cette syntaxe).

e.3) Le cas du Call

Call est une instruction facultative servant à appeler une procédure ou une fonction. Mais pour les fonctions, on ne peut pas utiliser la valeur de retour de la fonction( c’est donc juste pour les fonctions qu’on utilise en tant que procédure !).

Exemple :
Call maProc( paramA, paramB)

Ici les parenthèses sont obligatoires, dans tous les cas( un seul paramètre ou plus). Cela peut sembler logique car le call est une instruction de VBA qui appelle quelque chose qui peut être considéré comme une instruction( votre procédure). Donc il peut sembler naturel « d’encapsuler » au maximum notre deuxième instruction, par rapport à la première.

Et pour indiquer, comme ci-dessus, qu’on veut passer le paramètre par valeur, on fera :
Call maProc( (paramA) )
On entourera donc le paramètre entre parenthèses.

e.4) Les paramètres nommés

Exemple :
Response = MsgBox(Prompt:=Msg, Buttons:=Style, Title:=strTitle, HelpFile:=Help, Context:=Ctxt)

On indique le nom du parametre, puis “:=”, puis la valeur du paramètre. L’intérêt est la clarté de lecture, surtout si on a une suite de valeurs numériques comme paramètre.
Remarque : dans ce cas bien précis, on utilise := pour l’affectation. Mais en VBA, dans tous les autres cas, on utilise « = » pour l’affectation. Ici, c’est :=, car il y aurait pu y avoir ambiguité avec le = du test de comparaison.

Un autre intérêt des paramètres nommés est qu’on peut renseigner uniquement les paramètres qui nous intéressent( les autres seront renseignés avec des valeurs par défaut !).

Exemple :
Response = MsgBox(Prompt:=Msg, Buttons:=Style, HelpFile:=Help, Context:=Ctxt)

Ici, on a omis le paramètre ‘Title’. Par défaut, il vaudra « Microsoft Excel ».

Remarque : on peut effectuer la même chose, sans les paramètres nommés, en ne renseignant tout simplement pas le paramètre :

Response = MsgBox(Msg, Style, , Help, Ctxt) 'Remarquez les deux virgules qui se suivent


Un autre avantage est aussi de mettre les paramètres dans l’ordre qu’on désire. Et si on se trompe d’ordre, ce qu’on voulait ne sera pas mal compris, on est sûr qu’un paramètre ne sera pas pris pour un autre.

Exemple :
'ATTENTION l’ordre des paramètres est changé volontairement
Response = MsgBox(Title:=strTitle, Prompt:=Msg, Buttons:=Style, HelpFile:=Help, Context:=Ctxt)

f) Le débogueur

Sous VBE, on peut lancer l’exécution de votre macro en mode débogage pas à pas, en appuyant sur F8. Chaque appui sur F8 avancera l’exécution d’une ligne.

g) Les procédures

Exemple de procédure

Sub MacroTest( ) 'votre macro
   maProc
End Sub

Sub maProc( )
   MsgBox « On est dans maProc »
End Sub

g.1) La macro

On remarque qu’une macro est une procédure( Sub), et que c’est un point d’entrée du programme( équivalent du main du langage C). Ainsi, dans l’exemple ci-dessus, lorsque vous faîtes F8, Excel sait qu’il doit exécuter la Sub MacroTest.

On constate également qu’une macro est juste une procédure( Sub), comme n’importe quel autre Sub.

II) L’objet application

L’objet application est un objet qui représente votre application. On peut donc considérer que c’est une variable d’environnement, qui permet d’interagir avec l’environnement.

h.1) La propriété ActiveCell

Application.ActiveCell donne la cellule active
Application.ActiveCell.Value = "OUI"

Ou encore( équivalent) :
Application.ActiveCell = "OUI"

On peut écrire

ActiveCell = « OUI », et c’est tout, sans avoir besoin de préciser « Application » avant.
Attention : il s’agit bien ici d’une propriété de l’objet Application.

h.2) La propriété ActiveSheet

(Application.)ActiveSheet est la feuille active de votre classeur.

h.2.a) L’objet Range

MsgBox ActiveSheet.Range("C1")

Définition de Range de l’aide F1 :
« Cette collection représente une cellule, une ligne, une colonne ou une sélection de cellules contenant un ou plusieurs blocs contigus de cellules ou une plage 3D. »
On peut dire que l’objet Range de ActiveSheet.Range, est un objet contenant toutes les cellules de la feuille active. L’objet Range est donc une collection contenant un ensemble de cellules. Et on demande une de ces cellules, en précisant ses coordonnées x et y.
Donc
MsgBox ActiveSheet.Range("C1")
Affiche la valeur de la cellule de coordonnées C1, de la feuille courante.
En réalité, cela équivaut à
MsgBox ActiveSheet.Range("C1").Value
- Mais on peut aussi écrire
ActiveSheet.Range("C1:H4").Value = "NON"
Ceci met à « NON » la plage de cellules C1:H4, ce qui signifie les cellules des 4 premières lignes, et des colonnes C à H, soit 6*4 = 24 cellules. Cette écriture est inhabituelle dans les langages de programmation objet, car d’habitude, on demande un objet de la collection d’objets. On demande donc ici un ensemble d’objets de la collection d’objets, et le résultat n’est donc pas un objet de la collection, mais un ensemble d’objets de la collection. Le résultat de Range est donc, lui-même soit une cellule, soit une collection de cellules.
D’ailleurs on peut écrire :
ActiveSheet.Range("C1:H4").Range("C2:H3") = "YES"
Le deuxième Range commence sa numérotation de coordonnées en se référant au premier Range retourné. Donc les coordonnées A1 du deuxième Range, c’est le coin supérieur gauche du résultat du premier Range. On remarque qu’on a débordé de la capacité du premier Range, en demandant « C2 :H3 » car on déborde de deux colonnes dans la capacité du premier Range. Mais ca marche quand même.

h.3) La propriété Sheets

Application.Sheets("Feuil2").Range("A1") = "Trouvé"
Ou encore
Sheets("Feuil2").Range("A1") = "Trouvé"
Ou encore
Application.Sheets.Item("Feuil2").Range("A1") = "Ok"
Donc Item est la propriété "par défaut".
On met la valeur « Trouvé » dans la cellule de coordonnée A1 de la feuille « Feuil2 ».
La propriété Sheets est donc une collection de feuilles.

III) Généralités sur Excel

On peut considérer qu’une feuille excel est à peu près l’équivalent d’une table en base de données. Les colonnes étant les champs de la table, et chaque ligne étant un enregistrement de la table. Et qu’un classeur est donc un ensemble de tables, donc l’équivalent d’une base de données.
Ces comparaisons peuvent vous aider à mieux vous représenter les choses.

III.1) La barre d’outil Visual basic

Vous pouvez disposer d’une barre d’outil visual basic, en faisant Affichage->Barre d’outils->Visual Basic( si ce n’est déjà fait). Une petit barre d’outil apparaît alors, que vous devez éventuellement déplacer pour la placer avec les autres( elle va « s’accrocher » toute seule). Cette barre d’outil vous permet d’avoir des icônes très pratiques.

III.1.a) Enregistrer une macro

Parmi les icônes de la barre d’outil, il y a une icône qui a la forme d’un gros point rouge, et qui est « Enregistrer une macro ». L’enregistrement d’une macro, c’est juste exécuter les actions qu’on veut que notre macro exécute, puis cliquer sur l’icône d’arrêt de l’enregistrement. Le code VBA correspondant aux actions qu’on a faites est automatiquement généré. Cela vous évite d’avoir à programmer le VBA, et c’est aussi un gage d’absence de bug. Cela permet également d’avoir des exemples de code VBA, donc d’apprendre le VBA !

III.1.b) Les autres icônes de la barre d’outil

- « Sécurité » permet de choisir le niveau de sécurité des macros.
- L’icône « Visual Basic Editor » permet de démarrer la fenêtre Visual Basic Editor.
- D’autres icônes sont intéressantes, nous les verrons sans doute plus tard.

RETOUR HAUT