Formation Excel et VBA

Suite de la programmation VBA pour Excel Leçon 2

Si vous avez suivi le premier article de cette formation vous pouvez continuer celle-ci à la suite sinon cliquez sur retour à la première leçon



Nous allons maintenant comprendre le fonctionnement des lignes de codes créées par Excel

Ouvrir le fichier Excel précédemment créé, ClasseurVBA.xlsm.
Ouvrir notre éditeur Visual Basic
Faire un double-clic sur Module1 dans la colonne de gauche pour afficher le code.
Nous avons créé deux "programmes" MaMacro1 qui crée les informations sur notre feuille Excel et MaMacroEffacer qui les efface.
Ces deux programmes apparaissent sur notre page en deux zones séparées par un trait. Si on prend notre premier programme il apparait écrit de la manière suivante :
Sub MaMacro1()
Puis les lignes de code
Et se termine par 
End Sub
Sub et End Sub sont écrits en bleu - Ce sont des mots clés, c'est à dire qu'ils font parties des éléments de base du langage VBA et qu'ils ne sont pas utilisables tel quel dans l'écriture d'un programme. 
Dans notre cas, le mot Sub signifie que le nom qui suit désigne un programme fonctionnel, et pour marquer la fin de ce programme nous écrirons la séquence : End Sub.
Dernière remarque sur notre programme, certaines lignes apparaissent en vert et commencent par une apostrophe. C'est une façon d'indiquer à notre programme que le contenu de cette ligne est juste pour information et qu'il ne doit pas s'en préoccuper...
Nous allons écrire un premier programme pour comprendre comment la machine fonctionne. 
Posons déjà sur le papier les actions que nous voulons faire :
- Sélectionner la cellule D12
- La remplir avec une valeur 1000
- Descendre d'une ligne (nous serons donc en D13)
- Mettre la valeur 2 dans la nouvelle cellule
- Descendre d'une ligne
- Donner à la nouvelle cellule la valeur du résultat de la multiplication entre D12 et D13
- Mettre le résultat en gras, texte rouge et cellule encadrée bleu sur fond jaune.
Nous allons dans un premier temps écrire ce programme comme il nous parait logique de le faire.

Créons et appelons ce programme calculCellule

Pour cela sur notre page de code en dernière ligne tapons sub calculCellule
Déjà on remarque que VBA a mis d'office une majuscule à "sub", qu'il a mis une parenthèse après le nom de notre programme (nous verrons par la suite pourquoi) et que notre programme se terminera par End Sub qui a été placé aussi par VBA.
Pour que notre programme fonctionne il nous faut maintenant l'écrire ENTRE ces deux lignes.
Première action, nous voulons sélectionner la cellule D12.
Nous avons vu sur la première ligne de notre première macro comment sélectionner une cellule ou un plage de cellule avec le mot Range alors lançons-nous...
Taper Range( nous voyons immédiatement s'inscrire en dessous des informations qui vont nous aider dans notre travail ; ici Range(Cell1,[cell2]) As Range.
Explication : après la première parenthèse, le programme attend deux informations, la référence de la première cellule (si on s'arrête là il n'y en aura qu'une de sélectionnée) et la référence éventuelle (crochet) de la dernière cellule de la plage qui nous intéresse.
Dans notre cas nous avons besoin d'une seule cellule la D12.
Nous écrivons donc Range("D12") - (Pour plusieurs cellules on écrirait Range("D12:F12")
Les guiillemets sont obligatoires pour indiquer au programme qu'il s'agit d'une référence et non d'une valeur.
Tapons ensuite un point après la deuxième parenthèse.
Une liste déroulante s'affiche qui représente l'ensemble des propriétés qui sont applicables à notre cellule D12.
Nous voilà dans un premier tournant de notre cours car l'essentiel de l'art de programmer se trouve là :
Nous créons des objets (dans ce cas la cellule), objet reconnu par VBA en tant que tel (cellule) et donc à qui il attribue toute une série de propriété dont nous allons pouvoir disposer.
Dans un premier temps déroulons cette liste pour récupérer la valeur Select par double clic ou tab. Notre ligne de code devient Range("D12").Select
Dans cette cellule nous voulons écrire le chiffre 1000
Dans notre code initial nous avons une ligne de code qui dit :
Activecell.formulaR1C1 =....
Dans l'immédiat cherchons plus simple :
Notre cellule étant sélectionnée, elle est la cellule active et nous pouvons écrire :
ActiveCell et taper un point qui affiche un nouveau menu déroulant des propriétés de la cellule active. Dans cette liste cherchons la propriété Value et sélectionnons là et complétons.
ActiveCell.Value = 1000

Pour aller plus loin nous allons nous poser une question fondamentale

Nous voulons sélectionner la cellule D13.
De fait ce qui nous intéresse c'est de sélectionner la cellule en dessous de notre première sélection.
Si nous décidions de changer la première cellule choisi par une autre par exemple G20, nous ne voulons pas que notre deuxième sélection soit toujours D13 mais soit G21 !
Et nous ne voulons pas ré-écrire notre programme chaque fois que la cellule initiale change.
Nous allons donc continuer le code en nous servant non plus des références de cellules mais de leurs positions par rapport à notre cellule initiale.
Pour nous la cellule D13 est celle en dessous de l'origine, notre code doit dire qu'il faut activer la cellule en dessous :
Tapons ActiveCell. et dans la liste déroulante positionnons-nous sur Offset, double clic et tapons une parenthèse qui nous ouvre la fenêtre d'aide.
Le programme attend de nous deux informations, numériques, le nombre de lignes puis le nombre de colonnes dont il faut se déplacer. Dans notre cas nous voulons descendre d'une ligne en restant dans la même colonne nous indiquons donc (1,0) après Offset.
Nous disons ainsi au programme de se placer sur la cellule en dessous mais pour pouvoir l'utiliser faut-il encore activer cette cellule et pour cela après Offset(1,0) tapons un point et choisissons Activate dans la liste.
Notre cellule est prête à l'emploi.
(A noter que la propriété Offset demande des valeurs numériques, ainsi notre déplacement vers le haut et vers la gauche s'écrirait Offset(-1,-2) pour remonter d'une ligne et nous déplacer de deux colonnes vers la gauche)
Sur la ligne suivante du code mettons y la valeur 2 : ActiveCell.value = 2
(A ce stade vous pouvez tester le travail en cliquant sur la flèche verte dans la barre de menu - si le curseur est bien dans vos lignes de codes et vous regardez sur votre feuille Excel le résultat).
Passons à la multiplication !
Dans notre code témoin initial nous avions une opération enregistrée à la ligne ActiveCell.FormulaR1C1 = "=RC[......
Nous allons oublier aussi cette manière d'écrire une commande d'opération et nous intéresser à la notion de variable.
Un chapitre entier du cours sera concerné par cette notion primordiale dans le développement d'application mais nous allons d'ors et déjà définir quelques manières d'utiliser des variables.
Nous avons vu que pour attribuer une valeur à une cellule nous utilisions la propriété value.
l'idée générale des variables est de stocker à l'instant t la valeur d'une cellule pour la conserver en mémoire et l'utiliser par la suite, même si entre temps la valeur de la cellule à changée.
Dans notre exemple ce ne sera pas le cas mais nous verrons que le problème se posera souvent.
Nous allons créer deux variables à l'intérieur de notre programme, Montant1 et Montant2.
Ces variables devront être numériques puisque nous voulons faire des calculs avec.
Dans notre code et juste en dessous de la ligne Sub on va écrire :
Dim Montant1 as (avec un espace après as) qui va nous ouvrir un menu déroulant où nous allons chercher la propriété "Double". Pour indiquer que cette variable est numérique de type nombre double...
Puis à la ligne et Dim Montant2 as Double.
On peut simplifier l'instruction avec la ligne : Dim Montant1 As Double, Montant2 As Double.
Dans notre code on pourra intégrer les deux lignes suivantes :
Montant1=ActiveCell.value
Et 
Montant2= ActiveCell.value
A placer au bon endroit (voir sur l'image le résumé)
Il nous reste à nous positionner sur la cellule en dessous et de lui indiquer la valeur à rentrer avec les lignes suivantes :
ActiveCell.offset(1,0).Activate
ActiveCell.Value = Montant1*Montant2
Le reste de notre programme doit être un jeu d'enfant puisqu'il s'agit de rechercher les propriétés texte en gras, texte en rouge et fond en jaune de notre activecell...

Pour les bordures ... je vous ai mis le code que je vous laisse le soin de décrypter...car il n'existe pas de propriété pour le cadre de la cellule il faut donc procéder côté par côté...
Cela donnerai ceci :
 

Téléchargez le fichier Excel exemple ci dessous

Suite de la programmation VBA pour Excel Leçon 2
classeurvba.xlsm ClasseurVBA.xlsm  (17.37 Ko)

Leçon 3 à venir :

Accéder à la leçon 3 >>>>>>>>>