L3-2011 Excel Cours 2 Vba
L3-2011 Excel Cours 2 Vba
b) Execution de la macro
Si une touche de raccourci a été prévue lancer la macro en combinant la touche Ctrl et la lettre choisie
J. Soichot 1 2011-2012
Licence Sciences Economiques VBA: cours n° 2
Sinon passez par le menu Outils/Macro.../[Nom de la macro: choisissez dans la liste] puis [Exécuter]
Application
Mettre l’ensemble de la feuille de calcul en caractères Arial de taille 12.
Inscrire quelques nombres dans les cellules B4 : B7
Lancer l’enregistrement
Sélectionner les cellules B4 :B7
Sélectionner le menu Format puis Cellules
Onglet Police
Mettre en Times New Roman de taille 10
Mettre en gras
Onglet Alignement
Centrer les données
Onglet Bordures
Faire un encadrement
Arrêter l’enregistrement
c) Contenu de la macro
Le texte du programme correspondant à la macro est inséré dans une feuille de module qui est dans « Microsoft
Visual Basic ». Pour voir ce programme
1° méthode : choisir le menu Visual Basic Editor dans le sous menu de Outils/ Macros
puis sélectionnez dans l’arborescence du projet « module 1 » dans le classeur des modules
2° méthode : sélectionnez dans la boite de dialogue sur les macros, la macro à consulter puis choisir le bouton
modifier
Sub Macro1()
' Selection.Borders(xlDiagonalDown).LineStyle =
' Macro1 Macro xlNone
' Macro enregistrée le 06/12/2000 par latec Selection.Borders(xlDiagonalUp).LineStyle =
' xlNone
' Touche de raccourci du clavier: Ctrl+a With Selection.Borders(xlEdgeLeft)
Range("B4:B7").Select .LineStyle = xlContinuous
With Selection .Weight = xlThin
.HorizontalAlignment = xlCenter .ColorIndex = xlAutomatic
.VerticalAlignment = xlBottom End With
.WrapText = False With Selection.Borders(xlEdgeTop)
.Orientation = 0 .LineStyle = xlContinuous
.ShrinkToFit = False .Weight = xlThin
.MergeCells = False .ColorIndex = xlAutomatic
End With End With
With Selection.Font With Selection.Borders(xlEdgeBottom)
.Name = "Times New Roman" .LineStyle = xlContinuous
.Size = 10 .Weight = xlThin
.Strikethrough = False .ColorIndex = xlAutomatic
.Superscript = False End With
.Subscript = False With Selection.Borders(xlEdgeRight)
.OutlineFont = False .LineStyle = xlContinuous
.Shadow = False .Weight = xlThin
.Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic
.ColorIndex = xlAutomatic End With
End With
Selection.Font.Bold = True Selection.Borders(xlInsideHorizontal).LineStyle
= xlNone
End Sub
J. Soichot 2 2011-2012
Licence Sciences Economiques VBA: cours n° 2
On reconnaît ici la traduction des différentes manipulations. Mais cette macro doit être modifiée pour deux
raisons. La première est que elle créera un cadre toujours au même endroit de la feuille de calcul (B4:B7). La
seconde est que l'on s'est trompé lorsqu'on a voulu mettre le paramètre de "centrage" que l'on a affecté par erreur
à l'alignement vertical et non pas horizontal. Enfin, on peut "dégraisser" ce programme qui reprend absolument
toutes les valeurs de paramètres, y compris celles qui sont mises par défaut. On verra qu'il suffit de ne
mentionner que les instructions qui modifient les valeurs de paramètres.
Le texte des macros sont stockés dans des feuilles "module". Il suffit de cliquer sur l'onglet d'un module pour
accéder au texte de la macro. Un dossier Excel peut contenir plusieurs feuilles "module".
· Pour modifier une macro on peut utiliser les fonctions de traitement de texte (couper/copier/coller ...) On peut
en particulier effectuer des couper/coller ou des copier/coller d'une feuille module à une autre feuille et d'un
module à un autre. Il est donc possible de faire de petites macros pour les tester puis, une fois mises au point de
les assembler. On peut également enlever des instructions superflues qui ont été enregistrées et dont on n'a pas
besoin.
On propose ici la correction du programme. Pour une meilleure compréhension, on a laissé les instructions que
l'on voulait supprimer (typographie en italique) en les faisant précéder d'une apostrophe, ce qui a pour effet de
les transformer en "remarque"
.Sub cadre()
‘ Range("B4:B7").Select
With Selection
.HorizontalAlignment = xlCenter
‘ .VerticalAlignment = xlBottom
Après dégraissage
‘ .WrapText = False
Sub cadre()
‘ .Orientation = 0
Selection.HorizontalAlignment = xlCenter
‘ .ShrinkToFit = False
With Selection.Font
‘ .MergeCells = False
.Name = "Times New Roman"
End With
.Size = 10
With Selection.Font
End With
.Name = "Times New Roman"
Selection.Font.Bold = True
.Size = 10
With Selection.Borders(xlEdgeLeft)
‘ .Strikethrough = False
.LineStyle = xlContinuous
‘ .Superscript = False
.Weight = xlThin
‘ .Subscript = False
End With
‘ .OutlineFont = False
With Selection.Borders(xlEdgeTop)
‘ .Shadow = False
.LineStyle = xlContinuous
‘ .Underline = xlUnderlineStyleNone
.Weight = xlThin
‘ .ColorIndex = xlAutomatic
End With
End With
With Selection.Borders(xlEdgeBottom)
Selection.Font.Bold = True
.LineStyle = xlContinuous
‘Selection.Borders(xlDiagonalDown).Line Style
.Weight = xlThin
= xlNone
End With
Selection.Borders(xlDiagonalUp).LineStyle =
With Selection.Borders(xlEdgeRight)
xlNone
.LineStyle = xlContinuous
With Selection.Borders(xlEdgeLeft)
.Weight = xlThin
.LineStyle = xlContinuous
End With
.Weight = xlThin
‘ .ColorIndex = xlAutomatic
End With End Sub
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
‘ .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
‘ .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
‘ .ColorIndex = xlAutomatic
End With
‘ Selection.Borders(xlInsideHorizontal).LineStyle
= xlNone
End Sub
J. Soichot 3 2011-2012
Licence Sciences Economiques VBA: cours n° 2
On constate que l’on a presque les mêmes objets (on appelle cela des Contrôles). Il vaut mieux utiliser la barre
d’outils « commandes » dans la mesure où la seconde reste plus appropriée aux anciennes feuilles de dialogue.
A chaque objet est associé d’une part des propriétés, d’autre part (éventuellement ) du code. La différence est la
« localisation du code ». Il faut savoir, comme le montre la boîte ci-dessous que à un dossier est associé un
projet.
J. Soichot 4 2011-2012
Licence Sciences Economiques VBA: cours n° 2
En ce qui concerne les manipulations des objets dessinés, on peut rappeler que ces objets peuvent être modifiés
dans leur taille (il suffit de tirer sur les poignées) mais aussi les déplacer, les dupliquer ou les supprimer. Il suffit
de les sélectionner en mode création soit en cliquant sur l’équerre si l’objet est un objet de la barre d’outil
commandes soit en maintenant la touche Ctrl appuyée et en allant cliquer sur l’objet s’il est un objet de la barre
d’outils Formulaire.
A partir de là, on peut déplacer l’objet, par glissement ; le copier par glissement en maintenant la touche Ctrl
appuyée ou le supprimer avec la touche Suppr.
A – à partir de la barre d’outils commandes
1 – Pour faire apparaître la barre d’outils « commandes »
menu Affichage Barres d’outils cocher « commandes »
2 - Dessin du bouton dans la feuille de calcul
Cliquer sur l'objet "bouton" ; une mire apparaît ( sous la forme d'une croix + )
Déplacer la mire dans la feuille de calcul jusqu'à l'endroit qui sera le coin supérieur gauche du bouton
puis "tirer" (i.e. maintien du bouton gauche de la souris appuyé et glisser vers ce qui sera le coin
inférieur droit du bouton). Quand vous relâchez la souris, le bouton est créé.
=INCORPORER("Forms.CommandButton.1";"")
Le bouton qui se présente ainsi est en mode creation. On peut en changer les propriétés où lui associer
du code de façon qu’il exécute bien la macro désirée.
3 – associer du code
Lorsque le bouton est sélectionné, l’utilisation de l’icône ‘modifier le code’ crée automatiquement un
sous-programme ‘vide’.
Private Sub CommandButton1_Click()
End Sub
Ce sous-programme (sub routine) est ce que l’on appelle une procédure événementielle : l’événement
est ici le Click sur le bouton qui en déclenchera automatiquement l’exécution. Or, ce que l’on veut
exécuter, c’est le (sous)programme Macro1. Il suffit d’écrire
Private Sub CommandButton1_Click()
Macro1
End Sub
On remarque donc que pour exécuter une procédure depuis une autre procédure, il suffit de la nommer.
Dit autrement, le nom du sous-programme (Macro1) constitue dans notre procédure
‘CommandButton1_Click ( ) une instruction d’appel.de la procédure macro1.
Dans le programme Macro1, rajouter l’instruction Selection.Select pour que VBA comprenne bien que
la sélection est une plage. Sinon, on aura un message d’erreur. Cette erreur ne se produit pas si on
lance la macro par le menu Outils / Macro / exécuter car la macro ayant été créée par enregistrement
dans une feuille de calcul, elle s’applique automatiquement à la sélection de cellule sur la plage.
En revanche, en passant par le code associé au bouton, VBA ne sait pas a priori si la sélection
concerne une plage ou un autre objet. C’est pourquoi l’instruction , apparemment idiote,
Selection.Select précise en fait qu’il s’agit des cellules sélectionnées.
4 – exécuter.
Il suffit de quitter le mode création (en cliquant sur l’équerre) et de cliquer sur le bouton.
B – à partir de la barre d’outils Formulaires – pour mémoire/ déconseillé
1 – Dessiner un bouton sur la feuille
La technique est la même que précédemment. Le bouton en mode création est entouré de stries.
Lorsqu'il apparaît sous cette forme (entourage strié), le bouton peut être modifié;
J. Soichot 5 2011-2012
Licence Sciences Economiques VBA: cours n° 2
- le nom "Bouton 1" , proposé par défaut peut, en particulier être modifié: en cliquant à l'intérieur du
bouton, on fait apparaître la barre d'insertion de texte et on peut effacer le texte pour le remplacer par un
autre. Remarquer que le contour hachuré disparaît. Pour "valider" le nouveau texte, cliquer en dehors du
bouton n'importe où sur la feuille de calcul
- on peut modifier la forme du bouton en tirant sur les poignées
2- Affecter un bouton à une macro
Jusqu'ici on n'a fait que créer, dessiner un bouton. Lorsque le dessin est terminé, une boite de dialogue
apparaît permettant de rattacher le bouton à une macro. Si la macro n'est pas encore écrite, il suffit de
fermer cette boite de dialogue en cliquant "Annuler", sinon, choisir dans la liste la macro que l'on veut
rattacher au bouton
Affecter un bouton à une macro peut se faire à tout moment. On accède à la boîte de dialogue en
sélectionnant dans les menus : Outils/ Affecter une macro ... / [Nom de la macro : ]
3 - lancement de la macro
Quand vous approchez la flèche de la souris du bouton de lancement, celle-ci se transforme en une
main. Il suffit de cliquer la souris pour déclencher la macro.
J. Soichot 6 2011-2012
Licence Sciences Economiques VBA: cours n° 2
On voit que l’argument est une chaîne de caractères. Dans les exemples précédents, l’argument est une
constante puisqu’on a du texte entre doubles quotes (" "). Mais on pourrait tout aussi bien avoir une variable
ou une combinaison de variables de type chaîne.
Exemple : On suppose que les feuilles Excel d’un classeur s’appellent "Pierre" , "Paul" , "Jacques". Si dans le
programme on a créé une variable qui s’appelle « individu » et si on souhaite mettre à 0 la cellule B2 de la
feuille qui se rapporte aux données de cet individu, alors on peut écrire, s’il s’agit de l’individu "Paul"
individu = "Paul"
Range( individu + "!B2").value = 0
La propriété ActiveCell (cellule active) qui est une propriété de l’objet ActiveSheet est l'équivalent d'un objet
Range. On dit que cette propriété "renvoie" un objet plage. Les propriétés ou méthodes applicables aux objets
range, le sont à ActiveCell
La propriété Cells( indexligne, indexcolonne ) est une propriété d’une feuille de calcul ou de la feuille active
qui renvoie également un objet plage mais sous la forme d'une seule cellule. L'intérêt est que l'on peut
facilement "variabiliser" les références
Cells(3,5) fait référence à la cellule de la 3° ligne et 5° colonne . équivaut à Range("E3")
Exemple : tracer sur une feuille, le triangle de Pascal (qui correspond à la formule du binôme) pour les 10
premières puissances.
ce qu’il faut savoir : le triangle de Pascal donne les coefficients du binôme aux
puissances de 0 à n. Les éléments de la 1ère colonne sont égaux à 1 ; tous les autres
éléments sont la somme des deux éléments situés dans la ligne qui le précède de la
même colonne et de la colonne précédente. Une case non remplie est équivalente à 0
si k=6 (a+b)6 = a6 +6 a5b + 15a4b2 + 20a3b3 + 15a2b4 + 6ab5 + b6
Les propriétés Cells peuvent être utilisées comme arguments de l'objet range
exemple comment affecter le style italique aux cellules A1: C5 dans la feuille Sheet1.
Worksheets("Sheet1").Activate
Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True
Dans ce cas, les références données par la propriété Cells sont relatives à l’objet et non à la feuille.
Exemple : on nomme P un objet plage de référence B2 :D10 dans la feuille 2 ; ce petit programme fait référence
à la propriété Address d’un objet plage qui renvoie l’adresse, c’est-à-dire les références, de la plage sous la
forme d’une chaîne de caractères
Sub plage()
Dim P As Range
Set P = Range("Feuil2!B2:D10")
P.Cells(3, 2).Select
x = ActiveCell.Address
MsgBox (x) ‘ affichera la reference $C$4
End Sub
J. Soichot 7 2011-2012
Licence Sciences Economiques VBA: cours n° 2
Attention : la propriété Offset renvoie un objet plage ; il faut donc soit lui accoler une propriété , soit une
méthode. la cellule désignée par la propriété offset ne devient pas la cellule active. Pour qu'elle devienne la
nouvelle cellule active, taper
ActiveCell.Offset( 0, 1).Select
Propriété End( direction ) où direction peut prendre les valeurs : xldown, xltoright, xlup, xltoleft
Cet exemple montre comment étendre la sélection de la cellule B4 à la dernière cellule de la ligne 4 contenant des données.
Worksheets("Sheet1").Activate
Range(("B4"),Range("B4").End(xlToRight)).Select
Propriété Address : cette propriété renvoie sous la forme d’une chaîne de caractères l’adresse d’une cellule ou
d’une plage de cellule.
Pour mémoriser l’adresse d’une plage de cellules sélectionnée dans la feuille 2
Dim refcell As String
Sheets(2).activate
Refcell = Selection.Address
‘Pour vérifier le contenu de Refcell, écrire sa valeur dans la cellule A1 de la feuille 1 :
Range(“Feuil1!A1”).Value = refcell
ou faire afficher par MsgBox( refcell )
J. Soichot 8 2011-2012
Licence Sciences Economiques VBA: cours n° 2
Alors que jusqu’à présent on a considéré une plage comme un ensemble de cellules, on peut, avec les
propriétés Rows et Columns la voir comme un ensemble de lignes ou un ensemble de colonnes.
Si P est un objet plage : P.Rows ou P.Columns renvoient ce même objet sous la forme d’ une collection de
lignes ou une collection de colonnes.
La propriété Count permet, comme son nom l’indique de compter le nombre d’éléments constituant un
collection. On utilisera donc P.Rows.Count P.Columns.Count pour designer le nombre de lignes ou le
nombre de colonnes de la plage P
La propriété Formula appliquée à un objet plage permet d’affecter une formule Excel dans une cellule. La
propriété FormulaArray permet de traiter les formules matricielles. La formule est écrite sous la forme d’une
chaîne de caractères a) qui commence par le signe = b) les références de cellules incluses dans la formule sont
données dans le mode RC (équivalent en L1C1) selon les conventions suivantes :
R et C sont les abréviations de Row (ligne), Column (colonne).
La lettre R ou la lettre C suivie d’un n° équivaut à une référence absolue sur la ligne ou la colonne
La lettre R ou la lettre C suivie d’un entier signé placé entre crochets indique une référence relative.
R ou C sans autre indication fait référence à la ligne ou la colonne courante.
Exemple : R3C5 (équivaut à l’adresse absolue de la cellule en 3°ligne et 5°colonne $E$3
R[-2]C4 signifie dans la colonne 4 , 2 lignes avant
R[1]C[1] signifie une ligne plus bas et une colonne plus à droite
Remarque : le plus simple est d’enregistrer la manipulation sous Excel au cours de laquelle vous écrivez la
formule.
ActiveCell.FormulaR1C1 = "=COUNT(RC[-4]:R[448]C[-4])"
Selection.FormulaArray = "=TRANSPOSE(R[-3]C[-1]:R[-1]C[-1])"
Propriétés Columns( index) ou Rows( index)
Ces propriétés font en fait référence à la collection des colonnes ou des lignes d’une feuille ou d’un objet plage.
L’index correspond au n° de la colonne ou de la ligne. Ces propriétés renvoient donc un objet plage (pour un
exemple, voir ci-dessous avec la méthode ClearContents)
J. Soichot 9 2011-2012
Licence Sciences Economiques VBA: cours n° 2
La méthode peut comporter plusieurs arguments qui correspondent aux différents parameters à saisir pour
procéder à une opération de tri.
Range("B1:C102").Select
Selection.Sort Key1:=Columns(3), Order1:=xlAscending, Key2:=Columns(2),
Order2:=xlDescending
D’une façon générale, lorsqu’une méthode comporte des arguments, ceux-ci sont identifies par des noms de
variables prédéfinis; le signe d’affectation := les valeurs affectées peuvent être des objets (par exemple , ci-
dessus, columns(3) est la plage de cellule qui compose la colonne 3, ou des constantes prédéfinies (xlAscending)
ou encore des constantes non prédéfinies.
Exploiter des données d’une feuille de calcul : déplacer ou non la cellule active
Si on veut parcourir des données organisées par exemple en colonne dans une feuille de calcul, il faut bien sûr
savoir repérer la 1ère donnée de la liste puis parcourir la série jusqu’à ce qu’il n’y ait plus de données.
Deux façons de parcourir :
a) on déplace la cellule active
b) on joue sur les indices, sans que cela déplace forcément la cellule active
a) on déplace la cellule active
Exemple : trouver la première cellule vide dans une série en colonne depuis la cellule A1
Sheets("Feuil1").Activate
With ActiveSheet
.Range("A1") . Select
While not IsEmpty(ActiveCell)
ActiveCell.Offset(1) . Select
Wend
End With
Exemple 2 Sheets("Feuil1").Activate
i=1
With ActiveSheet
.cells(i , 1).select
While not isempty(.cells(i , 1))
i = i+1
.cells( i , 1 ). Select
Wend
End With
Lorsque l’exécution du programme sera terminée, vous constaterez que la cellule active est en fin de liste
b) on joue sur les indices, sans que cela déplace forcément la cellule active
Exemple : on sait que la série est dans la colonne 1 ; on ne sait pas où elle commence (il y a des cellules vides au
départ) ni ou elle finit . On souhaite écrire à côté de chaque donnée son logarithme népérient (fonction log( )
Dim i As Integer
i=1
While isempty( Sheets(“Feuil1”).Cells(i,1)
i = i+1
Wend
While not isempty(Sheets(“Feuil1”).cells(iI,1)
Sheets(“Feuil1”).cells(i,2)=log(Sheets(“Feuil1”).cells(i,1))
i = i+1
Wend
Lorsque l’exécution du programme sera terminée, vous constaterez que la cellule active est toujours à la même
place
J. Soichot 10 2011-2012
Licence Sciences Economiques VBA: cours n° 2
Enfin, il doit y avoir une instruction qui affecte le résultat définitif du calcul à la fonction; ARRMUL = x * mul
c'est cette instruction qui renvoie à la feuille de calcul appelante le résultat du calcul.
b) utilisation de la fonction dans une feuille de calcul
J. Soichot 11 2011-2012
Licence Sciences Economiques VBA: cours n° 2
La fonction que nous avons créée fonctionne comme une fonction bien classique. Elle est automatiquement mise
à la fin de la liste des fonctions, mais ici, elle n'appartient qu'au dossier en cours. Dans l'exemple ci-dessus, la
fonction est appelée par la formule de la cellule B5 ; elle fait référence au cellule B2 et B3 qui contiennent
respectivement 1278 et 25.
J. Soichot 12 2011-2012