Médiaforma

All posts in VBAExcel

En programmation, il est souvent nécessaire d’exécuter une portion de code plusieurs fois de suite. La répétition des instructions peut se produire un certain nombre de fois connu à l’avance ou tant qu’une condition est vérifiée. Cet article passe en revue les principales instructions de bouclage du langage VBA.

La boucle For … Next

Lorsque le nombre de répétitions est connu à l’avance, le plus simple est d’utiliser une boucle For … Next. Voici sa syntaxe :

For compteur = début To Fin Step pas

  ' Une ou plusieurs instructions

Next compteur

Compteur est une variable qui commence à début et finit à fin en progressant de pas à chaque itération de la boucle.

Remarque

Si la partie Step pas n’est pas précisée, la variable compteur va de début à fin par pas de 1.

Quelques exemples pour mieux comprendre.

Supposons que vous vouliez remplir les cellules A1 à H1 avec les valeurs 1 à 8. Voici le code à utiliser :

Dim i As Integer

For i = 1 to 8

  Cells(1, i) = i

Next i

Ici, nous utilisons la méthode Cells() en précisant le numéro de ligne et le numéro de colonne. Voici le résultat :

Supposons maintenant que vous vouliez remplir les cellules C3 à C12 avec les valeurs “a” à “j“. Voici le code à utiliser :

Dim i As Integer

For i = 3 To 12

  Cells(i, 3) = Chr(97 + i - 3)

Next i

Ici, nous utilisons la méthode Cells() en précisant le numéro de ligne (i, qui va de 3 à 12) et le numéro de colonne (fixe et égal à 3). La méthode Chr() convertit le code ASCII passé en argument en un caractère. Pour arriver au résultat souhaité, le code ASCII de la lettre “a” a été cherché dans un tableau de codes ASCII. Par exemple sur la page http://www.table-ascii.com/ :

Etant donné que i varie de 3 à 12, la formule à utiliser est 97 + i – 3. L’argument de la fonction Chr() va donc de 97 (pour i = 3) à 106 (pour i = 12).

Voici le résultat :

Supposons maintenant que vous vouliez remplir le bloc de cellules A3-C9 comme ceci :

Comment feriez-vous ?

Observez la progression numérique dans les cellules. Les valeurs vont de 1 à 21, et on change de ligne toutes les trois cellules.

Pour faire simple, nous allons imbriquer deux boucles : une pour les lignes et une pour les colonnes. Voici le code :

Dim i, j As Integer

For i = 0 To 6

  For j = 1 To 3

    Cells(i + 3, j) = j + i * 3

  Next j

Next i

La boucle la plus extérieure s’intéresse aux lignes et la boucle la plus intérieure aux colonnes. Les index des boucles ont été choisis pour simplifier au maximum la formule.

Lors de la première exécution de la boucle extérieure, i vaut 0 et j va de 1 à 3. La formule :

Cells(i + 3, j) = j + i * 3

Cible donc les cellules A3, B3 puis C3. Et la valeur affectée à ces cellules est 1, 2 et 3. Si vous ne voyez pas ce que je veux dire, simulez le fonctionnement de la boucle interne en remplaçant j par 1, 2 puis 3 et voyez le résultat. Vous obtenez :

  • Pour i=0 et j=1 : Cells(3,1) = 1, soit A3 = 1
  • Pour i=0 et j=2 : Cells(3,2) = 2, soit B3 = 2
  • Pour i=0 et j=3 : Cells(3,3) = 3, soit C3 = 3

Lorsque la boucle interne a fini de s’exécuter, la boucle externe incrémente la valeur de i, qui passe de 0 à 1. La formule :

Cells(i + 3, j) = j + i * 3

Cible alors les cellules A4, B4 et C4 et leur affecte (respectivement) les valeurs 4, 5 et 6.

La progression de i et de j se poursuit jusqu’à ce que ces index dépassent les valeurs maximales fixées à 6 et 3. Les deux boucles prennent alors fin et la plage A3-C9 est entièrement remplie.

Un dernier exemple pour illustrer l’utilisation d’un pas de progression. Supposons que vous vouliez obtenir le résultat suivant :

Plusieurs approches sont possibles, mais une des plus simples consiste certainement à utiliser un pas de progression négatif dans la boucle :

Dim i As Integer

For i = 12 To 2 Step -2

  Cells(1, i / 2) = i

Next i

Ici, la variable i passe de 12 à 2 par pas de -2. Elle vaut donc successivement 12, 10, 8, 6, 4, puis 2.

La formule :

Cells(1, i / 2) = i

Cible les cellules situées en ligne 1 et en colonne 6 (12/2), 5 (10/2), 4 (8/2), 3 (6/2), 2 (4/2) puis 1 (2/2). La valeur de i est affectée à ces cellules, ce qui donne bien le résultat attendu.

Dans certaines boucles, on ne sait pas à l’avance combien de fois les instructions seront exécutées. Dans ce cas, la boucle For … Next n’est pas appropriée. Vous utiliserez plutôt une boucle While … Wend, Do While … Loop, Do … Loop While ou Do Until … Loop.

La boucle While … Wend

La boucle While … Wend est exécutée tant qu’une condition est vérifiée. Voici sa syntaxe :

While condition

  ' Une ou plusieurs instructions

Wend

Par exemple, pour remplir les cellules A1 à H1 avec les chiffres 1 à 8 avec une boucle While … Wend, comme dans la copie d’écran suivante :

Vous pourriez utiliser ces instructions :

Dim i As Integer

i = 1

While i < 9

  Cells(1, i) = i

  i = i + 1

Wend

Ces instructions peuvent sembler plus complexes que celles utilisées dans la boucle For … Next équivalente. Examinons-les pas à pas.

  • La variable i est déclarée en tant qu’Integer et initialisée à 1.
  • La boucle se poursuit tant que i est inférieur à 9.
  • Les cellules de la ligne 1 et de la colonne 1 à 8 sont alors ciblées avec la méthode Cells() et on leur affecte la valeur de la variable i, c’est-à-dire 1 à 8.
  • La variable i est incrémentée d’un à chaque passage dans la boucle avec l’instruction i = i + 1.

Vous voyez, il n’y a rien de bien compliqué.

La boucle Do While … Loop

Nous allons maintenant utiliser une boucle Do While … Loop pour obtenir le même résultat que dans la boucle While … Wend précédente. Voici le code utilisé :

Dim i As Integer

i = 1

Do While i < 9

  Cells(1, i) = i

  i = i + 1

Loop

Le code est strictement équivalent. Il n’y a que l’écriture qui change.

La boucle Do … Loop While

Voyons maintenant comment utiliser une boucle Do … Loop While pour obtenir le même résultat. Voici le code utilisé :

Dim i As Integer

i = 1

Do

  Cells(1, i) = i

  i = i + 1

Loop While i < 9

Ici, la condition de fin de boucle est testée en fin de boucle. Quelle que soit la valeur de i, la boucle s’exécute donc au moins une fois. Mis à part cette légère différence, le code est très semblable à celui utilisé dans les boucles précédentes.

La boucle Do Until … Loop

Voyons enfin comment utiliser une boucle Do Until … Loop pour arrive au même résultat. Voici le code utilisé :

Dim i As Integer

i = 1

Do Until i > 8

  Cells(1, i) = i

  i = i + 1

Loop

Ici, le test de fin de boucle est effectué en début de boucle. La boucle prend fin quand i est supérieur à 8 (et non tant que i est inférieur à 9 comme dans les autres boucles). Mis à part ce détail, le code est similaire à celui utilisé dans les autres boucles.

Maintenant que vous connaissez les différentes boucles utilisables en VBA, vous devrez trouver celle qui est la plus appropriée à chaque cas que vous devrez traiter…

Quitter une boucle prématurément

Cet article ne serait pas complet si nous ne parlions pas des sorties prématurées des boucles. Rien de bien sorcier rassurez-vous.

Supposons que lorsqu’une condition est vérifiée, vous vouliez terminer la boucle. Dans ce cas, vous utiliserez une des instructions suivantes :

Boucle Instruction pour sortir de la boucle
For … Next Exit For
While … Wend Exit While
Do While … Loop Exit Do
Do … Loop While Exit Do
Do Until … Loop Exit Do

 


Cet article va vous montrer comment effectuer des tests en VBA.

If Then Else

Il est parfois nécessaire d’exécuter une ou plusieurs instructions lorsqu’une condition est vérifiée, et éventuellement une ou plusieurs autres instructions dans le cas contraire. Pour cela, vous utiliserez une instruction If Then Else.

La syntaxe de l’instruction If Then Else

Voici la syntaxe de l’instruction If Then Else:

If condition Then

  ' Une ou plusieurs instructions

Else

  ' Une ou plusieurs instructions

End If

Le bloc Else ne sera pas nécessaire si une ou plusieurs instructions ne doivent pas être exécutées lorsque la condition n’est pas vérifiée. L’instruction se simplifie :

If condition Then

  ' Une ou plusieurs instructions

End If

Voici un exemple de code :

Dim entier As Integer

entier = 6

If entier = 5 Then

  MsgBox "entier vaut 5"

Else

  MsgBox "entier est différent de 5"

End If

Ici, on définit la variable Integer entier et on lui affecte la valeur 6. Par la suite, on teste si sa valeur est égale à 5 avec une instruction If Then Else. Comme ce n’est pas le cas, une boîte de message s’affiche et indique “entier est différent de 5”.

Les opérateurs de comparaison utilisables dans un test

L’opérateur “=” n’est pas le seul utilisable dans un test If Then Else. Le tableau dresse la liste des opérateurs utilisables.

Opérateur Signification Exemple
= Test d’égalité If a = 12
Test inférieur à If a < 12
<= Test inférieur ou égal à If a <= 12
Test supérieur à if a > 12
>= Test supérieur ou égal à If a >= 12
<>  Test différent de if a <> 12

Ces opérateurs peuvent être appliqués sur :

  • des nombres (Byte, Integer, Long, Currency, Single ou Double) ;
  • des chaînes (String) ;
  • des dates (Date).

Voici quelques exemples :

Dim n As Integer, s As String, d As Date

n = 1.2545

s = "Un peu de texte"

d = "12/08/2110"

If d > "10/05/2020" Then

  MsgBox "pas tout de suite…"

End If

If n = 1.2545 Then

  MsgBox "n est bien égal à 1.2545"

End If

If s > "Un peu" Then

  MsgBox "Au delà de Un peu"

End If

Si vous exécutez ce code, vous serez peut-être surpris, car il affiche les boîtes de dialogue suivantes :

    

La première boîte de dialogue est facile à comprendre. En effet, la date 12/08/2110 est postérieure à 10/05/2020. Le test If d > “10/05/2020” Then est donc vérifié et le message s’affiche.

Par contre, que devrait donner le test If n = 1.2545 Then selon vous ? Etant donné que n a été initialisé à 1.2545 un peu plus haut, le message “n est bien égal à 1.2545 devrait s’afficher. Eh bien non !

Pourquoi d’après vous ?

Tout simplement parce que la variable n a été définie en tant qu’Integer. Lors de son affectation, la valeur décimale a purement et simplement été supprimée.

Remplacez Integer par Single dans cette expression et le test devrait aboutir :

Dim n As Integer, s As String, d As Date

Que pensez-vous du troisième test ? Comment deux chaînes pourraient être comparées avec l’opérateur “>” ? Est-ce que “Un peu de texte” > “Un peu” ?

Selon VBA, oui !

La comparaison de deux chaînes se fait selon un ordre alphabétique. Ainsi :

A < B < E < Z

Mais aussi :

A < Abc < Bcd < Be < Htzert < Huv

Notez que l’instruction Option Compare peut changer les choses lorsque vous comparez des chaînes.

Après cette instruction :

Option Compare Binary

Les caractères sont comparés par rapport à leur représentation binaire. Ainsi :

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Après cette instruction :

Option Compare Text

Les caractères sont comparés sans distinctions entre les majuscules et les minuscules :

(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Comparaison de chaînes avec l’opérateur Like

L’opérateur Like est très puissant. Il permet de comparer une variable String et un modèle. La syntaxe générale de cette instruction est la suivante :

b = s Like modèle

b est une variable Boolean, s est une variable String et modèle est le modèle à appliquer à la chaîne s. Si la variable s correspond au modèle, la variable b est initialisée à True. Elle est initialisée à False dans le cas contraire.

Le modèle peut contenir un ou plusieurs caractères quelconques (des lettres, des chiffres ou des signes), mais aussi des caractères de remplacement :

Caractère de remplacement Signification
? Un caractère quelconque
* zéro, un ou plusieurs caractères quelconques
# Un chiffre quelconque
[A-Z] Une lettre majuscule quelconque
[A-CT-Z] Une lettre majuscule comprise entre A et C ou entre T et Z
[A-Za-z0-9] Une lettre majuscule ou minuscule quelconque ou un chiffre
[!G-J] Une lettre majuscule différente de G, H, I et J

Par exemple, pour tester si la cellule B5 contient un nombre composé de 5 chiffres, vous utiliserez le modèle “#####“. Voici ce que vous pourriez écrire :

Dim n As Integer

n = Range("B5")

MsgBox n

If n Like "#####" Then

  MsgBox "Vous avez bien entré un nombre à 5 chiffres"

Else

  MsgBox "Vous n'avez pas entré un nombre à 5 chiffres"

End If

Opérateurs logiques

Pour compléter vos tests, vous pouvez également utiliser des opérateurs logiques :

Opérateur logique Signification Exemple
And Et logique If a=5 And b<12 Then
Or Ou logique If a=5 Or b<12 Then
Not Non logique If Not (a = 6) Then
Is Comparaison de deux objets VBA If Worksheets(1) Is Worksheets(2)

Test multiple Select Case

Supposons qu’une variable v puisse prendre plusieurs valeurs et que vous deviez effectuer un traitement spécifique pour chaque valeur. Dans ce cas, l’instruction If Then Else n’est pas appropriée. Vous utiliserez plutôt cette instruction :

If v = valeur1 Then

  ' Traitement 1

ElseIf v = valeur2 Then

  ' Traitement 2

ElseIf v = valeur3 Then

  ' Traitement 3

ElseIf v = valeur4 Then

  ' Traitement 4

ElseIf v = valeur5 Then

  ' Traitement 5

Else

  ' Traitement 6

End If

Si vous devez tester trois ou plus de trois valeurs, je vous conseille d’utiliser une instruction Select Case à la place du If Then ElseIf. Le test précédent devient donc :

Select Case v

  Case valeur1

    ' Traitement1

  Case valeur2

    ' Traitement2

  Case valeur3

    ' Traitement3

  Case valeur4

    ' Traitement4

  Case valeur5

    ' Traitement5

  Case Else

    ' Traitement6

End Select

Voici quelques exemples de l’instruction Case :

Case 5 'La valeur numérique 5

Case 10 To 20 'Entre 10 et 20

Case Is > 20 'Supérieur à 20

Case "a" 'La chaîne "a"

Case "a", "b", "c" ' La chaîne "a", "b" ou "c"

Attention

Avec les opérateurs <, > et <>, vous devez utiliser un Case Is et non un Case.

Les traitements peuvent être des instructions VBA quelconques. Par exemple :

a = 5 ' Affectation de la valeur 5 à la variable a

MsgBox "texte" ' Affichage d'une boîte de message

Sheets("Feuil2").Activate 'Activation de la feuille Feuil2

Vous pouvez également utiliser une instruction pour faire une pause dans l’exécution ou pour l’arrêter :

Stop ' Arrêt sur cette instruction

End ' Fin du code

En VBA Excel, les couleurs peuvent être choisies dans un panel de 56 couleurs prédéfinies ou créées en mélangeant une certaine quantité des trois couleurs primaires : rouge, vert et bleu.

Utilisation des couleurs prédéfinies

Les 56 couleurs de base sont représentées dans cette copie d’écran :

Pour affecter une de ces couleurs au texte ou à l’arrière-plan de la sélection ou de la cellule active, vous utiliserez ces expressions :

Range("A10").Select 'Sélection de la cellule A10

Selection.Interior.ColorIndex = 4 'Arrière-plan de couleur 4

Selection.Font.ColorIndex = 26 'Police de couleur 26

Range("A12").Activate 'Activation de la cellule A12

ActiveCell.Interior.ColorIndex = 4 'Arrière-plan de couleur 4

ActiveCell.Font.ColorIndex = 26 'Police de couleur 26

Utilisation des couleurs RGB

La couleur du texte ou de l’arrière-plan peut être définie avec la fonction RGB() :

RGB(rouge, vert, bleu)

rouge, vert et bleu sont la quantité de rouge de vert et de bleu qui constituent la couleur. Ces trois valeurs doivent être comprises entre 0 et 255. La valeur 0 signifie que la couleur est absente. La valeur 255 signifie que la couleur est maximale.

Etant donné que chacune de ces composantes peut prendre 256 valeurs, la fonction RGB() donne accès à 256*256*256 couleurs, soit 16 777 216 couleurs !

Voici quelques exemples :

Valeur Couleur
RGB(0,0,0) Noir
RGB(255,255,255) Blanc
RGB(255,0,0) Rouge
RGB(0,255,0) Vert
RGB(0,0,255) Bleu

Comment feriez-vous pour définir un gris ?

Pour cela, vous devez prendre la même quantité pour chaque couleur primaire.

Vous pourrez ainsi définir 256 niveaux de gris, depuis le gris très foncé (noir) défini par RGB(0,0,0) au gris très clair (blanc) défini par RGB(255,255,255). Vous définirez par exemple un gris foncé avec RGB(50,50,50) et un gris clair avec RGB(200,200,200).

Pour affecter une couleur de texte ou d’arrière-plan à la sélection ou à la cellule active, vous utiliserez des instructions de ce type :

Range("A10").Select 'Sélection de la cellule A10

Selection.Interior.Color = RGB(255,0,0) 'Arrière-plan de couleur rouge

Selection.Font.Color = RGB(0,255,0) 'Police de couleur verte

Range("A12").Activate 'Activation de la cellule A12

ActiveCell.Interior.Color = RGB(255,0,0) 'Arrière-plan de couleur rouge

ActiveCell.Font.Color = RGB(0,255,0) 'Police de couleur verte

La méthode Range() cible une cellule ou une plage de cellules. Dans un article précédent, vous avez appris à modifier le contenu de cette ou de ces cellules via la propriété Value.

Si vous voulez ne modifier qu’une des cellules sélectionnées, vous devez au préalable l’activer avec la méthode Activate et lui affecter une valeur avec ActiveCell.Value. Par exemple, ces instructions sélectionnent la plage A2:C5, activent la cellule B4, affectent la valeur 10 aux cellules sélectionnées et la valeur 20 à la cellule active :

Range("A2:C5").Select

Range("B4").Activate

Selection.Value = 10

ActiveCell.Value = 20

Voici le résultat de ces instructions :

Sur la plage de cellules sélectionnée ou sur la cellule active, vous pouvez modifier (entre autres) :

  • La couleur d’écriture avec Color
  • La couleur d’arrière-plan avec Color
  • L’alignement horizontal avec HorizontalAlignment
  • La police de caractères avec Name
  • Les attributs gras et italique en affectant la valeur True aux propriétés Bold et Font.Italic

Voici quelques exemples de code :

Range("A2:C5").Select 'Sélection de la plage A2:C5

Selection.Interior.Color = RGB(255, 0, 0) ' Arrière-plan rouge sur la sélection

Selection.HorizontalAlignment = xlCenter 'Centrage horizontal de la sélection

Selection.Font.Name = "Courier" ' Police Courier sur la sélection

Selection.Font.Bold = True 'Sélection en gras

Selection.Font.Italic = True 'Sélection en italique

Toutes ces instructions fonctionneraient également sur la cellule active :

Range("B5").Activate 'Sélection de la cellule B5

ActiveCell.Interior.Color = RGB(255, 0, 0) 'Arrière-plan de la cellule active

ActiveCell.HorizontalAlignment = xlLeft 'Alignement de la cellule active

ActiveCell.Font.Name = "Algerian" ' Police de la cellule active

ActiveCell.Font.Bold = True ' Cellule active en gras

ActiveCell.Font.Italic = True ' Cellule active en italique

Pour éviter d’avoir à répéter Selection ou ActiveCell, vous pourriez factoriser ces deux objets.

Ce qui donnerait avec Selection :

Range("A2:C5").Select

With Selection

  .Interior.Color = RGB(255, 0, 0)

  .HorizontalAlignment = xlCenter

  .Font.Name = "Courier"

  .Font.Bold = True

  .Font.Italic = True

End With

Et avec ActiveCell :

Range("B5").Activate

With ActiveCell

  .Interior.Color = RGB(0, 255, 0)

  .HorizontalAlignment = xlLeft

  .Font.Name = "Algerian"

  .Font.Bold = True

  .Font.Italic = True

End With

Depuis la sortie d’Excel 2007, les classeurs peuvent être stockés avec une extension xlsx, xlsm ou xlsb.

  • Les fichiers xlsx ne peuvent pas contenir du code VBA.
  • Les fichiers xlsm peuvent contenir du code VBA.
  • Les fichiers xlsb (classeurs Excel binaire) peuvent contenir ou ne pas contenir du code VBA. Contrairement aux deux autres formats de fichiers, ils sont compressés et prennent donc moins de place sur le disque.

En ce qui concerne cette série d’articles, vous sauvegarderez vos classeurs au format xlsm, sans quoi, le code VBA ne sera pas mémorisé.


Lorsque vous utilisez Excel, vous sélectionnez fréquemment des cellules et des plages de cellules. Eh bien, VBA est en mesure d’effectuer les mêmes sélections.

Sélection d’une cellule

Deux fonctions peuvent être utilisées : Cells() et Range(). Leur syntaxe est très différente. A vous de décider quelle est celle qui vous convient le mieux.

Par exemple, cette instruction sélectionne la cellule à l’intersection de la ligne 4 et de la colonne 1 :

Cells(4,1).Select

Ou encore, cette instruction sélectionne la cellule A4, qui se trouve à l’intersection de la ligne 4 et de la colonne 1 :

Range("A4").Select

Sélection d’une plage de cellules

La fonction Range peut également être utilisée pour sélectionner une plage de cellules. Par exemple, cette instruction sélectionne les cellules A4 à G12 :

Range("A4:G12").Select

Sélection de plusieurs plages de cellules

La fonction Range() permet également de sélectionner plusieurs plages de cellules. Par exemple, pour sélectionner les cellules A4 à B5 et les cellules B9 à D11, vous utiliserez cette instruction :

Range("A4:B5,B9:D11").Select

Sélection d’une plage de cellules nommées

Lorsqu’une plage de cellules est nommée, vous pouvez la sélectionner en précisant son nom dans la fonction Range(). Supposons que la plage de cellules A8:E8 ait pour nom resultats. Pour la sélectionner en VBA, vous utiliserez cette instruction :

Range("resultats").Select

Pour que cette instruction fonctionne, la plage resultats doit avoir été définie, sans quoi, une erreur se produira à l’exécution :

Le nom de la plage n’est pas sensible à la casse des caractères. Les instructions suivantes sont dont tout aussi valables pour sélectionner la plage A8:E8 :

Range("Resultats").Select

Range("RESULTATS").Select

Sélection de lignes et de colonnes

Les fonctions Rows() et Colums() permettent de sélectionner une ou plusieurs lignes et colonnes. Par exemple, pour sélectionner la colonne C, vous écrirez :

Columns("C").Select

Pour sélectionner les colonnes C à G, vous écrirez :

Columns("C:G").Select

D’une façon similaire, pour sélectionner la ligne 3, vous écrirez :

Rows("3").Select

Ou encore, pour sélectionner les lignes 3 à 7, vous écrirez :

Rows("3:7").Select

Sélection de lignes et de colonnes disjointes

Supposons que vous vouliez sélectionner les lignes 4, 9 et 10. Vous pouvez tenter quelque chose comme ceci :

Rows("4,9,10").Select

Pas de chance, cette instruction produit une erreur à l’exécution :

Vous utiliserez plutôt la fonction Range() :

Range("4:4,9:10").Select

De même, supposons que vous vouliez sélectionner les colonnes B, D et F à H, vous utiliserez cette instruction :

Range("B:B,D:D,F:H").Select

Sélection de toute la feuille de calcul

Pour sélectionner toutes les cellules de la feuille de calcul, vous utiliserez cette instruction :

Cells.Select

Pour vous représenter physiquement un objet Excel, imaginez que vous avez devant vous une boîte noire dont vous ne pouvez pas voir l’intérieur. Par contre, vous avez une documentation qui décrit les caractéristiques (on parle de propriétés) de l’objet. A l’aide de cette documentation, vous avez donc une vue globale de l’objet, sans pour autant en connaitre les mécanismes. Mais après tout, c’est bien ce que vous voulez : utiliser Excel et pas comprendre comment il a été programmé !

Certaines propriétés sont accessibles en lecture seulement. D’autres en lecture et en écriture.

Vous utiliserez les premières pour connaitre la valeur de telle ou telle propriété. Vous utiliserez les secondes pour connaitre, mais aussi pour modifier les propriétés de l’objet.

Pour sélectionner l’objet ou les objets sur lesquels vous voulez lire ou modifier une propriété, vous utiliserez des méthodes. Par exemple, la méthode Workbooks(“classeur1.xlsm”) sélectionne le classeur classeur1.xlsm. Ou encore, la méthode Range(B3-B5) sélectionne la plage de cellules B3 à B5.

Pour utiliser une méthode, vous devez la plupart du temps faire référence à son parent. Par exemple, vous ne pouvez pas utiliser la méthode Range() sans préciser la feuille de calcul concernée. De même, vous ne pouvez pas utiliser la méthode Worksheets() sans préciser le classeur concerné. Par contre, lorsque vous sélectionnez un classeur, il n’est pas nécessaire d’indiquer son parent Application : cette liaison est implicite. La liaison parent-enfant se fait à l’aide d’une simple énumération, de la gauche vers la droite, de l’ancêtre le plus éloigné jusqu’à l’objet que vous voulez utiliser. L’expression se termine généralement par une propriété à laquelle vous affectez une valeur ou dont vous voulez connaitre la valeur.

Par exemple, dans cette expression :

Workbooks("classeur1.xlsm").Worksheets("Feuil1").Range("C8") = "J’ai tout compris"
  • Workbooks(“classeur1.xlsm”) sélectionne le classeur classeur1.xlsm ;
  • Worksheets(“Feuil1”) sélectionne la feuille Feuil1 dans le classeur classeur1.xlsm ;
  • Range(“C8”) sélectionne la cellule C8 dans la feuille Feuil1 du classeur classeur1.slsm ;
  • = “J’ai tout compris” affecte une valeur texte à la cellule C8 de la feuille Feuil1 du classeur classeur1.slsm.

Vous voyez, il n’y a rien de bien compliqué.

Le tout est de connaitre :

  • la hiérarchie des objets pour pouvoir les interconnecter dans une expression « à points » ;
  • les méthodes et les propriétés des différents objets.

Les articles à venir vont progressivement vous familiariser avec les objets et les propriétés utilisables en VBA Excel, jusqu’à ce que vous vous sentiez « chez vous ». L’objectif sera alors atteint et il ne vous restera plus qu’à manipuler toutes ces entités pour faire des merveilles dans votre tableur !

La propriété Value d’un objet Range

Pour bien comprendre les mécanismes de base du VBA, raisonnons sur un exemple pratique.

La propriété Value d’un objet Range permet d’accéder en lecture et en écriture aux cellules concernées. Par exemple, l’instruction suivante affecte la valeur numérique 35 à la cellule C8 de la première feuille de calcul du classeur Classeur1.xlsm :

Workbooks("Classeur1.xlsm").Worksheets(1).Range("C8").Value = 35

La méthode Range() permet d’accéder à une cellule ou à une plage de cellules. Par exemple, pour affecter la valeur texte « bonjour » à la plage de cellules A1-C3, vous utiliserez cette instruction :

Workbooks("Classeur1.xlsm").Worksheets(1).Range("A1 :C3").Value = "bonjour"

Vous voulez savoir ce qui se trouve dans la cellule A2 ? Utilisez cette instruction :

Dim texte As String

texte = Workbooks("Classeur1.xlsm").Worksheets(1).Range("A2").Value

Vous pourrez par la suite affecter à une autre cellule la valeur lue dans la cellule A2. Par exemple, à la cellule A3 :

Workbooks("Classeur1.xlsm").Worksheets(1).Range("A3").Value = texte