You are on page 1of 162

REPUBLIQUE DEMOCRATIQUE DU CONGO

ENSEIGNEMENT SUPERIEUR ET UNIVERSITAIRE


E.S.U
INSTITUT SUPERIEUR DINFORMATIQUE ET DE GESTION

I.S.I.G
BP.841 GOMA
isiggoma@isig.ac.cd

Syllabus dExcel,
Excel-avanc
Par
Ass KIKOBYA Serge

Pour les tudiants de :


G3-IG

Anne Acadmique
2015 2016
I. Introduction
Grce aux leons proposes ci-dessous, vous allez apprendre utiliser Excel 2007, 2010,
2013 ou 2016 sans beaucoup defforts.

Les leons de ce cours/formation dExcel, Excel avanc sont bien dtailles et bien images
pour permettre aux tudiants qui dbutent sur Excel de pouvoir le suivre facilement. Le site de
microsoft (officce-excel) est votre disposition si vous avez besoin d'aide !

Ce syllabus est divis en 2 modules, contenant chacun 10 leons.

2
Compil par Ass Serge KIKOBYA
Module-1 : Formation sur Excel
I.1. Leons 1
I.1.1. Les bases (bases, texte)

La leon 1 est une leon de base qui vous permettra de dbuter avec Excel, elle sera fort utile
pour les prochaines leons.

Remarque : chaque fois quil est demand de cliquer, il sagira deffectuer un clic gauche si
rien nest prcis.

A chaque dmarrage dExcel, un classeur vierge souvre avec 3 feuilles. Vous pouvez passer
dune feuille lautre en cliquant simplement sur le nom de la feuille (onglets en bas de
page).

Chaque case reprsente une cellule (une cellule a t passe en vert sur l'image). Ce sont
les cellules que vous devrez modifier par la suite afin de crer toutes sortes de choses.
La croix reprsente la souris, elle peut prendre diffrentes formes.
La zone rouge reprsente le nom de la cellule.
La zone bleue reprsente le contenu de la cellule slectionne.
Commenons la leon.
Ouvrez Excel et slectionnez la cellule A1 (en cliquant une fois dessus) :

Aprs avoir slectionn la cellule, tapez le mot Texte :

3
Compil par Ass Serge KIKOBYA
Appuyez ensuite sur Enter.

Slectionnez nouveau la cellule A1, positionnez ensuite le pointeur de la souris au fond


droite de la cellule A1, un + apparat.

Faites maintenant un clic sans relcher et descendez jusqu la ligne 12 :

Puis, relchez :

4
Compil par Ass Serge KIKOBYA
Vous remarquerez que le texte a t copi dans chaque cellule.
Replacez le pointeur en bas droite, cliquez sans relcher et avancez jusqu la colonne C.

Les cellules ont encore t copies ...

Nous allons maintenant annuler tout ce qui a t fait jusquici.


Cliquez sur la flche en haut gauche ( l'endroit indiqu sur l'image ci-dessous) et annulez
ces oprations.

5
Compil par Ass Serge KIKOBYA
Remarque : cette action va annuler tout ce qui a t cr jusquici, pour nannuler quune seule
opration, cliquez sur la petite flche bleue ou appuyez sur Ctrl + z .
Puisque la feuille est nouveau vide, slectionnez la cellule A1 et entrez Texte 1 au lieu
du prcdent Texte . Rptez ensuite les mmes oprations quavec Texte .
Vous devriez obtenir quelque chose ressemblant cela :

Observez les numros (nous y reviendrons la leon 5).


Slectionnez ensuite les cellules de C1 C12. Pour ce faire, cliquez sans relcher sur la
premire cellule, descendez jusqu la dernire puis relchez.

6
Compil par Ass Serge KIKOBYA
Changer de police de caractres
Maintenant que les cellules sont slectionnes, vous pouvez changer leur police de caractres.
Cliquez l'endroit indiqu et choisissez une police.

7
Compil par Ass Serge KIKOBYA
I.1.2. les bases (mise en forme du texte)

Changer la taille des caractres


Slectionnez les cellules A5 C5.

Slectionnez la taille 20 depuis la liste droulante suivante :

Modifier la largeur des colonnes

Slectionnez les colonnes A C.

8
Compil par Ass Serge KIKOBYA
Placez ensuite le pointeur sur le trait entre 2 des colonnes slectionnes :

Cliquez sans relcher, allez vers la droite pour largir les colonnes, et vers la gauche pour les
rtrcir. Dans ce cas, allez vers la droite.

Toutes les colonnes slectionnes subissent les mmes changements.


Texte en gras
Slectionnez ces 3 cellules puis cliquez sur G.

9
Compil par Ass Serge KIKOBYA
Texte en italique

Slectionnez ces 4 cellules puis cliquez sur I.

Souligner
Conservez la slection et cliquez sur S.

10
Compil par Ass Serge KIKOBYA
Maintenant, supprimons leffet italique .

Conservez toujours la slection et cliquez sur I.

Entrez 55 en B13 et recopiez la cellule jusquen B18 (de la mme manire quavec
Texte 1 ) :

11
Compil par Ass Serge KIKOBYA
Entrez maintenant 55 en C13 et 56 en C14.

Slectionnez ensuite ces 2 cellules et procdez de la mme manire quavec le 55 mais


cette fois jusquen C18.

Vous obtenez :

12
Compil par Ass Serge KIKOBYA
Leons-2. Les tableaux
Pour crer un tableau, il existe diffrentes possibilits.

1re mthode
Slectionnez la zone quadriller et cliquez lendroit indiqu par limage.

Vous obtenez un premier quadrillage.

Vous pouvez galement slectionner d'autres cellules et ajouter un autre style de bordure ...

13
Compil par Ass Serge KIKOBYA
2e mthode
Slectionnez les cellules de votre choix, faites un clic droit et cliquez sur Format de cellule .

Cliquez sur longlet Bordure et modifiez-les votre guise.

14
Compil par Ass Serge KIKOBYA
3e mthode
Cliquez lendroit indiqu par le pointeur ...

15
Compil par Ass Serge KIKOBYA
Cela vous permet de tracer des bordures la main. C'est une solution intressante pour les
tableaux aux formes inhabituelles.

Couleur et style des traits


Vous pouvez slectionner une couleur et un style de trait pour tracer vos bordures (mthodes 1 et
3) depuis le bouton Bordures .

Vous retrouverez les mmes choix si vous tracez vos bordures depuis Format de cellule .

16
Compil par Ass Serge KIKOBYA
Couleur de fond

Nous avons vu la premire leon comment changer la couleur de fond d'une cellule. Si vous
voulez plus de choix (dgrad de couleurs/textures), rendez-vous dans Format de cellule ,
onglet Remplissage .

17
Compil par Ass Serge KIKOBYA
La couleur ne vous plat pas ? Dans ce cas, cliquez sur l'onglet Mise en page puis sur Thmes
pour choisir un nouveau thme pour votre tableau (ou sur Couleur si vous ne voulez
modifier que les couleurs).

Les modles de tableau


Maintenant que vous savez faire un tableau, voici une solution de facilit ...

Slectionnez les cellules du tableau.

Cliquez sur Mettre sous forme de tableau et choisissez un style.

18
Compil par Ass Serge KIKOBYA
Vous obtenez par exemple :

Exercice
Si vous avez suivi cette leon, il est recommand de faire lexercice 2. L'objectif est de reproduire
le tableau suivant partir des donnes existantes sur la seconde feuille :

Format de cellule

Slectionnez une ou plusieurs cellules, faites un clic droit sur votre slection et choisissez Format
de cellule .

19
Compil par Ass Serge KIKOBYA
Depuis cette fentre vous pourrez personnaliser l'affichage et la mise en forme de vos cellules.

Longlet Nombre
Pour obtenir un nombre avec des dcimales fixes, choisissez Nombre et dfinissez le nombre
de dcimales :

20
Compil par Ass Serge KIKOBYA
Pour ajouter le symbole montaire, choisissez Montaire ou Comptabilit :

Si la cellule contient une date, vous pouvez formater cette date.

21
Compil par Ass Serge KIKOBYA
Depuis Date :

Vous pouvez galement modifier laffichage des heures, des nombres (pourcentage, fraction,
scientifique), etc. depuis cet onglet.

Longlet Alignement
Vous pouvez modifier lalignement vertical/horizontal du texte, son orientation, activer le renvoi
automatique la ligne si ncessaire (pour le texte qui dpasse de la cellule), etc.

22
Compil par Ass Serge KIKOBYA
Longlet Police
Il permet de personnaliser le texte ...

23
Compil par Ass Serge KIKOBYA
Les onglets Bordures et Remplissage
Ils permettent d'ajouter des bordures ainsi qu'une couleur/un motif en fond de cellule (vu la
leon prcdente).

I.4. Cours Excel : insertion d'objets (formes)

Les formes

Pour insrer une forme, cliquez sur l'onglet Insertion puis sur Formes et choisissez la forme
qui vous intresse.

La forme est alors insre avec une mise en forme par dfaut.

En slectionnant la forme, l'onglet Format est affich.

Vous pouvez modifier rapidement sa mise en forme avec les choix prdfinis.

24
Compil par Ass Serge KIKOBYA
Vous pouvez galement modifier chaque lment sparment (ici, la couleur de fond).

Le contour de la forme :

Diffrents effets prdfinis :

25
Compil par Ass Serge KIKOBYA
Il est aussi possible de changer de forme en conservant son style actuel.

Vous pouvez ajouter du texte dans la forme.

Quelques exemples de formes avec des styles diffrents :

26
Compil par Ass Serge KIKOBYA
Les manipulations
Pour faire pivoter une forme, cliquez sur le point vert :

Les points jaunes permettent de modifier l'paisseur de certaines parties de la forme (dans le cas
d'une flche, il est possible de modifier l'paisseur de la pointe et de la partie rectangulaire).

27
Compil par Ass Serge KIKOBYA
Pour modifier la largeur/hauteur de la forme, utilisez les points blancs.

D'autres possibilits de rotation :

28
Compil par Ass Serge KIKOBYA
WordArt

Pour insrer du texte avec des effets graphiques proches de ceux des formes, cliquez sur l'onglet
Insertion puis sur WordArt et choisissez un style.

Entrez ensuite votre texte.

29
Compil par Ass Serge KIKOBYA
Vous pouvez, tout comme les formes, modifier le style de votre texte depuis l'onglet Format .

Les possibilits de personnalisation sont assez proches de celles des formes, inutile donc d'entrer
dans les dtails ...

Vous pouvez modifier la taille et la police de caractres depuis l'onglet principal.

Insrer une image


Pour insrer une image, cliquez sur l'onglet Insertion puis sur Image

30
Compil par Ass Serge KIKOBYA
Lorsque votre image est slectionne, l'onglet Outils Image est affich.

Les 4 premiers boutons vous permettent de retoucher votre image et d'ajouter un effet artistique
si vous le souhaitez.

Un exemple avec suppression de l'arrire-plan et effet artistique :

31
Compil par Ass Serge KIKOBYA
Vous pouvez choisir un cadre pour votre photo (flout, ombrag, relief, 3d, etc.) et modifier
ensuite les proprits comme bon vous semble (comme pour les formes).

Vous pouvez galement intgrer votre image un "groupe de formes" prdfini.

Vous pouvez ensuite personnaliser chaque lment individuellement.

32
Compil par Ass Serge KIKOBYA
Plus de dtails sur ce sujet la page suivante ...

Pour insrer un graphique SmartArt, cliquez sur l'onglet Insertion puis sur SmartArt .

Choisissez un style.

Entrez le texte.

33
Compil par Ass Serge KIKOBYA
Vous pouvez ensuite modifier les dispositions du graphique si ncessaire.

Vous pouvez changer les couleurs.

Et modifier le style du graphique :

Vous pouvez galement modifier chaque lment du graphique sparment.

34
Compil par Ass Serge KIKOBYA
I.5. La recopie incrmente

La recopie incrmente permet souvent un gain de temps considrable, en vous vitant de


rpter maintes fois les mmes oprations.

Commencez par entrer le chiffre 1 et le chiffre 2 juste au-dessous, vous obtenez :

Nous allons numroter jusqu 20.

Pour ce faire, placez le pointeur sur lextrmit infrieure droite de la slection, cliquez sans
relcher jusqu lapparition du 20.

Relchez ensuite pour obtenir ceci :

35
Compil par Ass Serge KIKOBYA
Une alternative pour effectuer la mme recopie : entrez le chiffre 1 en A1 :

Vous obtenez :

Choisissez ensuite Incrmenter une srie :

36
Compil par Ass Serge KIKOBYA
La recopie incrmente sapplique aussi aux jours, mois, dates, heures, etc.

En voici un exemple :

Le rsultat :

Si vous dsirez un intervalle diffrent, faites comme suit :

Vous obtenez alors :

Incrment A : 2 jours
Incrment B : 2 mois
Incrment C : les mois (au lieu des jours)
Incrment D : 2 heures
Incrment E : + 2
Incrment F : + 10

37
Compil par Ass Serge KIKOBYA
Exemple avec une fonction
La cellule slectionne contient la somme des chiffres encadrs.

En procdant la recopie suivante :

Vous obtenez 2 autres chiffres qui reprsentent la somme de leur colonne de chiffres respective :

38
Compil par Ass Serge KIKOBYA
Recopier une mise en forme
Exemple de recopie de mise en forme avec les 2 lignes suivantes.

Slectionnez et recopiez simplement les lignes.

Vous obtenez :

I.6. formules de calculs et fonctions

Structure des formules de calcul

Commencez toujours votre calcul par le signe = , ensuite sans laisser despaces, placez un chiffre
suivi dun signe suivi dun autre chiffre, etc. Ajoutez des ( ) si cela savre ncessaire.

Exemples :

=45-32 (Excel affichera la rponse : 13)

39
Compil par Ass Serge KIKOBYA
=(45-32)^2/10 (Excel affichera la rponse : 16.9)

Observez ce tableau :

Les calculs peuvent galement tre effectus partir des donnes provenant de cellules.

Dans ce cas, commencez aussi par un = , cliquez ensuite sur une premire cellule, ajoutez un
signe, cliquez sur une autre cellule, etc. Ajoutez des ( ) si cela savre ncessaire.

Observez bien les formules :

40
Compil par Ass Serge KIKOBYA
Les formules du tableau ci-dessus utilisent les valeurs de A8 et A9. Le principal avantage de ce
systme est de pouvoir modifier tous les rsultats automatiquement (sans toucher aux formules)
en changeant simplement les valeurs de A8 et A9, exemple :

Introduction sur les fonctions


Nous ne verrons ici que quelques fonctions pour vous en montrer lutilit.

Il existe une multitude de fonctions. Vous trouverez des explications sur les fonctions les plus
utilises sur la page consacre aux fonctions (accessible via le lien Fonctions en haut de page).

Fonction SOMME
Slectionnez la cellule o vous souhaitez entrer la somme. Cliquez ensuite sur l'onglet Formules
puis sur Somme automatique .

41
Compil par Ass Serge KIKOBYA
Slectionnez ensuite la plage de cellule dont vous souhaitez obtenir la somme (dans le cas
prsent, la slection propose par Excel est la bonne).

La somme des cellules D2 D6 a bien t calcule.

42
Compil par Ass Serge KIKOBYA
Fonction MOYENNE
Il existe diffrents raccourcis dans l'onglet Formules pour insrer une fonction. Cette fois-ci,
nous allons insrer la fonction sans utiliser l'un de ces raccourcis ...

Slectionnez la cellule o vous souhaitez insrer la moyenne et cliquez sur Insrer une fonction
:

Recherchez et slectionnez la fonction MOYENNE :

Appuyez sur OK. La fentre de la fonction s'ouvre.

Slectionnez la plage de cellules utiliser pour calculer la moyenne.

43
Compil par Ass Serge KIKOBYA
Vous obtenez :

Fonction SI

Cliquez sur Insrer une fonction et slectionnez la fonction SI.

44
Compil par Ass Serge KIKOBYA
Dans ce cas, le but est dafficher Oui si le rsultat est plus grand que 10 et Non si ce nest
pas le cas.

Le test logique va permettre de savoir si la fonction doit afficher Oui ou Non .


Test logique : D2>10 (dans ce cas, on demande si D2 est plus grand que 10)
Si cest vrai, la fonction affiche Oui .
Si cest faux, la fonction affiche Non .

Entrez les diffrentes valeurs et validez.

Remarque : si l'une des valeurs est du texte, il est ncessaire de la mettre entre guillemets (exemple : "Oui").

Un Oui est alors affich en E2.

Maintenant faites une recopie incrmente jusqu la cellule E6.

Le rsultat est correct (les formules se sont adaptes : chaque recopie d'une ligne vers le bas, le
n de ligne des cellules de la formule a t augment de 1).

45
Compil par Ass Serge KIKOBYA
Maintenant, si l'on veut changer la valeur limite de 10 (pour dterminer si c'est Oui ou Non
qui doit tre affich), il va falloir modifier chaque formule, ce n'est donc pas trs pratique.

A la place d'entrer la valeur 10 directement dans la formule, nous allons faire rfrence une
cellule contenant 10. De cette manire, lorsqu'on voudra modifier cette valeur limite, il suffira de
modifier la valeur de la cellule.

Pour le faire, remplacez simplement 10 par A10 :

46
Compil par Ass Serge KIKOBYA
Oprateurs de comparaison

Dans l'exemple prcdent, nous avons voulu savoir si la valeur tait plus grande que en
utilisant le signe > . Voici les autres oprateurs que vous pouvez utiliser :
= est gal
<> est diffrent de
< est plus petit que
<= est plus petit ou gal
> est plus grand que
>= est plus grand ou gal

Ainsi que :

=ET(formule_1;formule_2;formule_3)
ET Toutes les conditions doivent tre vraies

=OU(formule_1;formule_2;formule_3)
OU Au moins une des conditions doit tre vraie

Voici un exemple avec la fonction SI et l'utilisation de ET :

D'autres fonctions
Vous trouverez des explications sur les fonctions les plus utilises sur la page consacre aux
fonctions (accessible via le lien Fonctions en haut de page).

47
Compil par Ass Serge KIKOBYA
I.7. Insertion de graphiques

Le tableau suivant sera utilis en exemple lors de cette leon (vous pouvez le tlcharger
en cliquant ici).

Slectionnez le tableau et choisissez un graphique dans l'onglet Insertion .

Le graphique est insr sur la feuille.

48
Compil par Ass Serge KIKOBYA
Lorsque vous slectionnez le graphique des onglets supplmentaires sont affichs.

Pour changer (si ncessaire) de type de graphique, cliquez sur Modifier le type de graphique .

Et choisissez un nouveau type.

Vous pouvez choisir une des dispositions de graphique prdfinies.

49
Compil par Ass Serge KIKOBYA
Vous pouvez galement choisir l'un des styles prdfinis.

A partir de l'onglet Dispositions , vous pouvez ajouter/retirer/personnaliser les lments


suivants : titres, lgendes, tiquettes, table de donnes, axe, quadrillage, paroi, etc.

50
Compil par Ass Serge KIKOBYA
Il est galement possible de personnaliser les diffrents lments sparment (en les
slectionnant sur le graphique).

Par exemple :

51
Compil par Ass Serge KIKOBYA
Quant l'onglet Mise en forme , il est semblable l'onglet Format que nous avons dj vu.

52
Compil par Ass Serge KIKOBYA
Modifier la source du graphique
Pour changer la plage de donnes prendre en compte pour le graphique, cliquez sur
Slectionner des donnes... .

Modifiez ensuite simplement la plage (en la slectionnant sur la feuille).

Insertion de graphiques sparkline

Un graphique sparkline est un tout petit graphique intgr une cellule (les graphiques sparkline
ne sont pas disponibles avec les versions d'Excel infrieures 2010).

53
Compil par Ass Serge KIKOBYA
Pour insrer un graphique, slectionnez la cellule de destination et choisissez un style de
graphique.

Slectionnez la plage de donnes et validez.

Le graphique a t insr.

Vous pouvez effectuer une recopie pour les lignes suivantes.

L'onglet Cration vous permet de modifier la mise en forme du graphique.

54
Compil par Ass Serge KIKOBYA
Exemple de mise en forme :

I.8. Mises en forme conditionnelles

Comme son nom l'indique, la mise en forme conditionnelle (abrge en MFC) est une mise en
forme applique sous certaines conditions.

Commenons avec quelques exemples de MFC "prtes l'emploi".

Slectionnez les cellules cibles et choisissez la MFC Suprieur ... :

Entrez une valeur limite (ici, 50'000) et choisissez une mise en forme.

55
Compil par Ass Serge KIKOBYA
La mise en forme est alors applique toutes les valeurs suprieures 50'000.

En choisissant la MFC 10 valeurs les plus leves... , la mise en forme sera applique sur les 10
valeurs les plus leves de la plage de cellules.

Vous pouvez ensuite dfinir le nombre de valeurs mettre en vidence (ici, 5) ainsi que la mise en
forme.

56
Compil par Ass Serge KIKOBYA
Les 5 valeurs les plus leves sont alors mises en forme.

Exemple avec les barres de donnes :

Exemple avec les nuances de couleur :

57
Compil par Ass Serge KIKOBYA
Exemple avec les jeux d'icnes :

Mises en forme conditionnelles sur mesure

Pour ce nouvel exemple, un mois a t entr dans la cellule B8.

L'objectif ici est de crer une MFC qui va colorer automatiquement la colonne du tableau en
fonction du mois en B8.

Slectionnez les cellules du tableau et choisissez Nouvelle rgle... :

Slectionnez le dernier type de rgle pour entrer une formule.

Commencez votre formule avec un = , entrez ensuite la premire cellule tester (ici, B1) et
finissez avec le test =$B$8 (avec des $ pour "fixer" la cellule).

58
Compil par Ass Serge KIKOBYA
Avec =B1=$B$8 , la MFC est applique chaque cellule contenant la valeur recherche (ici,
Fvrier).

La formule =B1=$B$8 est celle de la premire cellule du tableau, dans les autres cellules la
formule est modifie (comme lors d'une recopie incrmente).

Ce tableau devrait vous aider mieux comprendre le test effectu pour chaque cellule :

59
Compil par Ass Serge KIKOBYA
Pour mettre en forme la colonne entire et pas seulement une cellule, il va falloir "fixer" le n de
ligne avec un $ .

Pour modifier la formule, cliquez sur Grer les rgles... puis Modifier la rgle... .

Ajoutez un $ devant le n de ligne.

Cette fois-ci, toute la colonne a t mise en forme.

60
Compil par Ass Serge KIKOBYA
Les tests effectus sur les cellules :

Pour mettre en forme une colonne, il suffit maintenant de modifier le mois en B8.

Exemples de mises en forme conditionnelles

Voici quelques exemples varis de MFC avec leur fichier source (tlchargeable).

61
Compil par Ass Serge KIKOBYA
1. Afficher "pay" dans une cellule lorsque la date de paiement est saisie
Slectionnez les cellules cibles et choisissez la MFC Egal ... :

Entrez ="IMPAYE" et dfinissez une mise en forme.

Rptez l'opration avec ="PAYE" .

Vous obtenez :

62
Compil par Ass Serge KIKOBYA
2. Afficher les retards de paiement en fonction de la date du jour

Grce la fonction AUJOURDHUI, la MFC utilisera la date du jour pour dterminer s'il y a un
retard de paiement.

3. Afficher les doublons


Choisissez la MFC Valeurs en double... :

63
Compil par Ass Serge KIKOBYA
Dfinissez la mise en forme.

Les doublons sont mis en vidence.

I.10. Complments

Pour imprimer rapidement un document, cliquez sur Fichier puis Imprimer .

Si votre document est au format paysage, modifiez l'orientation.

64
Compil par Ass Serge KIKOBYA
Si ncessaire, modifiez les marges et/ou utilisez les options d'ajustement.

Imprimez ensuite votre document.

Dfinir une zone d'impression


Lorsque vous cliquez sur un bouton en rapport avec l'impression/la mise en page, Excel affiche les
limites d'impression pour chaque page.

65
Compil par Ass Serge KIKOBYA
Dans le cas prsent, modifiez l'option Echelle (ou les marges) pour intgrer l'ensemble du
tableau sur la page.

Pour imprimer uniquement le tableau (sans le texte au-dessous), slectionnez le tableau et cliquez
sur ZoneImpr puis Dfinir .

66
Compil par Ass Serge KIKOBYA
Seul le tableau sera imprim.

Pour empcher l'impression d'un objet, ouvrez sa fentre de proprits :

67
Compil par Ass Serge KIKOBYA
Et dcochez Imprimer l'objet .

Utilisation d'une base de donnes


Le but de cette leon est de vous donner un exemple dutilisation de donnes contenues dans
une base de donne.

68
Compil par Ass Serge KIKOBYA
Dans cet exemple, l'objectif est d'entrer l'adresse du client sur la facture l'aide d'une liste
droulante.

Commencez par insrer la fonction RECHERCHEV l'emplacement du nom et compltez les


paramtres de la fonction (voir image ci-dessous) :

Valeur_cherche : I2 : la cellule qui contient le n du client rechercher.


Table_matrice : BD!A:E : slectionnez ici les colonnes A E de la feuille BD (remarque : en
indiquant des colonnes et non pas des cellules, vous pourrez complter votre base de donnes
ultrieurement sans avoir modifier les formules).
No_index_col : le n de colonne indiqu ici correspond une colonne de Table_matrice. En entrant
2 nous obtiendrons le nom, 3 le prnom, 4 ladresse et 5 le lieu.
Valeur_proche : FAUX : pour obtenir des valeurs exactes

Le nom du client n1 est affich.

69
Compil par Ass Serge KIKOBYA
Copiez la formule (sans la modifier) aux emplacements suivants :

Modifiez maintenant la paramtre No_index_col pour obtenir toutes les informations.

Concatner plusieurs valeurs


Dans cet exemple intermdiaire, A1 et B1 contiennent un mot. L'objectif est d'entrer ces 2 mots
en A2.

70
Compil par Ass Serge KIKOBYA
Pour concatner (= assembler) plusieurs valeurs, utilisez le signe & .

Dans le cas prsent, nous voulons obtenir : A1 + un espace + B1, ce qui nous donne :

Les 2 mots sont bien entrs en A2 et spars par un espace.

Pour obtenir sur notre facture le nom et le prnom spars par un espace, c'est exactement pareil
la seule diffrence prs que A1 et B1 sont remplacs par les formules :

71
Compil par Ass Serge KIKOBYA
Module-2 : Formation sur Excel Avanc
Grce aux diffrentes leons proposes, vous allez apprendre le VBA (macros Excel)...

Si vous pensez que crer des macros est trop compliqu et que ce n'est pas votre porte, soyez
rassur(e), ce cours est adapt aux personnes dbutantes en programmation et dmarre de zro.

Tout comme le cours Excel, les leons sont riches en exemples et simplifies autant que possible
afin de faciliter l'apprentissage du VBA.

Il est recommand de suivre les leons en respectant l'ordre donn car, chaque nouvelle leon,
vous aurez besoin des connaissances acquises au cours des leons prcdentes.

Leon 1 :
Introduction
Premire macro

Leon 2 :
Les slections
Les proprits
Les couleurs

Leon 3 :
Les variables
Les variables (suite)

Leon 4 :
Les conditions
Les conditions (suite)

Leon 5 :
Les boucles
Les boucles (exercice)

Leon 6 :
Les procdures et fonctions

72
Compil par Ass Serge KIKOBYA
Leon 7 :
Les botes de dialogue

Leon 8 :
Les vnements Workbook
Les vnements Worksheet

Leon 9 :
Les formulaires et contrles
Les formulaires et contrles (suite)
Les formulaires et contrles (suite 2)
Les formulaires et contrles (exercice)

Leon 10 :
Les tableaux
Les tableaux (suite)
Les tableaux (exercice)

Leon 11 :
Utilisations des fonctions
Cration d'une fonction personnalise

Formation avance :
Dvelopper une application complexe

Astuces VBA :
Diverses astuces utiles en VBA

II.1. Introduction

Le VBA (Visual Basic for Applications) est un langage proche du Visual Basic qui ncessite une
application hte pour s'excuter (Excel dans notre cas).

Grce au VBA nous allons pouvoir raliser peu prs tout ce que l'on souhaite avec Excel ...

Mais avant de commencer, commenons par afficher les outils qui nous seront utiles.

73
Compil par Ass Serge KIKOBYA
Si vous utilisez la version 2007 d'Excel (ou une version suprieure), cliquez sur Fichier > Options >
Personnaliser le Ruban puis cochez "Dveloppeur".

Un nouvel onglet sera ajout :

Si vous utilisez une version d'Excel antrieure 2007, ajoutez les barres "Botes outils Contrles"
et "Formulaires" :

Pour travailler avec du code VBA, nous avons besoin d'un diteur, celui-ci est dj install et vous
pouvez l'ouvrir avec le raccourci "Alt F11" :

74
Compil par Ass Serge KIKOBYA
Nous y reviendrons, retenez simplement le raccourci "Alt F11" pour le moment ...

Il est possible d'automatiser certaines tches en toute simplicit grce l'enregistreur de macros.

Pour prendre un exemple simple, nous allons automatiser les oprations suivantes :

supprimer le contenu des colonnes A et C


dplacer le contenu de la colonne B dans
la colonne A
dplacer le contenu de la colonne D dans
la colonne C

Pour ce faire, cliquez sur "Enregistrer une macro" puis "Ok", excutez les oprations dcrites ci-
dessus sans interruption (car toutes les manipulations sont enregistres) puis cliquez sur "Arrter
l'enregistrement".

Pour les versions d'Excel infrieures 2007 : Outils > Macros > Nouvelle macro.

75
Compil par Ass Serge KIKOBYA
Excel a enregistr vos manipulations et les a traduites en code VBA.

Pour voir votre macro, ouvrez l'diteur (Alt F11) et cliquez sur "Module1" :

Ce code correspond aux manipulations enregistres.

Nous allons nous arrter quelques instants sur le code gnr :

Sub Macro1()
'
' Macro1 Macro
'

'

76
Compil par Ass Serge KIKOBYA
Columns("A:A").Select
Selection.ClearContents
Columns("C:C").Select
Selection.ClearContents
Columns("B:B").Select
Selection.Cut Destination:=Columns("A:A")
Columns("D:D").Select
Selection.Cut Destination:=Columns("C:C")
Columns("C:C").Select
End Sub
Sub et End Sub dlimitent le dbut et la fin de la macro, "Macro1" correspond au nom de cette
macro :
Sub Macro1()

End Sub

Nous allons modifier le nom de cette macro par quelque chose de plus parlant, remplacez
simplement "Macro1" par "manipulations_des_colonnes" (le nom ne doit pas contenir d'espaces) :

Sub manipulations_des_colonnes()

Le texte en vert (texte prcd d'une apostrophe) est un commentaire, il n'est pas pris en compte
l'excution du code :

'
' Macro1 Macro
'

'

Les commentaires sont trs utiles pour s'y retrouver lorsque l'on a beaucoup de code ou pour ne
pas xcuter certaines lignes de code sans pour autant les supprimer.

Sub manipulations_des_colonnes()
'
'Mon premier commentaire !
'
Columns("A:A").Select
Selection.ClearContents
Columns("C:C").Select
Selection.ClearContents
Columns("B:B").Select
Selection.Cut Destination:=Columns("A:A")
Columns("D:D").Select
Selection.Cut Destination:=Columns("C:C")
Columns("C:C").Select
End Sub

Maintenant, nous voulons que cette macro s'excute en cliquant sur un bouton.

Cliquez sur Insrer > Bouton (Contrles de formulaires) :

Pour les versions d'Excel infrieures 2007 : "Bouton" de la barre "Formulaires".

77
Compil par Ass Serge KIKOBYA
Tracez votre bouton et slectionnez ensuite simplement votre macro :

Lorsque vous cliquerez sur le bouton, la macro sera excute :

78
Compil par Ass Serge KIKOBYA
II.2. Les feuilles et cellules

Nous allons commencer par crer une macro qui slectionnera une cellule de notre choix.

Ouvrez l'diteur et ajoutez-y un module :

Dans le module, tapez "sub selection" et appuyez sur Enter.

Vous remarquerez qu'Excel a automatiquement ajout la fin de cette nouvelle procdure :

Sub selection()

End Sub

Crez maintenant un bouton de formulaire auquel vous allez associer cette macro (vide pour le
moment) :

79
Compil par Ass Serge KIKOBYA
Compltez votre macro avec ceci :

Sub selection()
'Slection de la cellule A8
Range("A8").Select
End Sub

Vous pouvez tester cette macro en cliquant sur votre bouton de formulaire, la cellule A8 est alors
slectionne.

Nous allons maintenant modifier cette macro pour slectionner la cellule A8 de la seconde feuille
:

Sub selection()
'Activation de la feuille 2
Sheets("Feuil2").Activate
'Slection de la cellule A8
Range("A8").Select
End Sub

Excel active alors la feuille 2 avant de slectionner la cellule A8.

Remarque : aidez-vous des commentaires (texte en vert) pour bien comprendre les macros de ce cours.

Slection de cellules distinctes


Sub selection()
'Slection des cellule A8 et C5
Range("A8, C5").Select
End Sub

80
Compil par Ass Serge KIKOBYA
Slection d'une plage de cellules
Sub selection()
'Slection des cellules A1 A8
Range("A1:A8").Select
End Sub

Slection d'une plage de cellules renomme


Sub selection()
'Slection des cellules de la plage "ma_plage"
Range("ma_plage").Select
End Sub

Slection d'une cellule en fonction d'un numro de ligne et de colonne


Sub selection()
'Slection de la cellule de la ligne 8 et de la colonne 1
Cells(8, 1).Select
End Sub

Cette autre manire de slectionner permet des slections plus dynamiques et sera bien utile par
la suite.

En voici un petit exemple :

Sub selection()
'Slection alatoire d'une cellule de la ligne 1 10 et de la colonne 1
Cells(Int(Rnd * 10) + 1, 1).Select
'Traduction :
'Cells([nombre_alatoire_entre_1_et_10], 1).Select
End Sub
Ici, le numro de ligne est : Int(Rnd * 10) + 1, autrement dit : un nombre entre 1 et 10 (inutile de
retenir ce code pour le moment).

Dcaler une slection


Sub selection()
'Slection d'une cellule (calcule par rapport la cellule active actuelle)

81
Compil par Ass Serge KIKOBYA
ActiveCell.Offset(2, 1).Select
End Sub

Dcalage de 2 lignes vers le bas et 1 colonne vers la droite partir de la cellule active, puis
slection :

Slection de lignes
Il est possible de slectionner des lignes entires avec Range ou Rows (Rows tant spcifique aux
lignes).
Sub selection()
'Slection des lignes 2 6
Range("2:6").Select
End Sub
Sub selection()
'Slection des lignes 2 6
Rows("2:6").Select
End Sub

Slection de colonnes
Tout comme pour les lignes, il est possible de slectionner des colonnes entires
avec Range ou Columns (Columns tant spcifique aux colonnes).
Sub selection()
'Slection des colonnes B G
Range("B:G").Select
End Sub
Sub selection()
'Slection des colonnes B G
Columns("B:G").Select
End Sub

Nous allons maintenant agir sur le contenu et l'apparence des cellules et des feuilles.

82
Compil par Ass Serge KIKOBYA
Commencez par ouvrir l'diteur, ajoutez-y un module, copiez la macro ci-dessous et associez-la un
bouton formulaire (voir page "Slections" en cas de besoin) :
Sub proprietes()
'Macro incomplte
Range ("A8")
End Sub

Nous voulons effectuer une action sur la cellule A8 avec ce dbut de macro.

Pour afficher la liste des possibilits que l'on peut associer l'objet Range, ajoutez un point
aprs Range ("A8") :

L'diteur affiche alors les diffrentes possibilits ...

Pour ce premier exemple, cliquez sur "Value" puis sur la touche Tab pour valider ce choix.

Sub proprietes()
'Macro incomplte
Range("A8").Value
End Sub

La proprit Value est ici le contenu de la cellule.

Nous voulons maintenant donner la valeur 48 A8 :

Sub proprietes()
'A8 = 48
Range("A8").Value = 48
'Traduction :
'La valeur de la cellule A8 est gale 48
End Sub
Puis, la valeur Exemple de texte A8 (important : le texte doit tre mis entre " ") :
Sub proprietes()
'A8 = Exemple de texte
Range("A8").Value = "Exemple de texte"
End Sub

Dans ce cas, c'est bien la cellule A8 de la feuille o est lance la procdure (ici, grce au bouton
formulaire) qui sera modifie. Si vous crez un second bouton sur la feuille 2, ce sera alors la
cellule A8 de la feuille 2 qui sera modifie.

83
Compil par Ass Serge KIKOBYA
Pour modifier la cellule A8 de la feuille 2 en cliquant sur le bouton de la feuille 1, il faut ajouter
avant Range :Sheets("Nom_de_la_feuille") ou Sheets(Numro_de_la_feuille).
Sub proprietes()
'A8 de la feuille 2 = Exemple de texte
Sheets("Feuil2").Range("A8").Value = "Exemple de texte"
'Ou :
'Sheets(2).Range("A8").Value = "Exemple de texte"
End Sub
De mme, si l'on souhaite modifier la cellule A8 de la feuille 2 d'un autre classeur ouvert, il faut
ajouter avant Sheets et Range : Workbooks("Nom_du_fichier").
Sub proprietes()
'A8 de la feuille 2 du classeur 2 = Exemple de texte
Workbooks("Classeur2.xlsx").Sheets("Feuil2").Range("A8").Value = "Exemple de texte"
End Sub

Bien que Value ait t utilis pour illustrer ces diffrents exemples, il n'est pas ncessaire de
l'indiquer, car c'est automatiquement la valeur de la cellule qui est modifie si rien n'est prcis.
Ces 2 lignes offrent un rsultat identique :

Range("A8").Value = 48
Range("A8") = 48

Effacer le contenu de cellules

Sub proprietes()
'Effacer le contenu de la colonne A
Range("A:A").ClearContents
End Sub

Mise en forme du texte


Aprs avoir ajout Font., la liste des proprits que l'on peut attribuer la mise en forme du texte
apparat :

84
Compil par Ass Serge KIKOBYA
La modification des couleurs sera dtaille la page suivante ...

Mise en forme : taille du texte


Sub proprietes()
'Modifier la taille du texte des cellules A1 A8
Range("A1:A8").Font.Size = 18
End Sub

Mise en forme : texte en gras


Sub proprietes()
'Mettre en gras les cellules A1 A8
Range("A1:A8").Font.Bold = True
End Sub
Bold = True signifie Caractres en gras = Oui.

Pour supprimer la mise en forme "caractres gras" un texte, il faut donc remplacer "Oui" par
"Non", autrement dit, "True" par "False" :

Sub proprietes()
'Enlever la mise en forme "gras" des cellules A1 A8
Range("A1:A8").Font.Bold = False
End Sub

Mise en forme : texte en italique


Sub proprietes()
'Mettre en italique les cellules A1 A8
Range("A1:A8").Font.Italic = True
End Sub

Mise en forme : texte soulign


Sub proprietes()
'Souligner les cellules A1 A8
Range("A1:A8").Font.Underline = True
End Sub

Mise en forme : police


Sub proprietes()
'Modifier la police de caractres des cellules A1 A8
Range("A1:A8").Font.Name = "Arial"
End Sub

85
Compil par Ass Serge KIKOBYA
Ajouter des bordures

Sub proprietes()
'Ajouter une bordure aux cellules A1 A8
Range("A1:A8").Borders.Value = 1
'Value = 0 => pas de bordure
End Sub

Modifier la mise en forme de la slection actuelle


Sub proprietes()
'Ajouter une bordure aux cellules slectionnes
Selection.Borders.Value = 1
End Sub

Modifier les proprits d'une feuille


Sub proprietes()
'Masquer une feuille
Sheets("Feuil3").Visible = 0
'Visible = -1 => annule l'effet
End Sub
N'oubliez pas que seule une toute petite minorit des possibilits de personnalisation sont indiques ici.
Si la proprit dont vous avez besoin n'est pas dtaille ici, n'ayez pas peur de la rechercher grce la liste de
choix et l'aide Excel.
L'enregistreur de macro peut galement vous viter de longues recherches. En enregistrant la manipulation dont
vous avez besoin, vous pourrez retrouver plus facilement la proprit recherche pour ensuite l'utiliser dans votre
macro.

Modifier la valeur d'une cellule en fonction d'une autre


Nous voulons ici que A7 prenne la valeur de A1 :

86
Compil par Ass Serge KIKOBYA
Nous allons donc demander que A7 prenne la valeur de A1, ce qui nous donne :

Sub proprietes()
'A7 = A1
Range("A7") = Range("A1")
'Ou :
'Range("A7").Value = Range("A1").Value
End Sub

Si nous voulons copier la taille du texte uniquement, le code serait :

Sub proprietes()
Range("A7").Font.Size = Range("A1").Font.Size
End Sub
Ce qui est gauche du signe = prend la valeur de ce qui est droite du signe =.

Modifier la valeur d'une cellule en fonction de sa propre valeur


Nous allons crer ici un compteur de clics.

A chaque clic, la valeur de A1 sera augmente de 1 :

Sub proprietes()
'Compteur de clics en A1
Range("A1") = Range("A1") + 1
End Sub

Excel excute le code ligne par ligne, ces commentaires devraient vous aider mieux comprendre
ce mme code :

'Pour exemple : avant l'excution du code, A1 vaut 0

Sub proprietes()

'Un clic a t fait sur le bouton, nous entrons dans la procdure


'Pour le moment A1 vaut encore 0

'PENDANT l'excution de la ligne ci-dessous A1 vaut toujours 0


Range("A1") = Range("A1") + 1 'Le calcul est alors : Nouvelle_valeur_de_A1 = 0 + 1
'A1 vaut alors 1 seulement APRES l'excution de la ligne de code

End Sub

With
Ce code permet de dfinir diffrentes proprits la cellule active :

Sub proprietes()
ActiveCell.Borders.Weight = 3
ActiveCell.Font.Bold = True
ActiveCell.Font.Size = 18
ActiveCell.Font.Italic = True
ActiveCell.Font.Name = "Arial"
End Sub

87
Compil par Ass Serge KIKOBYA
Nous pouvons utiliser With pour viter les rptitions d'ActiveCell dans le cas prsent.

Voici comment With fonctionne :

Sub proprietes()
'Dbut de l'instruction avec : WITH
With ActiveCell
.Borders.Weight = 3
.Font.Bold = True
.Font.Size = 18
.Font.Italic = True
.Font.Name = "Arial"
'Fin de l'instruction avec : END WITH
End With
End Sub
ActiveCell n'est donc plus rpt.
Bien que ce ne soit pas indispensable dans ce cas, il est galement possible d'viter les rptitions
de .Font, ce qui nous donnerait :
Sub proprietes()
With ActiveCell
.Borders.Weight = 3
With .Font
.Bold = True
.Size = 18
.Italic = True
.Name = "Arial"
End With
End With
End Sub

Nous allons commencer par attribuer une couleur au texte en A1.

Aprs avoir ajout Font., nous obtenons :

Nous avons 2 possibilits pour dfinir la couleur : ColorIndex et ses 56 couleurs ou Color qui nous
permettra d'utiliser n'importe quelle couleur.

ColorIndex
Voici les 56 couleurs disponibles avec ColorIndex :

88
Compil par Ass Serge KIKOBYA
Pour donner notre texte l'une des 56 couleurs, nous crirons :

Sub couleurs()
'Couleur du texte en A1 : vert (Couleur n10)
Range("A1").Font.ColorIndex = 10
End Sub

Ce qui nous donne :

Pour les versions d'Excel infrieures 2007 : l'utilisation de ColorIndex est prfrable Color.

Color
Voici un exemple similaire avec Color :
Sub couleurs()
'Couleur du texte en A1 : RGB(50, 200, 100)
Range("A1").Font.Color = RGB(50, 200, 100)
End Sub
La couleur ici est : RGB(50, 200, 100)
RGB en franais signifie Rouge-Vert-Bleu (RVB), les valeurs vont de 0 255 pour chaque couleur.

Quelques exemples de couleurs pour mieux comprendre :

RGB(0, 0, 0) : noir
RGB(255, 255, 255) : blanc
RGB(255, 0, 0) : rouge
RGB(0, 255, 0) : vert

89
Compil par Ass Serge KIKOBYA
RGB(0, 0, 255) : bleu

Heureusement pour nous, il existe diffrentes solutions qui nous permettent de trouver
facilement les valeurs RGB de la couleur qui nous intresse.

Vous trouverez par exemple une liste de valeurs RGB sur la page suivante : liste de valeurs RGB

Pour donner une couleur violette notre texte, nous pouvons donc rechercher les valeurs RGB de
cette couleur sur la liste et crire :

Sub couleurs()
'Couleur du texte en A1 : RGB(192, 32, 255)
Range("A1").Font.Color = RGB(192, 32, 255)
End Sub

Ce qui nous donne :

Pour les versions d'Excel infrieures 2007 : le nombre de couleurs est limit (la couleur disponible la plus proche de
la valeur RGB sera utilise).

Crer une bordure colore


Nous allons crer une macro qui va ajouter une bordure la cellule active avec ActiveCell.

La bordure sera rouge et paisse :

Sub couleurs()
'Epaisseur de la bordure
ActiveCell.Borders.Weight = 4
'Couleur de la bordure : rouge
ActiveCell.Borders.Color = RGB(255, 0, 0)
End Sub

Aperu :

Pour appliquer cet effet plusieurs cellules la fois, nous pouvons utiliser Selection :
Sub couleurs()
'Epaisseur de la bordure
Selection.Borders.Weight = 4
'Couleur de la bordure : rouge

90
Compil par Ass Serge KIKOBYA
Selection.Borders.Color = RGB(255, 0, 0)
End Sub

Colorer le fond des cellules slectionnes


Sub couleurs()
'Colorer le fond des cellules slectionnes
Selection.Interior.Color = RGB(174, 240, 194)
End Sub

Aperu :

Colorer l'onglet d'une feuille


Sub couleurs()
'Colorer l'onglet de la feuille "Feuil1"
Sheets("Feuil1").Tab.Color = RGB(255, 0, 0)
End Sub

Aperu :

II.3. Les variables

Les variables permettent de stocker toutes sortes de donnes.

Voici un premier exemple :

'Affichage de la valeur de la variable dans une bote de dialogue


Sub variables()
'Dclaration de la variable
Dim ma_variable As Integer
'Attribution d'une valeur la variable
ma_variable = 12

91
Compil par Ass Serge KIKOBYA
'Affichage de la valeur de ma_variable dans une MsgBox
MsgBox ma_variable
End Sub

Cette premire ligne de code est la dclaration de la variable (gnralement place en dbut de
procdure).

Dim ma_variable As Integer


Dim : dclaration de la variable
ma_variable : nom choisi pour cette variable (sans espaces)
As : dclaration du type de la variable
Integer : type de la variable

Dclarer ses variables n'est pas obligatoire mais recommand. Cela permet de s'y retrouver plus
facilement, peut aider rsoudre plus facilement les problmes, etc. Bref, mieux vaut prendre
l'habitude de dclarer ses variables correctement.

Le type de la variable indique la nature de son contenu (texte, nombres, date, etc.).

Une valeur est ensuite donne cette variable :

ma_variable = 12

Et enfin, la valeur de la variable est affiche dans une bote de dialogue :

MsgBox ma_variable
MsgBox "valeur" affiche une valeur dans une bote de dialogue de la faon la plus simple.

Les botes de dialogue seront dtailles dans quelques leons ...

Le rsultat de ce code :

Si pour le moment vous ne comprenez pas bien l'intrt d'utiliser des variables, soyez rassur, les
exemples abords au cours des prochaines leons vous en dmontreront l'utilit ...

Les types de variables

Nom Type Dtails Symbole


Byte Numrique Nombre entier de 0 255.

92
Compil par Ass Serge KIKOBYA
Integer Numrique Nombre entier de -32'768 32'767. %
Long Numrique Nombre entier de - 2'147'483'648 2'147'483'647. &
Nombre dcimale fixe de -922'337'203'685'477.5808
Currency Numrique @
922'337'203'685'477.5807.
Single Numrique Nombre virgule flottante de -3.402823E38 3.402823E38. !
Nombre virgule flottante de -1.79769313486232D308
Double Numrique #
1.79769313486232D308.
String Texte Texte. $
Date Date Date et heure.
Boolean Boolean True (vrai) ou False (faux).
Object Objet Objet Microsoft.
Tout type de donnes (type par dfaut si la variable n'est pas
Variant Tous
dclare).

Quelques exemples avec diffrents types :

'Exemple : nombre entier


Dim nbEntier As Integer
nbEntier = 12345

'Exemple : nombre virgule


Dim nbVirgule As Single
nbVirgule = 123.45

'Exemple : texte
Dim varTexte As String
varTexte = "ISIG.AC.CD"

'Exemple : date
Dim varDate As Date
varDate = "06.02.2011"

'Exemple : vrai/faux
Dim varBoolean As Boolean
varBoolean = True

'Exemple : objet (objet Worksheet pour cet exemple)


Dim varFeuille As Worksheet
Set varFeuille = Sheets("Feuil2") 'Set => attribution d'une valeur une variable objet

'Exemple d'utilisation de la variable objet : activation de la feuille


varFeuille.Activate

Les symboles indiqus dans le tableau ci-dessus permettent de raccourcir les dclarations de
variables.

Par soucis de lisibilit, ils ne seront pas utiliss dans les leons mais voici tout de mme un
exemple :

93
Compil par Ass Serge KIKOBYA
Dim exemple As Integer
Dim exemple%

Ces deux lignes sont identiques.

Remarque : il est possible de forcer les dclarations de variables en plaant Option Explicit tout au dbut du
module (une erreur sera ainsi gnre en cas d'oubli de dclaration).

Exemple pratique
Nous allons maintenant crer par tapes une macro qui va rcuprer le nom dans la cellule A2, le
prnom dans la cellule B2, l'ge dans la cellule C2 et qui va les afficher dans une bote de
dialogue.

Nous commenons par dclarer les variables (sur la mme ligne, spares par des virgules) :

Sub variables()
'Dclaration des variables
Dim nom As String, prenom As String, age As Integer

End Sub
Nous attribuons ensuite les valeurs aux variables avec Cells :
Sub variables()
'Dclaration des variables
Dim nom As String, prenom As String, age As Integer

'Valeurs des variables


nom = Cells(2, 1)
prenom = Cells(2, 2)
age = Cells(2, 3)

End Sub
Et enfin, nous affichons le rsultat dans la bote de dialogue en concatnant les valeurs
avec & (comme sous Excel).
Sub variables()
'Dclaration des variables
Dim nom As String, prenom As String, age As Integer

'Valeurs des variables


nom = Cells(2, 1)
prenom = Cells(2, 2)
age = Cells(2, 3)

'Bote de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub

Ce qui nous donne :

94
Compil par Ass Serge KIKOBYA
Nous allons maintenant rechercher afficher dans la boite de dialogue la ligne du tableau
correspondant au numro indiqu dans la cellule F5.

Voici l'objectif :

Prenez un moment pour effectuer cette modification vous-mme avant de passer la solution ci-
dessous ...

.
.
.

La solution :

Sub variables()
'Dclaration des variables
Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer

'Valeurs des variables


numero_ligne = Range("F5") + 1
nom = Cells(numero_ligne, 1)
prenom = Cells(numero_ligne, 2)
age = Cells(numero_ligne, 3)

95
Compil par Ass Serge KIKOBYA
'Bote de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub

Ajout d'une variable :

'Dclaration des variables


Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer
La variable numero_ligne prend ensuite la valeur de la cellule F5 laquelle nous ajoutons 1 (pour
ne pas tenir compte de la premire ligne qui contient les titres du tableau)
ainsi, numero_ligne aura pour valeur le n de ligne des cellules qui nous intressent :
numero_ligne = Range("F5") + 1
Il ne reste plus qu' remplacer les n de ligne des Cells par notre variable :
nom = Cells(numero_ligne, 1)
prenom = Cells(numero_ligne, 2)
age = Cells(numero_ligne, 3)

Notre macro affiche maintenant la ligne du tableau qui nous intresse.

Notez au passage que nous pouvons rduire cette procdure entire sur une ligne :

Sub variables()
MsgBox Cells(Range("F5")+1,1) & " " & Cells(Range("F5")+1,2) & ", " &
Cells(Range("F5")+1,3) & " ans"
End Sub

Le code fonctionne correctement, il est nanmoins beaucoup moins lisible que le prcdent et
plus difficile retravailler (les codes ne seront donc pas rduits dans les leons afin d'en faciliter la
comprhension).

Les tableaux

Les variables permettent de stocker une valeur par variable, les tableaux permettent de stocker une
multitude de valeurs (leur utilisation est proche de celle des variables).

96
Compil par Ass Serge KIKOBYA
Voici quelques exemples de dclarations :

'Exemple de dclaration de variable


Dim var1 As String

'Exemple de dclaration de tableau 1 dimension


Dim tab1(4) As String

'Exemple de dclaration de tableau 2 dimensions


Dim tab2(4, 3) As String

'Exemple de dclaration de tableau 3 dimensions


Dim tab3(4, 3, 2) As String

Le tableau 1 dimension :

'Exemple de dclaration de tableau 1 dimension


Dim tab1(4) As String
Dans cette dclaration, il n'y a qu'un chiffre entre parenthses, il s'agit donc d'un tableau une
dimension. Ce chiffre indique la dernire case du tableau. tab1(4) est un tableau dont les cases
vont de 0 4, il s'agit donc d'un tableau de 5 cases :
'Attribution de valeurs aux 5 cases
tab1(0) = "Valeur de la case 0"
tab1(1) = "Valeur de la case 1"
tab1(2) = "Valeur de la case 2"
tab1(3) = "Valeur de la case 3"
tab1(4) = "Valeur de la case 4"

Important : la premire case d'un tableau est 0.

Autre exemple, le tableau 2 dimensions :

'Exemple de dclaration de tableau 2 dimensions


Dim tab2(4, 3) As String
'Attribution de valeurs aux 3 cases colores
tab2(0, 0) = "Valeur de la case rouge"
tab2(4, 1) = "Valeur de la case verte"
tab2(2, 3) = "Valeur de la case bleue"

97
Compil par Ass Serge KIKOBYA
Les constantes
Les constantes permettent de stocker des valeurs comme les variables, la diffrence qu'on ne
peut pas les modifier (d'o leur nom).

Par exemple, nous pouvons ajouter une constante pour viter les rptitions de 6.87236476641 :

Sub exemple_const()
Cells(1, 1) = Cells(1, 2) * 6.87236476641
Cells(2, 1) = Cells(2, 2) * 6.87236476641
Cells(3, 1) = Cells(3, 2) * 6.87236476641
Cells(4, 1) = Cells(4, 2) * 6.87236476641
Cells(5, 1) = Cells(5, 2) * 6.87236476641
End Sub

Cela facilite la lecture du code (en particulier pour des codes importants) et facilite le changement
(manuel) de la valeur de la constante en cas de besoin :

Sub exemple_const()
'Dclaration de la constante + attribution de sa valeur
Const TAUX_ANNUEL As Double = 6.87236476641

Cells(1, 1) = Cells(1, 2) * TAUX_ANNUEL


Cells(2, 1) = Cells(2, 2) * TAUX_ANNUEL
Cells(3, 1) = Cells(3, 2) * TAUX_ANNUEL
Cells(4, 1) = Cells(4, 2) * TAUX_ANNUEL
Cells(5, 1) = Cells(5, 2) * TAUX_ANNUEL
End Sub

La porte des variables


Si la variable est dclare au dbut d'une procdure (Sub), elle ne peut tre utilise que dans
cette mme procdure. La valeur de la variable n'est pas conserve aprs l'excution de la
procdure.

Sub procedure1()
Dim var1 As Integer
' => Utilisation de la variable dans la procdure uniquement
End Sub

Sub procedure2()
' => Impossible d'utiliser var1 ici
End Sub

Pour pouvoir utiliser une variable dans toutes les procdures d'un module, il suffit de la dclarer
en dbut de module. De plus, cela permet de conserver la valeur de la variable jusqu' la
fermeture du classeur.

Dim var1 As Integer

Sub procedure1()
' => Utilisation de var1 possible
End Sub

98
Compil par Ass Serge KIKOBYA
Sub procedure2()
' => Utilisation de var1 possible
End Sub
Mme principe pour utiliser une variable dans tous les modules, la diffrence prs que Dim est
remplac par Global :
Global var1 As Integer
Pour conserver la valeur d'une variable la fin d'une procdure, remplacez Dim par Static :
Sub procedure1()
Static var1 As Integer
End Sub
Pour conserver les valeurs de toutes les variables d'une procdure, ajoutez Static devant Sub :
Static Sub procedure1()
Dim var1 As Integer
End Sub

Crer son propre type de variable


Nous n'allons pas nous attarder sur ce point, voici juste un exemple :

'Cration d'un type de variable


Type invites
nom As String
prenom As String
End Type

Sub variables()
'Dclaration
Dim p1 As invites

'Attributions des valeurs p1


p1.nom = "Smith"
p1.prenom = "John"

'Exemple d'utilisation
MsgBox p1.nom & " " & p1.prenom
End Sub

II.4. Les conditions

Les conditions sont trs utiles en programmation, elles nous serviront effectuer des actions en fonction de
critres prcis (mme principe que la fonction SI).

La principale fonction est If, voici comment elle fonctionne :


If [CONDITION ICI] Then ' => SI condition valide ALORS
'Instructions si vrai
Else ' => SINON
'Instructions si faux
End If

99
Compil par Ass Serge KIKOBYA
Passons directement la pratique et reprenons l'exemple dvelopp la leon sur les variables. Il
avait pour but d'afficher dans une boite de dialogue la ligne du tableau correspondant au numro
indiqu dans la cellule F5. :

Si vous entrez une lettre en F5, cela gnre un bug. Nous voulons viter cela.

Sub variables()
'Dclaration des variables
Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer

'Valeurs des variables


numero_ligne = Range("F5") + 1
nom = Cells(numero_ligne, 1)
prenom = Cells(numero_ligne, 2)
age = Cells(numero_ligne, 3)

'Bote de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub

Nous allons commencer par ajouter une condition pour vrifier que la valeur de la cellule F5 est
numrique avant d'excuter le code.

La fonction IsNumeric sera utilise dans cette condition :


Sub variables()

'SI la valeur entre parenthses (cellule F5) est numrique (DONC SI CONDITION VRAIE) alors on
'excute les instructions places aprs THEN
If IsNumeric(Range("F5")) Then

'Dclaration des variables


Dim nom As String, prenom As String, age As Integer,
numero_ligne As Integer
'Valeurs des variables
numero_ligne = Range("F5") + 1
nom = Cells(numero_ligne, 1)
prenom = Cells(numero_ligne, 2)
age = Cells(numero_ligne, 3)
'Bote de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"

100
Compil par Ass Serge KIKOBYA
End If

End Sub

Ajoutons galement des instructions pour le cas o la condition n'est pas remplie :

Sub variables()

If IsNumeric(Range("F5")) Then 'SI CONDITION VRAIE

'Dclaration des variables


Dim nom As String, prenom As String, age As Integer,
numero_ligne As Integer
'Valeurs des variables
numero_ligne = Range("F5") + 1
nom = Cells(numero_ligne, 1)
prenom = Cells(numero_ligne, 2)
age = Cells(numero_ligne, 3)
'Bote de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"

Else 'SI CONDITION FAUSSE

'Bote de dialogue : avertissement


MsgBox "L'entre " & Range("F5") & " n'est pas valide !"
'Suppression du contenu de la cellule F5
Range("F5").ClearContents

End If

End Sub

Les valeurs non numriques ne sont dsormais plus un problme.

Notre tableau contient 16 lignes de donnes, nous allons donc vrifier que la
variable numero_ligne soit : "plus grande ou gale 2" et "plus petite ou gale 17".

Mais avant, voici les oprateurs de comparaison :

= est gal
<> est diffrent de
< est plus petit que
<= est plus petit ou gal
> est plus grand que
>= est plus grand ou gal

Ainsi que d'autres oprateurs utiles :

[condition1] AND [condition2]


AND et
Les 2 conditions doivent tre vraies

OR ou [condition1] OR [condition2]

101
Compil par Ass Serge KIKOBYA
Au moins 1 des 2 conditions doit tre vraie

NOT [condition1]
NOT faux
La condition doit tre fausse

Ajoutons maintenant les conditions indiques un peu plus haut en utilisant AND ainsi que les
oprateurs de comparaison dtaills ci-dessus :
Sub variables()
If IsNumeric(Range("F5")) Then 'SI NUMERIQUE
Dim nom As String, prenom As String, age As Integer,
numero_ligne As Integer
numero_ligne = Range("F5") + 1

If numero_ligne >= 2 And numero_ligne <= 17 Then 'SI N CORRECT


nom = Cells(numero_ligne, 1)
prenom = Cells(numero_ligne, 2)
age = Cells(numero_ligne, 3)
MsgBox nom & " " & prenom & ", " & age & " ans"
Else 'SI N INCORRECT
MsgBox "L'entre " & Range("F5") & " n'est pas un numro valide !"
Range("F5").ClearContents
End If

Else 'SI NON NUMERIQUE


MsgBox "L'entre " & Range("F5") & " n'est pas valide !"
Range("F5").ClearContents
End If
End Sub

Pour rendre notre macro plus pratique, nous pouvons encore remplacer 17 par une variable
contenant le nombre de lignes. Cela permettra d'ajouter/retirer des lignes notre tableau sans
avoir modifier chaque fois cette limite.
Pour cela, crons une variable nb_lignes et ajoutons cette fonction:

WorksheetFunction.CountA ne vous dit probablement rien mais il s'agit en fait de


la fonction NBVAL que vous connaissez probablement dj (sinon, cliquez ici).
Nous demandons cette fonction de comptabiliser le nombre de cellules non vides de la
premire colonne et nous remplaons ensuite 17 par nb_lignes :
Sub variables()
If IsNumeric(Range("F5")) Then 'SI NUMERIQUE
Dim nom As String, prenom As String, age As Integer,
numero_ligne As Integer
Dim nb_lignes As Integer

numero_ligne = Range("F5") + 1
nb_lignes = WorksheetFunction.CountA(Range("A:A")) 'Fonction NBVAL

102
Compil par Ass Serge KIKOBYA
If numero_ligne >= 2 And numero_ligne <= nb_lignes Then 'SI N CORRECT
nom = Cells(numero_ligne, 1)
prenom = Cells(numero_ligne, 2)
age = Cells(numero_ligne, 3)
MsgBox nom & " " & prenom & ", " & age & " ans"
Else 'SI N INCORRECT
MsgBox "L'entre " & Range("F5") & " n'est pas un numro valide !"
Range("F5").ClearContents
End If

Else 'SI NON NUMERIQUE


MsgBox "L'entre " & Range("F5") & " n'est pas valide !"
Range("F5").ClearContents
End If
End Sub

ElseIf
ElseIf permet d'ajouter plusieurs conditions la suite :
If [CONDITION 1] Then ' => SI condition 1 valide ALORS
'Instructions 1
ElseIf [CONDITION 2] Then ' => SINON, SI condition 2 valide ALORS
'Instructions 2
Else ' => SINON
'Instructions 3
End If
Si la condition 1 est vraie, les instructions 1 sont excutes puis nous sortons de
l'instruction If (qui dbute avec If et finit End If). Si la condition 1 est fausse, nous passons la
condition 2. Si celle-ci est vraie les instructions 2 sont excutes si ce n'est pas le cas les
instructions 3 seront alors excutes.

Voici un exemple, avec en A1 une note de 1 6 (sans virgules pour cet exemple) et en B1 un
commentaire en fonction de la note :

Sub commentaires_notes()
'Variables
Dim note As Integer, commentaire As String
note = Range("A1")

'Commentaire en fonction de la note


If note = 6 Then
commentaire = "Excellent rsultat !"
ElseIf note = 5 Then
commentaire = "Bon rsultat"
ElseIf note = 4 Then
commentaire = "Rsultat satisfaisant"
ElseIf note = 3 Then
commentaire = "Rsultat insatisfaisant"
ElseIf note = 2 Then
commentaire = "Mauvais rsultat"
ElseIf note = 1 Then
commentaire = "Rsultat excrable"
Else
commentaire = "Aucun rsultat"

103
Compil par Ass Serge KIKOBYA
End If

'Commentaire en B1
Range("B1") = commentaire
End Sub

Select
Une alternative aux instructions If contenant beaucoup ElseIf existe : Select, cette instruction
tant plus adapte dans ce genre de situations.
Voici la mme macro avec Select :
Sub commentaires_notes()
'Variables
Dim note As Integer, commentaire As String
note = Range("A1")

'Commentaire en fonction de la note


Select Case note ' <= la valeur tester (ici, la note)
Case Is = 6 ' <= si la valeur = 6
commentaire = "Excellent rsultat !"
Case Is = 5 ' <= si la valeur = 5
commentaire = "Bon rsultat"
Case Is = 4 ' <= si la valeur = 4
commentaire = "Rsultat satisfaisant"
Case Is = 3 ' <= si la valeur = 3
commentaire = "Rsultat insatisfaisant"
Case Is = 2 ' <= si la valeur = 2
commentaire = "Mauvais rsultat"
Case Is = 1 ' <= si la valeur = 1
commentaire = "Rsultat excrable"
Case Else ' <= si la valeur n'est gale aucune des valeurs ci-dessus
commentaire = "Aucun rsultat"
End Select

'Commentaire en B1
Range("B1") = commentaire
End Sub

Notez que nous pouvons galement utiliser les autres oprateurs de comparaison, par exemple :

Case Is >= 6 'si la valeur >= 6

Exemples avec plusieurs valeurs :

Case Is = 6, 7 'si la valeur = 6 ou 7


Case Is <> 6, 7 'si la valeur est diffrente de 6 ou 7

Case 6 To 10 'si la valeur = de 6 10

104
Compil par Ass Serge KIKOBYA
Condition en fonction d'un type

IsNumeric (fonction vue la page prcdente) renvoie TRUE (vrai) si la valeur est numrique et FALSE
(faux) si ce n'est pas le cas :
If IsNumeric(Range("A1")) = True Then 'SI LA VALEUR EST NUMERIQUE ...

Le code suivant est identique au premier (il n'est pas ncessaire d'indiquer = True puisque que l'on cherche
automatiquement savoir si la condition est vraie) :
If IsNumeric(Range("A1")) Then 'SI LA VALEUR EST NUMERIQUE ...

Dans le cas o nous voulons vrifier si la valeur n'est pas numrique, nous avons galement deux
possibilits :

If IsNumeric(Range("A1")) = False Then 'SI LA VALEUR N'EST PAS NUMERIQUE ...

If Not IsNumeric(Range("A1")) Then 'SI LA VALEUR N'EST PAS NUMERIQUE ...

D'autres fonctions proches de IsNumeric :


If IsDate(Range("A1")) Then 'SI LA VALEUR EST UNE DATE ...

If IsEmpty(Range("A1")) Then 'SI VIDE ...

If var_objet Is Nothing Then 'SI OBJET NON INITIALISE ...

Condition en fonction du type d'une variable


Pour effectuer des actions en fonction du type d'une variable (Variant), nous aurons besoin de la
fonction VarType.

Aprs avoir ajout le signe =, la liste des types apparat :

If VarType(ma_variable) = vbInteger Then 'SI ma_variable est de type Integer ...

La valeur des constantes :

Constante Valeur
vbEmpty 0
vbNull 1

105
Compil par Ass Serge KIKOBYA
vbInteger 2
vbLong 3
vbSingle 4
vbDouble 5
vbCurrency 6
vbDate 7
vbString 8
vbObject 9
vbError 10
If VarType(ma_variable) = vbInteger Then 'SI ma_variable est de type Integer ...
'Identique :
If VarType(ma_variable) = 2 Then 'SI ma_variable est de type Integer ...

Condition en fonction de la comparaison de 2 chanes de caractres


Jusque-l nous n'avons vu que cela :

ma_variable = "Exemple 12345"

If ma_variable = "Exemple 12345" Then ' => VRAI

Les 2 chanes de caractres sont identiques ici, rien d'extraordinaire ...

Maintenant, si nous voulons vrifier que la variable contienne bien la valeur "12345" sans tenir
compte des autres caractres, nous utiliserons l'oprateur Like ainsi que * devant et derrire la
valeur rechercher.
Le caractre * peut remplacer : aucun, un ou plusieurs caractres :
ma_variable = "Exemple 12345"

If ma_variable Like "*12345*" Then ' => VRAI

Le caractre # peut remplacer un caractre numrique de 0 9 :


ma_variable = "Exemple 12345"

If ma_variable Like "Exemple 12###" Then ' => VRAI

Le caractre ? peut remplacer un caractre quelconque :


ma_variable = "Exemple 12345"

If ma_variable Like "?xemple?1234?" Then ' => VRAI

Nous pouvons galement remplacer un caractre en fonction d'une plage de caractres ou de


caractres prcis :

[abc] remplace un des caractres suivants : a b c

106
Compil par Ass Serge KIKOBYA
[a-g] remplace un des caractres suivants : a b c d e f g
[369] remplace un des caractres suivants : 3 6 9
[2-5] remplace un des caractres suivants : 2 3 4 5
[?*#] remplace un des caractres suivants : ? * #
ma_variable = "Exemple 12345"

If ma_variable Like "[BIEN]xemple 1234[4-7]" Then ' => VRAI

Pour remplacer un caractre non compris dans les valeurs entre crochets, un ! doit tre ajout
aprs [ :
ma_variable = "Exemple 12345"

If ma_variable Like "[!FAUX]xemple 1234[!6-9]" Then ' => VRAI

Remarque : un caractre en majuscule n'est pas gal ce mme caractre en minuscule. Pour ne pas faire de
distinctions entre majuscules-minuscules, placez Option Compare Text en dbut de module.

II.5. Les boucles

While

Les boucles permettent de rpter des instructions un certain nombre de fois, ce qui peut tre un
gain de temps considrable.

Le code suivant numrote les cellules de la colonne A (de la ligne 1 12) :

Sub boucle_while()

Cells(1, 1) = 1
Cells(2, 1) = 2
Cells(3, 1) = 3
Cells(4, 1) = 4
Cells(5, 1) = 5
Cells(6, 1) = 6
Cells(7, 1) = 7
Cells(8, 1) = 8
Cells(9, 1) = 9
Cells(10, 1) = 10
Cells(11, 1) = 11
Cells(12, 1) = 12

End Sub

Ce code est trs rptitif ...

Maintenant, imaginez qu'il faille numroter plusieurs centaines de lignes ... Vous comprenez donc
l'intrt de crer des boucles.

Voici la boucle While :


Sub boucle_while()

107
Compil par Ass Serge KIKOBYA
While [condition]
'Instructions
Wend

End Sub

Tant que la condition est vraie, les instructions sont excutes en boucle (attention ne pas crer
une boucle infinie).

Voici la macro rptitive ci-dessus avec la boucle While :


Sub boucle_while()

Dim numero As Integer


numero = 1 'Numro de dpart (correspond ici au n de ligne et au n de numrotation)

While numero <= 12 'TANT QUE la variable numero est <= 12, la boucle est rpte
Cells(numero, 1) = numero 'Numrotation
numero = numero + 1 'Le numro est augment de 1 chaque boucle
Wend

End Sub

Avec cette boucle, si nous voulons numroter 500 lignes, il suffit alors de remplacer 12 par 500 ...

Do Loop
Cette boucle fonctionne de la mme manire que While Wend (tant que la condition est vraie, la
boucle est excute) :
Sub boucle_do_while()

Do While [condition]
'Instructions
Loop

End Sub
La condition peut galement tre place en fin de boucle Do Loop, ce qui implique que les
instructions sont excutes au moins une fois :
Sub boucle_do_while()

Do
'Instructions
Loop While [condition]

End Sub
Plutt que de rpter la boucle tant que la condition est vraie, il est possible de quitter la boucle
lorsque la condition est vraie en remplaant While par Until :
Sub boucle_do_while()

Do Until [condition]
'Instructions
Loop

End Sub

108
Compil par Ass Serge KIKOBYA
For
Sub boucle_for()

For i = 1 To 5
'Instructions
Next

End Sub
La boucle For est rpte ici 5 fois.

A chaque rptition de la boucle, la variable i est automatiquement augmente de 1 :

Sub boucle_for()

For i = 1 To 5
MsgBox i
Next

End Sub

Quitter une boucle prmaturment


Il est possible de quitter une boucle For prmaturment grce l'instruction suivante :
Exit For 'Quitter une boucle For

En voici un exemple :

Sub boucle_for()
Dim max_boucles As Integer
max_boucles = Range("A1") 'En A1 : une limite de rptitions de la boucle est dfinie

For i = 1 To 7 'Boucles prvues : 7


If i > max_boucles Then 'Si A1 est vide ou contient un nombre < 7, diminution du nb de
boucles
Exit For 'Si condition vraie, on quitte la boucle For
End If

MsgBox i
Next

End Sub
Les autres instructions Exit :
Exit Do 'Quitter une boucle Do Loop

Exit Sub 'Quitter une procdure

Exit Function 'Quitter une fonction

Boucle-exercice

109
Compil par Ass Serge KIKOBYA
Pour mettre en pratique ce qui a t vu jusque-l, nous allons crer tape par tape une macro
qui va colorer 10x10 cellules (en damier rouge et noir) partir de la cellule slectionne, aperu :

Voici le point de dpart de l'exercice :

Sub exercice_boucles()

Const NB_CASES As Integer = 10 'Nombre de cellules colorer

'...

End Sub
Pour commencer, ajoutez une boucle For qui va colorer en noir les cellules de la colonne A de 1
10 (10 tant la constante NB_CASES), aperu :

Prenez quelques instants pour crer cette boucle avant de passer la solution ...

110
Compil par Ass Serge KIKOBYA
.
.
.

La solution :

Sub exercice_boucles()

Const NB_CASES As Integer = 10 'Nombre de cellules colorer

For l = 1 To NB_CASES 'l => n ligne

Cells(l, 1).Interior.Color = RGB(0, 0, 0) 'Noir

Next

End Sub
La prochaine tape est la coloration en rouge d'une cellule sur 2 grce une instruction If (en
fonction des n de ligne pairs/impairs), aperu :

.
.
.

La solution :

Sub exercice_boucles()

Const NB_CASES As Integer = 10 'Nombre de cellules colorer

For l = 1 To NB_CASES 'l => n ligne

If l Mod 2 = 0 Then 'Mod => est le reste d'une division


Cells(l, 1).Interior.Color = RGB(200, 0, 0) 'Rouge
Else
Cells(l, 1).Interior.Color = RGB(0, 0, 0) 'Noir
End If

111
Compil par Ass Serge KIKOBYA
Next

End Sub
La condition If l Mod 2 = 0 signifie : si le reste de la division de l par 2 est gal 0 ...

Seuls les n de ligne pairs ont un reste gal 0 lorsqu'ils sont diviss par 2.

Crez maintenant une boucle qui va excuter la premire boucle sur 10 colonnes, aperu :

.
.
.
.

La solution :

Sub exercice_boucles()

Const NB_CASES As Integer = 10 'Damier de 10x10 cellules

For l = 1 To NB_CASES 'l => n ligne

For c = 1 To NB_CASES 'c => n colonne

If l Mod 2 = 0 Then
Cells(l, c).Interior.Color = RGB(200, 0, 0) 'Rouge
Else
Cells(l, c).Interior.Color = RGB(0, 0, 0) 'Noir
End If

Next
Next

End Sub

La seconde boucle est donc imbrique dans la premire.

112
Compil par Ass Serge KIKOBYA
Pour obtenir ce rsultat ...

Remplacez :

If l Mod 2 = 0 Then

Par :

If (l + c) Mod 2 = 0 Then

Il ne reste plus qu' modifier le code pour crer le damier partir de la cellule active ( la place de
A1), aperu :

.
.
.
.

113
Compil par Ass Serge KIKOBYA
La solution :

Sub exercice_boucles()

Const NB_CASES As Integer = 10 'Damier de 10x10 cellules


Dim lig As Integer, col As Integer ' => ajout de 2 variables

'Dcalage (lignes) partir de la premire cellule = n de ligne de la cellule active - 1


lig = ActiveCell.Row - 1
'Dcalage (colonnes) partir de la premire cellule = n de colonne de la cellule active - 1
col = ActiveCell.Column - 1

For l = 1 To NB_CASES 'N ligne

For c = 1 To NB_CASES 'N colonne

If (l + c) Mod 2 = 0 Then
'Cells(n de ligne + dcalage lignes, n de colonne + dcalage colonnes)...
Cells(l + lig, c + col).Interior.Color = RGB(200, 0,
0) 'Rouge
Else
Cells(l + lig, c + col).Interior.Color = RGB(0, 0, 0) 'Noir
End If

Next
Next

End Sub

II.6. Les procdures et fonctions

Public - Private

Pour le moment, toutes les procdures cres sont de typePublic, elles sont accessibles depuis tous les
modules.
Sub exemple()
'Identique :
Public Sub exemple()
Pour rendre une procdure inaccessible hors du module, ajoutez Private :
Private Sub exemple()

Lancer une procdure depuis une procdure


Pour excuter une procdure depuis une autre procdure, entrez simplement son nom.

Un exemple simple :

Private Sub avertissement()


MsgBox "Attention !!!"

114
Compil par Ass Serge KIKOBYA
End Sub

Sub macro_test()
If Range("A1") = "" Then
avertissement ' <= excute la procdure "avertissement"
End If
'etc ...
End Sub

Ici, lorsque "macro_test" est excute et que A1 vaut "", la procdure "avertissement" est
excute.

Les arguments
Les arguments permettent d'utiliser des valeurs d'une procdure dans une sous-procdure (car
rappelez-vous que par dfaut les variables ne sont pas accessibles depuis les autres procdures).

Private Sub avertissement(texte As String)


MsgBox "Attention : " & texte & " !"
End Sub

Sub macro_test()
If Range("A1") = "" Then
avertissement "cellule vide"
ElseIf Not IsNumeric(Range("A1")) Then
avertissement "valeur non numrique"
End If
End Sub

Un argument a t ajout la procdure "avertissement", il s'agit de la variable "texte" de type


"String" :

Private Sub avertissement(texte As String)

Cette procdure ncessite un argument, il faudra donc placer une valeur aprs "avertissement"
pour l'excuter :

avertissement "cellule vide"

En cas d'arguments multiples, ceux-ci doivent tre spars par des virgules.

115
Compil par Ass Serge KIKOBYA
Les arguments optionnels
Par dfaut, si une procdure requiert des arguments, ceux-ci sont obligatoires pour excuter la
procdure.

Des arguments optionnels peuvent tre ajouts aprs les arguments obligatoires avec Optional,
par exemple :
Private Sub boite_de_dialogue(nom As String, Optional prenom, Optional age)

Cette procdure peut alors tre lance avec ou sans arguments optionnels, comme ceci :

'Exemple 1 : on affiche le nom :


boite_de_dialogue nom1

'Exemple 2 : on affiche le nom et le prnom :


boite_de_dialogue nom1, prenom1

'Exemple 3 : on affiche le nom et l'ge :


boite_de_dialogue nom1, , age1

'Exemple 4 : on affiche le nom, le prnom et l'ge :


boite_de_dialogue nom1, prenom1, age1

Les arguments doivent tre indiqus dans l'ordre.

Pour vrifier si un argument optionnel est prsent ou non, nous utiliserons la fonction IsMissing.
Cette fonction n'tant compatible qu'avec certains types de variables (dont Variant), le type des
arguments optionnels n'a pas t dclar (type non dclar = Variant).

Voici un exemple avec les 2 portions de code ci-dessus :

Sub macro_test()

Dim nom1 As String, prenom1 As String, age1 As Integer

nom1 = Range("A1")
prenom1 = Range("B1")
age1 = Range("C1")

'Exemple 1 : on affiche le nom :


boite_de_dialogue nom1

'Exemple 2 : on affiche le nom et le prnom :


boite_de_dialogue nom1, prenom1

'Exemple 3 : on affiche le nom et l'ge :


boite_de_dialogue nom1, , age1

'Exemple 4 : on affiche le nom, le prnom et l'ge :


boite_de_dialogue nom1, prenom1, age1

End Sub

Private Sub boite_de_dialogue(nom As String, Optional prenom, Optional age)

If IsMissing(age) Then 'Si la variable age est absente ...

116
Compil par Ass Serge KIKOBYA
If IsMissing(prenom) Then 'Si la variable prenom est absente, on n'affiche que le nom
MsgBox nom
Else 'Sinon, on affiche le nom et le prnom
MsgBox nom & " " & prenom
End If

Else 'Si la variable age est prsente ...

If IsMissing(prenom) Then 'Si la variable prenom est absente, on affiche le nom et l'ge
MsgBox nom & ", " & age & " ans"
Else 'Sinon on affiche le nom, le prnom et l'ge
MsgBox nom & " " & prenom & ", " & age & " ans"
End If

End If

End Sub

Aperu (exemple 1) :

ByRef - ByVal
Par dfaut, les arguments sont de type ByRef ce qui signifie que, si une variable est passe en
argument, c'est sa rfrence qui est transmise. Autrement dit, si la variable est modifie dans la
sous-procdure, elle le sera galement dans la procdure d'appel.

Par exemple :

Sub macro_test()
Dim nombre As Integer
nombre = 30

calcul_carre nombre

MsgBox nombre
End Sub

Private Sub calcul_carre(ByRef valeur As Integer) 'Il n'est pas ncessaire de prciser ByRef
(puisque par dfaut)

117
Compil par Ass Serge KIKOBYA
valeur = valeur * valeur
End Sub

Pour mieux comprendre, voici ce qui se passe lorsque la macro est lance :

nombre = 30
'La valeur initiale de la variable "nombre" est 30

calcul_carre nombre
'La sous procdure est lance avec la variable "nombre" en argument

Private Sub calcul_carre(ByRef valeur As Integer)


'La variable "valeur" est en quelque sorte un raccourci vers la variable "nombre", par consquent, si la variable
"valeur" est modifie, cela modifie la variable "nombre" (il n'est pas ncessaire de les nommer de faon
identique)

valeur = valeur * valeur


'La valeur de la variable "valeur" est modifie (donc la variable "nombre" est modifie)

End Sub
'Fin de la sous-procdure

MsgBox nombre
'La variable "nombre" a t modifie, 900 est alors affich dans la bote de dialogue

La seconde possibilit consiste utiliser ByVal.


Contrairement ByRef qui transmet la rfrence (raccourci), ByVal transmet la valeur, ce qui
signifie que la variable passe en argument ne subit aucune modification.
Voici ce qui se passe avec le code prcdent et ByVal :
nombre = 30
'La valeur initiale de la variable "nombre" est 30

calcul_carre nombre
'La sous procdure est lance avec la variable "nombre" en argument

Private Sub calcul_carre(ByVal valeur As Integer)


'La variable "valeur" copie la valeur de la variable "nombre" (les 2 variables ne sont pas lies)

valeur = valeur * valeur


'La valeur de la variable "valeur" est modifie

End Sub
'Fin de la sous-procdure (dans cet exemple, la sous-procdure n'aura servi rien)

MsgBox nombre
'La variable "nombre" n'a pas t modifie, 30 est donc affich dans la bote de dialogue

Ce qu'il faut retenir : utiliser ByVal lorsque la variable ne doit pas tre modifie ...

Les fonctions
La principale diffrence entre une procdure Sub et Function est la valeur retourne par la
fonction.

En voici un exemple simple :

118
Compil par Ass Serge KIKOBYA
Function carre(nombre)
carre = nombre ^ 2 'La fonction "carre" renvoie la valeur de "carre"
End Function

Sub macro_test()
Dim resultat As Double
resultat = carre(9.876) 'La variable resultat reoit la valeur retourne par la fonction
MsgBox resultat 'Affiche le rsultat (ici, le carr de 9.876)
End Sub

Les fonctions peuvent galement tre utilises sur la feuille comme n'importe quelle fonction
Excel.

Par exemple, pour obtenir le carr de la valeur de A1 :

II.7. Les botes de dialogue

MsgBox

Pour le moment, nous n'avons utilis la bote de dialogueMsgBox que pour afficher une information :
Sub effacer_B2()
Range("B2").ClearContents
MsgBox "Le contenu de B2 a t effac !"
End Sub
Dans ce cas, MsgBox n'est utilis qu'avec un seul argument.

Aperu du code :

119
Compil par Ass Serge KIKOBYA
Nous allons maintenant crer une bote de dialogue qui va nous demander de confirmer la
suppression avant d'effectuer les deux instructions. Voici les 3 arguments que nous allons
renseigner :

MsgBox([TEXTE], [BOUTONS], [TITRE])


Texte : texte de la bote de dialogue
Boutons : choix des boutons (oui, non, annuler, etc.) + autres options
Titre : titre de la bote de dialogue
Sub effacer_B2()
If MsgBox("Etes-vous certain de vouloir supprimer le contenu de B2 ?", vbYesNo, "Demande de
confirmation") = vbYes Then
Range("B2").ClearContents
MsgBox "Le contenu de B2 a t effac !"
End If
End Sub

Aperu :

vbYesNo indique que les boutons de la bote de dialogue sont "Oui" et "Non", vbYes correspond
au bouton "Oui" :
If MsgBox("Texte", vbYesNo, "Titre") = vbYes Then 'Si le bouton Oui est cliqu ...

120
Compil par Ass Serge KIKOBYA
Les diffrentes possibilits pour le second argument de MsgBox

Constante Valeur Description

vbOKOnly 0

vbOKCancel 1

vbAbortRetryIgnore 2

vbYesNoCancel 3

vbYesNo 4

vbRetryCancel 5

vbCritical 16

vbQuestion 32

vbExclamation 48

vbInformation 64

vbDefaultButton1 0 Bouton par dfaut : Bouton 1


vbDefaultButton2 256 Bouton par dfaut : Bouton 2
vbDefaultButton3 512 Bouton par dfaut : Bouton 3

vbApplicationModal 0 Force l'utilisateur rpondre avant de poursuivre avec Excel


Force l'utilisateur rpondre avant de poursuivre avec d'autres applications (bote d
vbSystemModal 4096
dialogue au premier plan)

Les valeurs 0 sont celles par dfaut.

Le deuxime argument de MsgBox peut prendre jusqu' une valeur de chaque tableau.

Par exemple, pour une bote de dialogue avec "Oui, Non, Annuler" + icne exclamation + bouton
2 par dfaut :

MsgBox("Texte", vbYesNoCancel + vbExclamation + vbDefaultButton2, "Titre")

Aperu :

121
Compil par Ass Serge KIKOBYA
Les constantes peuvent tre remplaces par leur valeur respective, ces 3 lignes sont identiques :

MsgBox("Texte", vbYesNoCancel + vbExclamation + vbDefaultButton2, "Titre")


MsgBox("Texte", 3 + 48 + 256, "Titre")
MsgBox("Texte", 307, "Titre")

Les valeurs renvoyes par MsgBox

Constante Valeur Bouton correspondant la valeur

vbOK 1

vbCancel 2

vbAbort 3

vbRetry 4

vbIgnore 5

vbYes 6

vbNo 7

Voici l'exemple d'une MsgBox qui apparat en boucle tant que le bouton Oui n'est pas cliqu :
Sub petite_blague()
Do
If MsgBox("Aimez-vous le site ISIG.AC.CD?", vbYesNo, "Sondage") = vbYes Then
Exit Do ' => Si rponse = Oui on sort de la boucle
End If
Loop While 1 = 1 ' => Boucle infinie
MsgBox ";-)"
End Sub

Saut de ligne dans une MsgBox


Pour aller la ligne, vous pouvez insrer le caractre "saut de ligne" avec la fonction Chr et le
n10 correspondant ce caractre, exemple :
MsgBox "Exemple 1" & Chr(10) & "Exemple 2" & Chr(10) & Chr(10) & "Exemple 3"

122
Compil par Ass Serge KIKOBYA
Aperu :

InputBox
L'InputBox demande l'utilisateur d'entrer une valeur depuis une bote de dialogue, exemple :
Sub exemple()
Dim resultat As String

resultat = InputBox("Texte ?", "Titre") 'La variable reoit la valeur entre dans l'InputBox

If resultat <> "" Then 'Si la valeur est diffrente de "" on affiche le rsultat
MsgBox resultat
End If
End Sub

Aperu :

Il est possible d'indiquer une valeur par dfaut en troisime argument :

InputBox("Texte ?", "Titre", "Valeur par dfaut")

Aperu :

123
Compil par Ass Serge KIKOBYA
II.8. Les vnements Workbook

Nous pouvons excuter du code lors de certains vnements du classeur (ouverture, fermeture,
etc).

Workbook_Open ( l'ouverture)
Pour excuter des instructions l'ouverture du classeur, rendez-vous dans ThisWorkbook et
slectionnez Workbook :

L'vnement Workbook_Open est ajout par dfaut, il agit l'ouverture du classeur :


Private Sub Workbook_Open()

End Sub

Par exemple, en ajoutant l'instruction suivante, une bote de dialogue sera affiche l'ouverture
du classeur :

Private Sub Workbook_Open()


MsgBox "Message de bienvenue"
End Sub

Workbook_BeforeClose (avant fermeture)


Pour xcuter des instructions juste avant la fermeture du classeur, choisissez BeforeClose :

124
Compil par Ass Serge KIKOBYA
Private Sub Workbook_BeforeClose(Cancel As Boolean)

End Sub
La fermeture du classeur peut tre annule en attribuant la valeur True la variable "Cancel".

Voici un exemple o l'utilisateur doit confirmer la fermeture du classeur :

Private Sub Workbook_BeforeClose(Cancel As Boolean)


'Si l'utilisateur rpond NON, la variable Cancel vaudra TRUE (ce qui annulera la fermeture)
If MsgBox("Etes-vous certain de vouloir fermer ce classeur ?", 36, "Confirmation") =
vbNo Then
Cancel = True
End If
End Sub

Workbook_BeforeSave (avant enregistrement)


Cet vnement se dclenche juste avant l'enregistrement :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

End Sub
L'enregistrement peut tre annul en attribuant la valeur True la variable "Cancel".

Workbook_BeforePrint (avant impression)


Cet vnement se dclenche juste avant l'impression :

Private Sub Workbook_BeforePrint(Cancel As Boolean)

End Sub
L'impression peut tre annule en attribuant la valeur True la variable "Cancel".

Workbook_AfterSave (aprs enregistrement)


Cet vnement se dclenche juste aprs l'enregistrement :

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

End Sub

Workbook_SheetActivate ( l'activation d'une feuille)


Cet vnement se dclenche chaque changement de feuille :

125
Compil par Ass Serge KIKOBYA
Private Sub Workbook_SheetActivate(ByVal Sh As Object)

End Sub

Par exemple, affichage du nom de la feuille dans une bote de dialogue :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)


MsgBox "Nom de la feuille : " & Sh.Name
End Sub

Workbook_SheetBeforeDoubleClick (avant double-clic)


Cet vnement se dclenche juste avant un double-clic sur une cellule :

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As


Range, Cancel As Boolean)

End Sub

Par exemple, coloration d'une cellule double-clique en fonction de la feuille :

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As


Range, Cancel As Boolean)
If Sh.Name = "Feuil1" Then
Target.Interior.Color = RGB(255, 108, 0) 'Couleur orange
Else
Target.Interior.Color = RGB(136, 255, 0) 'Couleur verte
End If
End Sub

Workbook_SheetBeforeRightClick (avant clic droit)


Cet vnement se dclenche juste avant un clic droit sur une cellule :

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As R


ange, Cancel As Boolean)

End Sub

Workbook_SheetChange ( chaque modification de cellule)


Cet vnement se dclenche chaque modification du contenu d'une cellule :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

Workbook_SheetCalculate ( chaque recalcul)


Cet vnement se dclenche chaque recalcul de donnes d'une feuille :

126
Compil par Ass Serge KIKOBYA
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

End Sub

Workbook_SheetSelectionChange ( chaque changement de slection)


Cet vnement se dclenche chaque changement de slection sur une feuille de calcul :

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Ra


nge)

End Sub

Par exemple, coloration de la slection si A1 est vide :

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Ra


nge)
If Range("A1") = "" Then
Target.Interior.Color = RGB(124, 255, 255) 'Bleu clair
End If
End Sub

Workbook_NewSheet ( l'insertion d'une feuille)


Cet vnement se dclenche chaque insertion d'une nouvelle feuille :

Private Sub Workbook_NewSheet(ByVal Sh As Object)

End Sub

Workbook_SheetFollowHyperlink (au clic sur un lien)


Cet vnement se dclenche lors d'un clic sur un lien hypertexte :

Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hy


perlink)

End Sub

II.9. UserForm

Pour ajouter un UserForm, procdez de la mme manire que pour un nouveau module :

127
Compil par Ass Serge KIKOBYA
La fentre de l'UserForm ainsi que la "Bote outils" apparaissent :

Si la fentre des proprits n'est pas prsente, affichez-la et commencez par modifier le nom de
l'UserForm (pour mieux s'y retrouver par la suite) :

128
Compil par Ass Serge KIKOBYA
Tout comme le classeur ou les feuilles, l'UserForm a ses propres vnements. Pour ajouter des
vnements, double-cliquez sur la fentre de l'UserForm :

Pour prendre un exemple, nous allons crer deux vnements. Le premier pour dfinir les
dimensions initiales de l'UserForm et le second pour augmenter ses dimensions de 50 pixels au
clic.

L'vnement UserForm_Initialize se dclenche au lancement de l'UserForm :

La proprit Height est la hauteur, Width la largeur :


Private Sub UserForm_Initialize()
Mon_userform.Height = 100
Mon_userform.Width = 100
End Sub
Pour simplifier le code, nous pouvons remplacer le nom de l'UserForm par Me (puisque ce code
est plac dans l'UserForm sur lequel on souhaite agir) :
Private Sub UserForm_Initialize()
Me.Height = 100
Me.Width = 100
End Sub

Le second vnement est dclench au clic sur l'UserForm :

Private Sub UserForm_Initialize()


Me.Height = 100
Me.Width = 100
End Sub

Private Sub UserForm_Click()


Me.Height = Me.Height + 50
Me.Width = Me.Width + 50
End Sub

129
Compil par Ass Serge KIKOBYA
Lancer un UserForm
Pour lancer un UserForm depuis une procdure, utilisez Show :
Sub lancer_userform()
Mon_userform.Show
End Sub

Les contrles ont galement toute une panoplie de proprits et d'vnements qui diffrent d'un
contrle l'autre, nous ne verrons ici que quelques unes des nombreuses possibilits lies ces
contrles.

Commencez par ajouter les 3 contrles suivants : un intitul (Label), une zone de texte (TextBox)
et un bouton (CommandButton) :

Modifiez le nom et les proprits des contrles (dont la proprit Caption pour le texte) pour
obtenir ceci :

Pour le moment, lorsque l'on rentre un numro et que l'on valide, il ne se passe rien.

Pour y remdier, nous allons commencer par ajouter un vnement pour entrer la valeur de la
zone de texte dans la cellule A1 et fermer l'UserForm.

130
Compil par Ass Serge KIKOBYA
En double-cliquant sur un contrle, vous aurez accs ceci :

La liste droulante contient les diffrents contrles ainsi que l'UserForm.

Choisissez le bouton et l'vnement Click :


Private Sub CommandButton_valider_Click()

Range("A1") = TextBox_numero.Value
'TextBox_numero est le nom de la zone de texte
'Value est la proprit contenant la valeur de la zone de texte

Unload Me
'Unload ferme l'UserForm
'Le nom de l'UserForm a t remplac par Me (puisque ce code est plac dans l'UserForm fermer)
End Sub

La valeur est alors enregistre dans A1 avant la fermeture de l'UserForm.

Ajoutez un second Label et modifiez les proprits suivantes : Caption, Forecolor (couleur rouge)
et Visible (False, pour masquer le contrle par dfaut) :

Nous allons maintenant ajouter un vnement qui s'active au changement de valeur de la zone
de texte et qui va afficher le message d'erreur si la valeur n'est pas numrique.

Private Sub TextBox_numero_Change()


If IsNumeric(TextBox_numero.Value) Then 'SI valeur numrique ...
Label_erreur.Visible = False 'Label masqu
Else 'SINON ...
Label_erreur.Visible = True 'Label visible
End If
End Sub

Le test de la valeur est effectu chaque entre de caractre ...

Il nous reste encore empcher la validation du formulaire si la valeur n'est pas numrique :

Private Sub CommandButton_valider_Click()


If IsNumeric(TextBox_numero.Value) Then 'SI valeur numrique ...
Range("A1") = TextBox_numero.Value 'Copie en A1
Unload Me 'Fermeture
Else 'SINON ...
MsgBox "Valeur incorrecte"

131
Compil par Ass Serge KIKOBYA
End If
End Sub

Pour ne pas laisser vide la partie droite de l'UserForm lorsqu'il n'y a pas d'erreur, nous pouvons la
rduire en modifiant la proprit Width de l'UserForm :
Private Sub TextBox_numero_Change()
If IsNumeric(TextBox_numero.Value) Then 'SI valeur numrique ...
Label_erreur.Visible = False 'Label masqu
Me.Width = 156 'Largeur de l'UserForm
Else 'SINON ...
Label_erreur.Visible = True 'Label visible
Me.Width = 244 'Largeur de l'UserForm
End If
End Sub

Aperu :

Les cases cocher (CheckBox)


Voici un exemple d'utilisation de cases cocher :

132
Compil par Ass Serge KIKOBYA
Si une case est coche/dcoche la valeur de la cellule correspondante sera modifie, avec
l'vnement Click :
Private Sub CheckBox1_Click() 'N1
If CheckBox1.Value = True Then 'Si coch ...
Range("A2") = "Coch"
Else 'Si non coch ...
Range("A2") = "Non coch"
End If
End Sub

Private Sub CheckBox2_Click() 'N2


If CheckBox2.Value = True Then 'Si coch ...
Range("B2") = "Coch"
Else 'Si non coch ...
Range("B2") = "Non coch"
End If
End Sub

Private Sub CheckBox3_Click() 'N3


If CheckBox3.Value = True Then 'Si coch ...
Range("C2") = "Coch"
Else 'Si non coch ...
Range("C2") = "Non coch"
End If
End Sub

Dans cet exemple, les cases ne sont pas coches au lancement de l'UserForm.
Pour cocher les cases dont la valeur de la cellule correspondante est "Coch", un test est effectu
au lancement de l'UserForm avec l'vnement UserForm_Initialize :
Private Sub UserForm_Initialize() 'Cocher si "Coch"
If Range("A2") = "Coch" Then
CheckBox1.Value = True
End If

If Range("B2") = "Coch" Then

133
Compil par Ass Serge KIKOBYA
CheckBox2.Value = True
End If

If Range("C2") = "Coch" Then


CheckBox3.Value = True
End If
End Sub
Les boutons d'option (OptionButton)
Contrairement aux cases cocher, l'utilisateur ne peut choisir qu'un seul bouton d'option par
"groupe".

Pour crer un groupe, insrez d'abord un cadre (Frame) puis les boutons d'option :

Une fois le formulaire valid, nous entrerons une donne dans la cellule correspondant aux
numros de colonne et de ligne choisis.

Pour connatre le bouton qui a t coch, nous pourrions procder de la mme manire qu'avec
le prcdent exemple (cases cocher) mais nous allons le faire l'aide d'une boucle pour allger
le code.

Nous utiliserons la boucle For Each que nous n'avions pas encore abord jusque-l. Elle permet
d'excuter des instructions pour chaque objet d'un "groupe d'objet" :
Private Sub CommandButton1_Click()
Dim colonne As String, ligne As String

'Boucle pour chaque contrle de Frame_colonne


For Each bouton_colonne In Frame_colonne.Controls
'Si la valeur du contrle = True (donc si coch) ...
If bouton_colonne.Value Then
'La variable "colonne" prend comme valeur le texte du bouton
colonne = bouton_colonne.Caption
End If
Next

'Boucle pour l'autre frame


For Each bouton_ligne In Frame_ligne.Controls
If bouton_ligne.Value Then
ligne = bouton_ligne.Caption
End If
Next

Range(colonne & ligne) = "Cellule choisie !"

134
Compil par Ass Serge KIKOBYA
Unload Me
End Sub

Ce formulaire entre alors la valeur "Cellule choisie !" dans la cellule choisie (pour autant que le
formulaire soit complet).

Pour viter d'avoir ce bug, nous avons besoin de vrifier que l'utilisateur a bien coch les deux
boutons d'option.

Pour cet exemple, tant que le formulaire sera incomplet, le bouton "Valider" restera dsactiv. Ce
n'est pas la solution la plus simple, mais cela vous dmontrera l'intrt d'utiliser des
fonctions/procdures dans un UserForm.

Modifiez le texte ainsi que la proprit Enabled pour dsactiver le bouton :

Ce qui nous donne :

Dans le code ci-dessus, nous avons utilis 2 boucles For Each pour obtenir les valeurs des
boutons cochs. Nous allons avoir besoin de ces mmes valeurs dans les vnements Click du
bouton "Valider" ainsi que des 10 boutons d'option.

Pour viter de copier ces boucles dans chaque vnement, nous allons les appeler l'aide d'une
fonction.

En reprenant le dernier code et en le transformant, cela nous donne :

Private Function colonne()


'La fonction renvoie comme valeur le texte du bouton choisi (colonne)
For Each bouton_colonne In Frame_colonne.Controls

135
Compil par Ass Serge KIKOBYA
If bouton_colonne.Value Then
colonne = bouton_colonne.Caption
End If
Next
End Function

Private Function ligne()


'La fonction renvoie comme valeur le texte du bouton choisi (ligne)
For Each bouton_ligne In Frame_ligne.Controls
If bouton_ligne.Value Then
ligne = bouton_ligne.Caption
End If
Next
End Function

Private Sub CommandButton1_Click() 'Action quand clic sur "Valider le choix"


Range(colonne & ligne) = "Cellule choisie !"
'colonne et ligne sont les valeurs renvoyes par les fonctions
Unload Me
End Sub

Il ne reste plus qu' crer une procdure qui vrifie si les boutons sont bien cochs (en faisant
appel aux deux fonctions) et qui active le bouton si c'est le cas.

L encore, le test est effectu dans une procdure part pour viter de copier 10x le code dans
les vnements des boutons d'option :

Private Sub activer()


'Activation du bouton si la condition est vrifie
If colonne <> "" And ligne <> "" Then
'colonne et ligne sont les valeurs renvoyes par les fonctions
CommandButton1.Enabled = True
CommandButton1.Caption = "Valider le choix"
End If
End Sub

Private Sub OptionButton11_Click()


activer 'Lance la procdure "activer"
End Sub
Private Sub OptionButton12_Click()
activer
End Sub
Private Sub OptionButton13_Click()
activer
End Sub
Private Sub OptionButton14_Click()
activer
End Sub
Private Sub OptionButton15_Click()
activer
End Sub
Private Sub OptionButton16_Click()
activer
End Sub
Private Sub OptionButton17_Click()
activer
End Sub

136
Compil par Ass Serge KIKOBYA
Private Sub OptionButton18_Click()
activer
End Sub
Private Sub OptionButton19_Click()
activer
End Sub
Private Sub OptionButton20_Click()
activer
End Sub

Les barres de dfilement (ScrollBar)


Les contrles peuvent tre utiliss en dehors des UserForms. Pour cet exemple, nous utiliserons
les contrles directement sur la feuille.

Notez tout d'abord que le "Mode Cration" doit tre activ pour modifier un contrle plac sur
une feuille (et dsactiv pour utiliser le contrle).

Pour les versions d'Excel infrieures 2007 : bouton sur la barre "Bote outils Contrles".

Avant de dtailler cet exemple, en voici un aperu :

137
Compil par Ass Serge KIKOBYA
L'objectif est de colorer et slectionner une cellule grce aux barres de dfilement dans la zone
dfinie de 30 lignes x 10 colonnes.

Les proprits de la barre de dfilement verticale :

Min : 1
Max : 30 (puisque 30 lignes)
Value : position de la barre (entre 1 et 30 ici)
Mme chose avec la barre horizontale avec un Max 10 ...
Voici le code qui sera appliqu chaque changement de valeur (Value) de la barre verticale :
'Couleur grise sur les cellules
Cells.Interior.Color = RGB(240, 240, 240)

'Couleur et slection de la cellule


With Cells(ScrollBar_verticale.Value, ActiveCell.Column) 'Cellule par rapport Value
.Interior.Color = RGB(255, 220, 100) 'Couleur orange
.Select 'Slection de la cellule
End With
Ce code sera excut avec les vnements Change et Scroll pour lancer les instructions quelle que
soit la partie de la barre de dfilement qui est clique.

Voici le code pour la barre verticale :

Private Sub barre_verticale()


'Couleur grise sur les cellules
Cells.Interior.Color = RGB(240, 240, 240)

138
Compil par Ass Serge KIKOBYA
'Couleur et slection de la cellule
With Cells(ScrollBar_verticale.Value, ActiveCell.Column)
.Interior.Color = RGB(255, 220, 100) 'Orange
.Select 'Slection de la cellule
End With
End Sub

Private Sub ScrollBar_verticale_Change()


barre_verticale
End Sub

Private Sub ScrollBar_verticale_Scroll()


barre_verticale
End Sub

Et celui de la barre horizontale :

Private Sub barre_horizontale()


'Couleur grise sur les cellules
Cells.Interior.Color = RGB(240, 240, 240)

'Couleur et slection de la cellule


With Cells(ActiveCell.Row, ScrollBar_horizontale.Value)
.Interior.Color = RGB(255, 220, 100) 'Orange
.Select 'Slection de la cellule
End With
End Sub

Private Sub ScrollBar_horizontale_Change()


barre_horizontale
End Sub

Private Sub ScrollBar_horizontale_Scroll()


barre_horizontale
End Sub

La liste droulante (ComboBox) et la zone de liste (ListBox)


Voici le point de dpart de ce nouvel exemple :

Au lancement de l'UserForm, nous voulons que les 4 pays soient chargs dans la liste droulante
(avec la mthodeAddItem) :

139
Compil par Ass Serge KIKOBYA
Private Sub UserForm_Initialize()
For i = 1 To 4 ' => pour lister les 4 pays
ComboBox_Pays.AddItem Cells(1, i) 'Ajoute les valeurs des cellules A1 A4 avec la
boucle
Next
End Sub

Au changement de valeur de la liste droulante, nous voulons ajouter les villes correspondant au
pays choisi avec une boucle semblable celle ci-dessus.

Pour le faire, nous avons besoin du n de colonne et du nombre de lignes.

La proprit ListIndex correspond au n de la slection dans la liste (contrairement Value qui


correspond la valeur), noter que ListIndex commence 0.

Le n de colonne est donc :

no_colonne = ComboBox_Pays.ListIndex + 1

Pour obtenir le nombre de lignes de la colonne du pays choisi, nous pouvons rechercher le n de
ligne de la dernire cellule d'un bloc de cellules non vides :

nb_lignes = Cells(1, no_colonne).End(xlDown).Row

Grce ces informations, il est dsormais possible de crer la boucle pour ajouter les villes dans
la zone de liste :

Private Sub ComboBox_Pays_Change()


'Zone de liste vide (sinon les villes sont ajoutes la suite)
ListBox_Villes.Clear

Dim no_colonne As Integer, nb_lignes As Integer

'Numro de la slection (ListIndex commence 0) :


no_colonne = ComboBox_Pays.ListIndex + 1
'Nombre de lignes de la colonne du pays choisi :
nb_lignes = Cells(1, no_colonne).End(xlDown).Row

For i = 2 To nb_lignes ' => pour lister les villes


ListBox_Villes.AddItem Cells(i, no_colonne)
Next
End Sub

Remarque : nous pourrions rduire le code ci-dessus, nanmoins cela rendrait sa lecture plus
difficile :

Private Sub ComboBox_Pays_Change()


ListBox_Villes.Clear
For i = 2 To Cells(1, ComboBox_Pays.ListIndex + 1).End(xlDown).Row
ListBox_Villes.AddItem Cells(i, ComboBox_Pays.ListIndex + 1)
Next
End Sub

La ville choisie est ensuite entre dans la zone de texte :

140
Compil par Ass Serge KIKOBYA
Private Sub ListBox_Villes_Click()
TextBox_Choix.Value = ListBox_Villes.Value
End Sub

Aller plus loin


N'oubliez pas qu'avec l'aide Excel vous pouvez obtenir des informations rapidement sur les
diffrentes proprits et vnements des contrles (entre autres).

En voici un aperu avec la recherche du contrle Label :

141
Compil par Ass Serge KIKOBYA
L'aide Excel est trs riche en informations, n'hsitez pas l'utiliser en cas de besoin ...

Pour mettre en pratique l'utilisation des contrles, rien de tel qu'un petit exercice ...

Voici le point de dpart de l'exercice :

Vous l'aurez compris, l'objectif est de remplir le tableau via le formulaire.

142
Compil par Ass Serge KIKOBYA
Quelques points prendre en compte :

Lister les pays en fonction de la liste de la seconde feuille


Vrifier le contenu des contrles avant d'ajouter un nouveau contact
Aprs insertion, rinitialiser les valeurs des contrles sans fermer le formulaire

Prenez un moment pour raliser cet exercice avant de passer la solution ...

.
.
.

Voici une solution pour raliser cet exercice


La premire action effectue a t d'augmenter la proprit Zoom de l'UserForm 120 pour plus
de confort l'utilisation du formulaire :

Les tests des boutons d'option ont dj t vus la premire page des contrles, c'est pour cela
qu'une solution plus simple a t utilise ici.

Le bouton "Mme" a t choisi par dfaut (proprit Value : True), cela implique qu'il ne sera pas
ncessaire de vrifier si le choix de la civilit a t effectu.

Le bouton "Fermer"
Private Sub CommandButton_Fermer_Click()
Unload Me
End Sub

Le contenu de la liste droulante


Private Sub UserForm_Initialize() 'Chargement de la liste au lancement de l'UserForm
For i = 1 To 231 'Liste des 231 pays de la feuille "Pays"

143
Compil par Ass Serge KIKOBYA
ComboBox_Pays.AddItem Sheets("Pays").Cells(i, 1)
Next
End Sub

Vrification des contrles


Une solution simple consiste afficher une bote de dialogue si l'un des contrles est vide :

Private Sub CommandButton_Ajouter_Click()


If TextBox_Nom.Value = "" Or TextBox_Prenom.Value
= "" Or TextBox_Adresse.Value = "" OrTextBox_Lieu.Value
= "" Or ComboBox_Pays.Value = "" Then
MsgBox "Formulaire incomplet"
Else
'Instructions pour insrer le contact ici ...
End If
End Sub

Mais pour compliquer un peu les choses, chaque contrle sera test individuellement, et si l'un
d'eux n'est pas rempli, son intitul (Label) sera color en rouge :

Private Sub CommandButton_Ajouter_Click()


'Coloration des Labels en noir
Label_Nom.ForeColor = RGB(0, 0, 0)
Label_Prenom.ForeColor = RGB(0, 0, 0)
Label_Adresse.ForeColor = RGB(0, 0, 0)
Label_Lieu.ForeColor = RGB(0, 0, 0)
Label_Pays.ForeColor = RGB(0, 0, 0)

'Contrles de contenu
If TextBox_Nom.Value = "" Then 'SI pas de "nom" ...
Label_Nom.ForeColor = RGB(255, 0, 0) 'Label "nom" en rouge
ElseIf TextBox_Prenom.Value = "" Then
Label_Prenom.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Adresse.Value = "" Then
Label_Adresse.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Lieu.Value = "" Then
Label_Lieu.ForeColor = RGB(255, 0, 0)
ElseIf ComboBox_Pays.Value = "" Then
Label_Pays.ForeColor = RGB(255, 0, 0)
Else
'Instructions pour insrer le contact ici ...
End If
End Sub

144
Compil par Ass Serge KIKOBYA
Insertion des donnes
Le code suivant a t insr l'emplacement indiqu sur la code prcdent (sous forme de
commentaire) :

Dim no_ligne As Integer, civilite As String

'Choix de civilit
For Each bouton_civilite In Frame_Civilite.Controls
If bouton_civilite.Value Then
civilite = bouton_civilite.Caption 'Civilit choisie
End If
Next

'no_ligne = N de ligne de la dernire cellule non vide de la colonne +1


no_ligne = Range("A65536").End(xlUp).Row + 1

'Insertion des valeurs sur la feuille


Cells(no_ligne, 1) = civilite
Cells(no_ligne, 2) = TextBox_Nom.Value
Cells(no_ligne, 3) = TextBox_Prenom.Value
Cells(no_ligne, 4) = TextBox_Adresse.Value
Cells(no_ligne, 5) = TextBox_Lieu.Value
Cells(no_ligne, 6) = ComboBox_Pays.Value

'Aprs insertion, on remet les valeurs initiales


OptionButton1.Value = True
TextBox_Nom.Value = ""
TextBox_Prenom.Value = ""
TextBox_Adresse.Value = ""
TextBox_Lieu.Value = ""
ComboBox_Pays.ListIndex = -1

Vue d'ensemble
Pour terminer, voici le code complet ainsi que le fichier :

145
Compil par Ass Serge KIKOBYA
Private Sub CommandButton_Fermer_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize() 'Liste des 231 pays de la feuille "Pays"


For i = 1 To 231
ComboBox_Pays.AddItem Sheets("Pays").Cells(i, 1)
Next
End Sub

Private Sub CommandButton_Ajouter_Click()


'Coloration des Labels en noir
Label_Nom.ForeColor = RGB(0, 0, 0)
Label_Prenom.ForeColor = RGB(0, 0, 0)
Label_Adresse.ForeColor = RGB(0, 0, 0)
Label_Lieu.ForeColor = RGB(0, 0, 0)
Label_Pays.ForeColor = RGB(0, 0, 0)

'Contrles de contenu
If TextBox_Nom.Value = "" Then 'SI pas de "nom" ...
Label_Nom.ForeColor = RGB(255, 0, 0) 'Label "nom" en rouge
ElseIf TextBox_Prenom.Value = "" Then
Label_Prenom.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Adresse.Value = "" Then
Label_Adresse.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Lieu.Value = "" Then
Label_Lieu.ForeColor = RGB(255, 0, 0)
ElseIf ComboBox_Pays.Value = "" Then
Label_Pays.ForeColor = RGB(255, 0, 0)
Else
'Si le formulaire est complet, on insre les valeurs sur la feuille
Dim no_ligne As Integer, civilite As String

'Choix de civilit
For Each bouton_civilite In Frame_Civilite.Controls
If bouton_civilite.Value Then
civilite = bouton_civilite.Caption
End If
Next

'no_ligne = N de ligne de la dernire cellule non vide de la colonne +1


no_ligne = Range("A65536").End(xlUp).Row + 1

'Insertion des valeurs sur la feuille


Cells(no_ligne, 1) = civilite
Cells(no_ligne, 2) = TextBox_Nom.Value
Cells(no_ligne, 3) = TextBox_Prenom.Value
Cells(no_ligne, 4) = TextBox_Adresse.Value
Cells(no_ligne, 5) = TextBox_Lieu.Value
Cells(no_ligne, 6) = ComboBox_Pays.Value

'Aprs insertion, on remet les valeurs initiales


OptionButton1.Value = True
TextBox_Nom.Value = ""
TextBox_Prenom.Value = ""
TextBox_Adresse.Value = ""
TextBox_Lieu.Value = ""
ComboBox_Pays.ListIndex = -1

146
Compil par Ass Serge KIKOBYA
End If
End Sub

II.10. Utilisations des tableaux

Les tableaux sont des "variables" qui permettent de stocker une multitude de valeurs. Nous avons
effleur le sujet la leon sur les variables, nous allons maintenant l'approfondir ...

Intrt des tableaux


Imaginez que dans une procdure vous ayez besoin de stocker 500 valeurs. S'il fallait crer 500
variables pour stocker toutes ces valeurs, cela deviendrait trs compliqu, tandis qu'avec un
tableau, le stockage et l'utilisation de ces valeurs seront grandement simplifis.

Le second intrt des tableaux est leur "rapidit". Parcourir un tableau de donnes demande
beaucoup moins de temps que parcourir un "tableau" (compos de cellules) sur une feuille Excel
...

Rien de tel qu'un exemple pour mieux comprendre ...

Sur la premire feuille ("BD") : une base de donnes de 5000 lignes sur 3 colonnes :

Sur la seconde feuille : un "tableau" rcapitulatif o seront comptabiliss les "OUI" en fonction des
annes et des clients :

147
Compil par Ass Serge KIKOBYA
Dans le cas prsent, la procdure va parcourir la base de donnes en boucle et comptabilisera
pour chaque anne et chaque n de client le nombre de "OUI" avant de l'entrer dans la cellule
correspondante.

Sans utiliser de tableau, il faudra 131.44 secondes Excel pour excuter la procdure :

148
Compil par Ass Serge KIKOBYA
En enregistrant d'abord la base de donnes (de la feuille "BD") dans un tableau et en effectuant
ensuite les mmes calculs (en utilisant le tableau la place de la base de donnes de la feuille
"BD"), il ne faudra que 1.74 secondes pour excuter la procdure :

Et si l'on dcide d'optimiser la procdure en n'enregistrant que les donnes avec les "OUI" dans le
tableau (ce qui reprsente environ le 3/4 des donnes), 1.02 secondes suffisent :

149
Compil par Ass Serge KIKOBYA
Dans cet exemple, l'utilisation d'un tableau a permis d'excuter la procdure environ 128x plus
rapidement et cette diffrence peut encore augmenter sensiblement lorsque l'on travaille avec
plusieurs bases de donnes en mme temps.

Vous l'avez compris, l'utilisation de tableaux peut vraiment faire la diffrence.

Cet exemple sera dtaill en fin de leon ...

Dclaration d'un tableau


Voici quelques exemples de dclarations (si les 2 premiers ne sont pas clairs pour vous, relisez
ceci) :

'Exemple de dclaration d'un tableau 1 dimension


Dim tab1(4)

'Exemple de dclaration d'un tableau 2 dimensions


Dim tab2(6, 1)

'Exemple de dclaration d'un tableau dynamique


Dim tab()

Si vous ne pouvez pas entrer de valeurs fixes (parce que cela dpend de la taille de la base de
donnes par exemple), laissez les parenthses vides.

150
Compil par Ass Serge KIKOBYA
Vous n'avez pas besoin de dclarer un type (string, long, etc.), dans bien des cas cela ralentirait
votre procdure ...

Enregistrer des donnes dans un tableau


Commenons par enregistrer ces quelques donnes dans un tableau :

Nous voulons enregistrer ici 11 x 1 valeurs, il faudra donc crer un tableau une dimension :

'Dclaration
Dim tab_exemple(10)
Rappelez-vous que la numrotation d'un tableau commence 0 (c'est une norme en
programmation, autant prendre de bonnes habitudes ds le dbut mme s'il est possible de
modifier cela en VBA).

Chaque lment du tableau reoit ensuite sa valeur :

'Enregistrement des valeurs dans le tableau


tab_exemple(0) = Range("A2")
tab_exemple(1) = Range("A3")
tab_exemple(2) = Range("A4")
tab_exemple(3) = Range("A5")
tab_exemple(4) = Range("A6")
tab_exemple(5) = Range("A7")
tab_exemple(6) = Range("A8")
tab_exemple(7) = Range("A9")
tab_exemple(8) = Range("A10")
tab_exemple(9) = Range("A11")
tab_exemple(10) = Range("A12")

Vous pouvez utiliser, modifier chaque lment du tableau comme une variable.

En voici un exemple avec tab_exemple(8) :


Sub enreg_tab()
'Dclaration

151
Compil par Ass Serge KIKOBYA
Dim tab_exemple(10)

'Enregistrement des valeurs dans le tableau


tab_exemple(0) = Range("A2")
tab_exemple(1) = Range("A3")
tab_exemple(2) = Range("A4")
tab_exemple(3) = Range("A5")
tab_exemple(4) = Range("A6")
tab_exemple(5) = Range("A7")
tab_exemple(6) = Range("A8")
tab_exemple(7) = Range("A9")
tab_exemple(8) = Range("A10")
tab_exemple(9) = Range("A11")
tab_exemple(10) = Range("A12")

'Test 1
MsgBox tab_exemple(8) '=> renvoie : 04.02.2016

'Modification de l'une des valeurs


tab_exemple(8) = Year(tab_exemple(8))

'Test 2
MsgBox tab_exemple(8) '=> renvoie : 2016
End Sub
Pour enregistrer ce mme tableau plus rapidement, une boucle For est toute indique :
'Dclaration
Dim tab_exemple(10)

'Enregistrement des valeurs dans le tableau


For i = 0 To 10
tab_exemple(i) = Range("A" & i + 2)
Next

Le tableau 2 dimensions

Pour enregistrer plusieurs colonnes de donnes, une dimension supplmentaire est ncessaire. En
voici un exemple :

152
Compil par Ass Serge KIKOBYA
Enregistrement des donnes dans un tableau 2 dimensions :

'Dclaration
Dim tab_exemple(10, 2) 'Tableau de 11 x 3 "cases"

'Enregistrement des valeurs dans le tableau


For i = 0 To 10
tab_exemple(i, 0) = Range("A" & i + 2)
tab_exemple(i, 1) = Range("B" & i + 2)
tab_exemple(i, 2) = Range("C" & i + 2)
Next

Et quelques exemples de valeurs :

MsgBox tab_exemple(0, 0) '=> renvoie : 11.03.2026


MsgBox tab_exemple(0, 1) '=> renvoie : 24
MsgBox tab_exemple(9, 2) '=> renvoie : NON
MsgBox tab_exemple(10, 2) '=> renvoie : OUI

Le tableau dynamique
Imaginons que cette mme base de donnes soit rgulirement mise jour et que l'on ne puisse
donc pas entrer de valeurs fixes la dclaration ...

Pour connatre le n de ligne de la dernire cellule d'un bloc de cellules non vides, autrement dit,
la dernire ligne de notre base de donnes, utilisez cette formule :

derniere_ligne = Range("A1").End(xlDown).Row

Si vous entrez une variable lors de la dclaration, Excel ne l'acceptera pas.

Dclarez un tableau dynamique (parenthses vides), puis dfinissez ses dimensions avec Redim :
Dim tab_exemple()
ReDim tab_exemple(derniere_ligne - 2, 2)

De cette manire vous enregistrerez automatiquement toutes les lignes de la base de donnes
dans le tableau :

153
Compil par Ass Serge KIKOBYA
Sub enreg_tab()
derniere_ligne = Range("A1").End(xlDown).Row 'Dernire ligne de la base de donnes

Dim tab_exemple()
ReDim tab_exemple(derniere_ligne - 2, 2)

'Enregistrement des valeurs dans le tableau


For i = 0 To derniere_ligne - 2
tab_exemple(i, 0) = Range("A" & i + 2)
tab_exemple(i, 1) = Range("B" & i + 2)
tab_exemple(i, 2) = Range("C" & i + 2)
Next
End Sub

Ubound
Dans l'exemple ci-dessus, le dernier n de notre tableau tait derniere_ligne - 2 :
For i = 0 To derniere_ligne - 2
Une autre solution pour connatre ce n consiste utiliser la fonction Ubound :
For i = 0 To UBound(tab_exemple)

Cette fonction renvoie le plus grand n pour une dimension choisie (par dfaut la premire).

Quelques exemples pour mieux comprendre :

Sub enreg_tab()
Dim tab_exemple(10, 2)

MsgBox UBound(tab_exemple) '=> renvoie : 10


MsgBox UBound(tab_exemple, 1) '=> renvoie : 10
MsgBox UBound(tab_exemple, 2) '=> renvoie : 2
End Sub

Enregistrer une plage de cellules


Il est possible d'enregistrer une plage de cellules dans un tableau sans passer par une boucle.

'Dclaration
Dim tab_exemple(10, 2) 'Tableau de 11 x 3 "cases"

'Enregistrement des valeurs dans le tableau


For i = 0 To 10
tab_exemple(i, 0) = Range("A" & i + 2)
tab_exemple(i, 1) = Range("B" & i + 2)
tab_exemple(i, 2) = Range("C" & i + 2)
Next

Le code ci-dessus peut tre remplac par :

'Dclaration
Dim tab_exemple()

'Enregistrement des valeurs dans le tableau


tab_exemple = Range("A2:C12").Value

154
Compil par Ass Serge KIKOBYA
Mme si au premier abord cette seconde mthode semble sduisante, elle peut dans bien des cas
vous faire perdre plus de temps que la premire mthode ...

En enregistrant vos donnes dans le tableau de cette manire, le premier n n'est pas 0 mais 1,
cela peut tre source de confusion ... De plus, si au cours du dveloppement vous choisissez de
n'enregistrer dans le tableau que les donnes rpondant certains critres (ou effectuer toute
autre opration), vous aurez besoin de tout rcrire avec une boucle ...

Cette seconde mthode reste tout de mme intressante lorsque vous avez besoin d'enregistrer
l'ensemble du contenu d'une grande base de donnes, car plus rapide qu'avec une boucle (gain
d'environ 0.2 secondes pour 15'000 entres).

Array
Vous aurez peut-tre parfois besoin de crer un tableau contenant des donnes "fixes".

Une solution consiste l'crire ligne par ligne :

Dim fr(5)

fr(0) = "SI"
fr(1) = "RECHERCHEV"
fr(2) = "SOMME"
fr(3) = "NB"
fr(4) = "ESTNUM"
fr(5) = "STXT"
Heureusement, vous pouvez vous simplifier la tche en utilisant Array :
fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
Voici un exemple d'utilisation de la fonction Replace (utile pour mieux comprendre l'exemple
suivant) :
Sub remplacement()
Dim chaine_a_traiter As String

'Une chane pour cet exemple


chaine_a_traiter = "Hello World !"

'Remplacement de "World" par "toi" dans la chane de caractres


chaine_a_traiter = Replace(chaine_a_traiter, "World", "toi")

'La chane aprs remplacement


MsgBox chaine_a_traiter '=> renvoie "Hello toi !"
End Sub
Maintenant si l'on veut remplacer une srie de valeurs par une autre srie, l'utilisation de tableaux
(Array) est toute indique :
Sub traduction() 'Exemple simplifi de traduction FR-EN de formules
Dim chaine_a_traiter As String

'Une chane pour cet exemple


chaine_a_traiter = "Formule traduire : SOMME(SI(ESTNUM(A1:E1);A1:E1;0))"

'Les 2 sries de valeurs


fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")

155
Compil par Ass Serge KIKOBYA
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")

'Remplacement de "SI" par "IF", de "RECHERCHEV" par "VLOOKUP", etc.


For i = 0 To UBound(fr)
chaine_a_traiter = Replace(chaine_a_traiter, fr(i), en(i))
Next

'La chane aprs les remplacements


MsgBox chaine_a_traiter '=> renvoie "Formule traduire :
SUM(IF(ISNUMBER(A1:E1);A1:E1;0))"
End Sub

Split
La fonction Split permet de convertir une chane de caractres en un tableau.

Pour convertir cette chane de caractres en tableau :

chaine = "SI/RECHERCHEV/SOMME/NB/ESTNUM/STXT"
Utilisez la fonction Split et dfinissez le sparateur :
fr = Split(chaine, "/")
Le tableau fr renverra les valeurs suivantes :
MsgBox fr(0) '=> renvoie : SI
MsgBox fr(1) '=> renvoie : RECHERCHEV
MsgBox fr(2) '=> renvoie : SOMME
MsgBox fr(3) '=> renvoie : NB
MsgBox fr(4) '=> renvoie : ESTNUM
MsgBox fr(5) '=> renvoie : STXT

Les 3 tableaux suivants renvoient galement les mmes valeurs :

fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")


fr = Split("SI,RECHERCHEV,SOMME,NB,ESTNUM,STXT", ",")
fr = Split("SI RECHERCHEV SOMME NB ESTNUM STXT", " ")
L'exemple suivant renvoie la 3e valeur de la chane de caractres :
MsgBox Split("SI,RECHERCHEV,SOMME,NB,ESTNUM,STXT", ",")(2) '=> renvoie : SOMME

La fonction l'oppos de Split est Join.

Cette fonction permet d'assembler les valeurs d'un tableau en une chane de caractres.

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> renvoie : 12345

156
Compil par Ass Serge KIKOBYA
II.11. Utilisations des fonctions Excel

Il est possible d'utiliser les fonctions Excel dans le code VBA.

Aprs avoir entr WorksheetFunction, la liste des fonctions apparat :

Les fonctions sont toutes en anglais ...

Pour s'y retrouver, une liste des fonctions traduites en anglais est disponible sur ce site, en
voici un extrait :

Fonction en
Fonction en anglais Description de la fonction
franais

NB COUNT dtermine les nombres compris dans la liste des arguments.

NB.SI COUNTIF compte le nombre de cellules qui rpondent un critre donn dans une plage.

compte le nombre de cellules lintrieur dune plage qui rpondent plusieurs


NB.SI.ENS COUNTIFS critres.

NB.VIDE COUNTBLANK compte le nombre de cellules vides dans une plage.

NBVAL COUNTA dtermine le nombre de valeurs comprises dans la liste des arguments.

La fonction choisie pour cet exemple est donc NB.VIDE.

157
Compil par Ass Serge KIKOBYA
Dans l'exemple suivant, le nombre de cellules vides de la plage "A1:D8" est enregistr dans la
variable puis affich dans la bote de dialogue :
Sub test()
var_test = WorksheetFunction.CountBlank(Range("A1:D8"))
MsgBox var_test
End Sub

Crer une fonction personnalise


Pour cet exemple, nous allons crer une fonction SI personnalise utilisable sur une feuille de
calcul comme n'importe quelle autre fonction.

Pour afficher une valeur (B2) si une cellule (C2) contient une valeur ("OUI"), nous pouvons utiliser
la fonction SI avec la formule =SI(C2="OUI";B2;0) :

L'objectif ici est de crer une fonction capable de faire cela =SI(C2 a un fond vert;B2;0) que
nous crirons comme ceci : =SI_VERT(C2;B2) :

158
Compil par Ass Serge KIKOBYA
Dvelopper la fonction personnalise
Commencez par crer votre fonction :

Function SI_VERT(paye As Range, montant)

End Function

Les arguments :

paye As Range : la cellule tester


montant : la valeur entrer si VRAI

Dans le cas prsent, si le test est FAUX, la valeur sera 0 chaque fois, il est donc inutile d'avoir un argument pour
cela.

Pour vrifier si la couleur est correcte, vous pouvez utiliser une cellule contenant la bonne couleur
comme point de comparaison :

Function SI_VERT(paye As Range, montant)

couleur = Sheets("Feuil1").Range("K1").Interior.color

End Function

Mais pour viter de dpendre d'une cellule, nous allons utiliser ici le n de la couleur qui nous
intresse :

Function SI_VERT(paye As Range, montant)

couleur = 5296274 'Vert

End Function

159
Compil par Ass Serge KIKOBYA
Pour connatre le n de couleur de fond d'une cellule, slectionnez la cellule et excutez cette
macro :

Sub test_color()
MsgBox ActiveCell.Interior.color
End Sub

Il ne reste plus qu' tester la couleur avec If :


Function SI_VERT(paye As Range, montant)

Application.Volatile

couleur = 5296274 'Vert

If paye.Interior.color = couleur Then 'Si VRAI


SI_VERT = montant
Else 'Si FAUX
SI_VERT = 0
End If

End Function

La fonction est maintenant prte l'emploi.

Application.Volatile indique que la fonction est volatile (comme c'est le cas pour la fonction SI), ce
qui signifie qu'elle doit tre recalcule chaque changement de valeur. Par exemple, si vous
modifiez l'un des montants (ou n'importe quelle autre cellule), la fonction est recalcule est
affichera le bon montant.

En revanche, la modification de la couleur de fond ne dclenche pas cette mise jour. Pour
recalculer les valeurs sans attendre, vous pouvez par exemple appuyer sur "Delete" en
slectionnant une cellule vide ou ajouter un bouton "Actualiser" pour tout recalculer d'un clic :

Sub actualiser()
Application.Calculate
End Sub

160
Compil par Ass Serge KIKOBYA
Complments
Une autre manire d'crire cette mme fonction :

Function SI_VERT(paye As Range, montant)


Application.Volatile
SI_VERT = 0 'Si FAUX
If paye.Interior.color = 5296274 Then SI_VERT = montant 'Si VRAI
End Function

TP : Dvelopper une application Excel de gestion :


Ce qu'il faut comprendre par "application de gestion", c'est tout simplement : une application qui
permet de grer des donnes ...

Une "application de gestion" peut donc tre une application de :

gestion des clients, des fournisseurs


gestion des commandes, des devis
gestion des plannings, des projets
gestion des ressources
gestion des comptes
gestion des stocks, des articles
gestion des salaires
gestion des factures
gestion/archivage de donnes
etc.

161
Compil par Ass Serge KIKOBYA
Crer une application de gestion est donc certainement l'objectif de la majorit des personnes qui se
sont mises au VBA !
Et, bonne nouvelle, si vous avez suivi le cours VBA (ou quivalent), vous avez dj 90% des
connaissances thoriquesutiles au dveloppement d'une application de gestion ...

162
Compil par Ass Serge KIKOBYA

You might also like