Médiaforma

All posts in VBAExcel

Un tableau est une variable qui peut contenir plusieurs valeurs. Les différentes valeurs mémorisées sont accédées par leur indice.

Pour déclarer un tableau, vous utiliserez le mot-clé Dim. Ici par exemple, nous définissons un tableau d’entiers T qui peut contenir 26 valeurs, accessibles par les indices 0 à 25 :

Dim T(25) As Integer

Remarque

Si vous avez du mal avec l’indice des tableaux qui commence à 0, vous pouvez déclarer l’instruction suivante au début du module pour que l’indice du premier élément de tous les tableaux définis dans le module soit toujours 1 :

Option Base 1

Pour affecter la valeur 5 à la première case du tableau, vous utiliserez cette instruction :

T(0) = 5

Pour afficher dans la cellule C2 le contenu de la première case du tableau, vous utiliserez cette instruction :

Cells(2,3) = T(0)

La cellule C2 affichera donc la valeur 5.

Définition et remplissage d’un tableau

Vous pouvez définir le contenu des cases d’un tableau avec la fonction Array(). Pour pouvoir utiliser cette fonction, le tableau doit avoir au préalable été déclaré de type Variant.

Par exemple, pour définir le tableau Prenom et lui affecter les trois prénoms suivants : Lio, Eric et Kévin, vous utiliserez les instructions suivantes :

Dim Prenom As Variant

Prenom = Array("Lio", "Eric", "Kévin")

Redimensionnement d’un tableau

Il est toujours possible de redimensionner un tableau en utilisant le mot-clé Redim.

Supposons que nous voulions ajouter une case au tableau Prenom précédent. Ce tableau comporte 3 cases. L’instruction à utiliser sera donc la suivante :

Redim Prenom(4)

Par défaut, le redimensionnement d’un tableau entraine la perte des données qui y étaient stockées. Pour éviter de perdre les trois prénoms du tableau Prenom, vous utiliserez le mot-clé Preserve :

Redim Preserve Prenom(3)

Vous pourrez alors ajouter un quatrième prénom au tableau :

Prenom(3) = "Michel"

Affichez les quatre prénoms pour vous assurer que le redimensionnement n’a rien écrasé :

Cells(1,1) = Prenom(0)

Cells(1,2) = Prenom(1)

Cells(1,3) = Prenom(2)

Cells(1,4) = Prenom(3)

Voici le résultat :

Tableaux multidimensionnels

Pour en terminer avec les tableaux, sachez qu’il est possible de définir des tableaux multidimensionnels. Pour cela, il suffit de définir les indices maximaux de chaque dimension lors de la définition du tableau. Ici par exemple, nous définissons un tableau à 3 dimensions :

Dim T(2,3,5) As Integer

Ce tableau contient 2*3*5 cases, soit 30 cases. Par exemple, pour affecter la valeur 12 à la première case du tableau, vous utiliserez cette instruction :

T(0,0,0) = 12

Les variables sont généralement déclarées avec le mot-clé Dim. Cependant, dans certains cas, il peut être utile de les déclarer avec le mot-clé Static.

Lorsqu’une variable est déclarée avec le mot-clé Static dans une procédure ou une fonction, sa valeur est conservée à la fin de la procédure ou la fonction. Lorsque la procédure ou la fonction est à nouveau exécutée, la variable Static reprend la valeur qui avait été mémorisée.

Voici un exemple de code pour mieux comprendre le fonctionnement des variables Static :

Sub Incremente()

  Static i As Integer

  i = i + 1

  Cells(i, 2) = i

End Sub

Ici, la variable Static i de type Integer est définie dans la procédure Incremente().

Lors de la première exécution de la procédure :

  • La variable i vaut 0.
  • La deuxième instruction incrémente la variable i. Elle vaut donc 1.
  • La troisième instruction affiche la valeur de i dans la cellule à l’intersection de la ligne i et de la deuxième colonne. La cellule B1 contient donc la valeur 1.

Lors de la deuxième exécution de la procédure :

  • Comme la variable i est statique, elle conserve la valeur qu’elle lors de la première exécution : 1.
  • La deuxième instruction l’incrémente. Elle vaut donc 2.
  • La troisième instruction affiche la valeur de i (2) dans la cellule à l’intersection de la ligne i (2) et de la deuxième colonne. La valeur 2 apparait donc dans la cellule B2.

Ainsi de suite. Ici, le code a été exécuté 6 fois. Voici le résultat :


Variables

Les variables sont utilisées pour mémoriser des données. Comme leur nom l’indique, leur contenu pourra varier tout au long du code.

Vous pouvez déclarer vos variables au début d’un module, d’une procédure ou d’une fonction. Dans le premier cas, les variables déclarées pourront être utilisées dans toutes les procédures et fonctions du module. Dans les deuxième et troisième cas, leur portée sera limitée à la procédure ou la fonction dans laquelle vous les avez définies.

Vous pouvez utiliser plusieurs types de variables en VBA. Nous les avons résumées dans le tableau suivant :

Nom Type Détails
Byte Numérique Nombre entier compris entre 0 et 255
Integer Numérique Nombre entier compris entre -32 768 et 32 767
Long Numérique Nombre entier compris entre – 2 147 483 648 et 2 147 483 647
Currency Numérique Nombre à décimale fixe compris entre
-922 337 203 685 477.5808 et 922 337 203 685 477.5807
Single Numérique Nombre à virgule flottante compris entre
-3.402823E38 et 3.402823E38
Double Numérique Nombre à virgule flottante compris entre
-1.79769313486232D308 et 1.79769313486232D308
String Texte Texte
Date Date Date et heure
Boolean Boolean True (vrai) ou False (faux)
Object Objet Objet Microsoft
Variant Tous Type par défaut la variable n’est pas déclarée

Pour définir une variable, vous utiliserez l’instruction Dim :

Dim entier As Integer

Dim texte As String

Dim booleen As Boolean

Vous pouvez définir plusieurs variables sur une seule ligne en les séparant par des virgules :

Dim v1 As Integer, c1 As String, r As Double

Lorsqu’une variable a été définie, vous pouvez lui affecter une valeur :

entier = 5

texte = "une chaîne"

r = 3.1415926536

Constantes

Lorsqu’une variable doit avoir une valeur qui ne change pas dans un module, elle est définie avec le mot-clé Const :

Const s As String = "une constante texte"

Const n As Integer = 12

Il faut bien attaquer le langage VBA quelque part. Alors, nous allons partir sur des choses simples. Si vous connaissez déjà un autre langage de programmation, votre apprentissage en sera d’autant facilité. Dans le cas contraire, n’ayez crainte, vous vous en sortirez haut la main !

Commentaires

Les commentaires tout d’abord. Peut-être avez-vous remarqué les lignes en vert dans la macro DateLongue :

Ces lignes commencent par une apostrophe. Il s’agit de commentaires. Notez que les commentaires ne commencent pas obligatoirement au début d’une ligne : vous pouvez les placer à la suite d’une instruction, comme ici :

Si vous voulez définir un commentaire sur plusieurs lignes, vous devrez faire commencer chaque ligne par une apostrophe.

Il est parfois nécessaire de commenter plusieurs lignes qui contiennent des instructions VBA. Sélectionnez ces lignes, puis cliquez sur l’icône Commenter bloc dans la barre d’outils Edition :

Inversement, pour décommenter une ou plusieurs lignes, sélectionnez-les puis cliquez sur l’icône Ne pas commenter bloc dans la barre d’outils Edition :

Remarque

Si la barre d’outils Edition n’est pas affichée, déroulez le menu Affichage, pointez Barres d’outils et cliquez sur Edition.


Les fonctions sont définies par le mot-clé Function :

Function Nom(Param1 as Type1, Param2 as Type2, … ParamN as TypeN)

  ' Une ou plusieurs instructions

  Nom = Valeur

End Function

Ici :

  • Nom est le nom de la fonction ;
  • Param1 à ParamN sont les paramètres passés à la fonction ;
  • Type1 à TypeN sont les types des paramètres Param1 à ParamN;
  • Valeur est la valeur qui doit être retournée par la fonction. S’il s’agit d’une valeur chaîne, pensez à l’entourer par des guillemets.

Pour l’instant, nous allons nous intéresser au type Integer. Ce type caractérise les nombres entiers compris entre -32 768 et 32 767. Dans une section à venir, vous apprendrez quels sont les types utilisables en VBA.

Pour prendre un exemple très simple, nous allons définir la fonction Surface() qui calcule la surface d’un rectangle à partir de ses deux arguments : la longueur et la hauteur du rectangle.

Function Surface(longueur As Integer, hauteur As Integer)

  Surface = longueur * hauteur

End Function

Nous allons supposer que la longueur et la hauteur du rectangle se trouvent dans les cellules A2 et B2 :

Pour afficher la surface du rectangle dans la cellule C2, nous allons définir la procédure CalculSurface() :

Sub CalculSurface()

  Range("C2").Value = Surface(Range("A2").Value, Range("B2").Value)

End Sub

Ce code est très simple. La valeur des cellules A2 et B2 est lue dans la propriété Value des objets Range(« A2 ») et Range(« B2 »). Ces deux valeurs sont passées en argument de la fonction Surface(). Le résultat retourné par la fonction Surface() est copié dans la cellule C2 à l’aide de la propriété Value de l’objet Range(« C2 »).

Voici le résultat :


Lorsque vous définissez une macro avec l’enregistreur de macros, Excel crée une procédure, lui donne le nom de la macro et la stocke dans le module attaché au classeur. Nous allons vérifier que l’inverse est également vrai. En d’autres termes, que si vous définissez une procédure en VBA, elle est accessible sous la forme d’une macro.

Une première procédure

A titre d’exemple, vous allez utiliser le code suivant dans le module attaché au classeur :

Sub EnRouge()

'

' Arrière-plan rouge

'

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

End Sub

La procédure s’appelle EnRouge. Elle utilise la fonction RGB() pour affecter la couleur rouge (RGB(255,0,0)) à l’arrière-plan (Interior.Color) des cellules sélectionnées (Selection).

Vous voyez, il n’y a rien de bien compliqué. Le tout est de connaitre les termes à utiliser et de les utiliser dans le bon ordre.

La fonction RGB() ne vous dit peut-être rien. Dans ce cas, sachez qu’il s’agit d’une fonction qui se retrouve dans la plupart des langages de programmation. Elle définit une couleur par ses composantes Red (rouge), Green (vert) et Blue (bleu).

La « force » de chaque composante est donnée par un nombre entier compris entre 0 et 255. Si une composante vaut 0, la couleur correspondante n’est pas du tout présente. Inversement, si une composante vaut 255, la couleur correspondante est présente à 100%. Et entre les valeurs 0 et 255, la quantité de couleur va croissante.

En extrapolant, il est facile de comprendre que vous disposez de 256 niveaux de rouge, de 256 niveaux de vert et de 256 niveaux de bleu. Ce qui représente 256 x 256 x 256 = 16 777 216 couleurs. Un peu plus de 16 millions de couleurs : il y a de quoi faire !

Rassurez-vous, il n’est pas nécessaire de connaitre toutes les valeurs des composantes RVB. Pour définir une couleur, vous utiliserez une application graphique quelconque : PhotoFiltre par exemple si vous êtes sous Windows (Vous trouverez des formations vidéo à PhotoFiltre sur cette page : https://www.mediaforma.com/photofiltre/).

Lancez PhotoFiltre, cliquez sur la couleur d’avant-plan ou d’arrière-plan dans la palette d’outils (1), déplacez le signe Plus dans la palette (2) et choisissez la luminosité de la couleur sélectionnée (3). Les composantes RGB sont disponibles dans les cases Rouge, Vert et Bleu :

Si vous utilisez un autre système d’exploitation, une application comparable à PhotoFiltre est forcément disponible : The Gimp ou PhotoShop par exemple.

Voyons maintenant si la procédure EnRouge est bien disponible sous la forme d’une macro. Il n’y a rien de plus simple. Basculez sur l’onglet Développeur dans le ruban, puis cliquez sur l’icône Macros dans le volet Code. Comme vous le voyez, la macro EnRouge a bien été créée :

Fermez la boîte de dialogue Macro.

Pour voir si le code fonctionne, sélectionnez plusieurs cellules dans la feuille. Toujours sous l’onglet Développeur du ruban, cliquez sur Macros, dans le groupe Code, sélectionnez la macro EnRouge et cliquez sur Exécuter. Voici le résultat :

Avant de terminer cette section, j’ai une question pour vous. Vous avez vu que cette instruction affectait un arrière-plan rouge aux cellules sélectionnées :

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

Quelle instruction devriez-vous utiliser pour affecter la couleur verte aux caractères qui se trouvent dans les cellules sélectionnées ?

Selection.Font.Color = RGB(0, 255, 0)

Pour terminer, changez le nom et le commentaire de la procédure EnRouge() :

Sub EnVert()

'

' Caractères en vert

'

    Selection.Font.Color = RGB(0, 255, 0)

End Sub

Dans cet article, vous allez faire connaissance avec l’application Microsoft Visual Basic for Applications, dans laquelle vous développerez vos projets VBA.

Pour accéder à cette fenêtre, basculez sur l’onglet Développeur du ruban et cliquez sur l’icône Visual Basic dans le groupe Code :

Si vous n’êtes pas réfractaire aux raccourcis clavier, vous pouvez également appuyer sur Alt + F11 pour parvenir au même résultat.

Examinons la fenêtre Microsoft Visual Basic pour Applications :

Il se peut que votre fenêtre soit légèrement différente. Les volets en trop ou manquants peuvent être affichés/supprimés avec les commandes du menu Affichage.

Premiers pas en VBA

Examinez le volet Explorateur de projets.

Si vous n’avez pas encore défini de macros dans le classeur en cours, vous allez créer un module. C’est en effet dans ce module que les instructions VBA rattachées au classeur en cours seront définies. Lancez la commande Module dans le menu Insertion. Le dossier Modules et l’entrée Module1 sont ajoutés dans l’explorateur de projets et une feuille blanche apparait dans la partie droite de la fenêtre :

Si vous avez défini une ou plusieurs macros, le dossier Modules et l’entrée Module1 doivent apparaître dans ce volet.

Supposons que vous ayez défini la macro DateLongue, comme indiqué dans la section « Une première macro ». Vous devriez avoir le code suivant dans le module 1 :

Sub DateLongue()

'

' DateLongue Macro

'

'

    Selection.NumberFormat = "[$-x-sysdate]dddd, mmmm dd, yyyy"

End Sub

Sur la première ligne, vous retrouvez le nom de la macro DateLongue, précédé du mot sub, pour subroutine, ou procédure en français. La procédure se termine par les mots End Sub. Le code de la procédure DateLongue se trouve entre les mots Sub et End Sub.

Dans cet exemple précis, vous trouvez plusieurs lignes de commentaires, qui commencent par une apostrophe :

'

' DateLongue Macro

'

'

Ainsi qu’une ligne qui vous laisse peut-être perplexe :

Selection.NumberFormat = "[$-x-sysdate]dddd, mmmm dd, yyyy"

Il s’agit d’une notation objet, car oui, VBA est un langage objet !

Si vous n’avez aucune idée de ce qu’est un langage objet, cliquez sur ce lien (renvoie vers la section « Si vous n’avez aucune idée de ce qu’est un langage objet »).

Cette ligne de code définit la propriété NumberFormat de l’objet Selection. En d’autres termes, le format des cellules sélectionnées. La chaîne affectée à cette propriété a été générée par l’enregistreur de macros. Elle indique que les dates doivent être affichées au format long :

  • dddd : nom du jour au format long
  • mmmm : nom du mois au format long
  • dd : numéro du jour
  • yyyy : année au format long

La première partie du format ([$-x-sysdate]) indique que la date sera affichée en fonction de la langue système. Ici, il s’agit du français. La date 12/08/2017 sera transformée en samedi 12 août 2017.

Si vous n’avez aucune idée de ce qu’est un langage objet

Un petit aparté pour ceux qui ne savent pas ce qu’est un langage objet et/ou qui n’ont jamais programmé en objet.

Eh bien, comme son nom l’indique, un langage objet manipule … des objets ! Vous pouvez considérer un objet comme une boîte qui possède des propriétés et des méthodes. Les propriétés définissent les caractéristiques de l’objet et les méthodes agissent sur l’objet.

Si nous prenons le cas particulier d’Excel, Les programmes VBA manipulent un ensemble d’objets mis à disposition du programmeur par Excel : des cellules, des lignes, des colonnes, des plages sélectionnées, des feuilles de calcul et des classeurs.

Propriétés

Pour accéder à une propriété, vous écrirez quelque chose comme ceci :

Objet.Propriété

Objet est le nom de l’objet et Propriété est la propriété à laquelle vous voulez accéder.

Vous pouvez lire la valeur d’une propriété et l’afficher dans une boîte de dialogue avec une instruction Msg. Par exemple :

Msg Objet.Propriété

Ou encore affecter une valeur à une propriété avec un simple signe = (égale à).

Si la valeur est numérique, il suffit de l’indiquer après le signe = :

Objet.Propriété = Valeur

Si la valeur est une chaîne de caractères, elle sera encadrée par des guillemets :

Objet.Propriété = "Valeur"

Méthodes

Pour appliquer une méthode à un objet, il suffit d’indiquer le nom de l’objet, suivi d’un point, suivi du nom de la méthode. Par exemple, pour basculer sur la feuille de calcul Feuil2 du classeur courant, vous appliquerez la méthode Activate à l’objet Worksheets(« Feuil2 ») :

Worksheets("Feuil2").Activate

Ou encore, pour sélectionner la cellule B5 dans la feuille courante, vous appliquerez la méthode Select à l’objet Range(« B5 ») :

Range("B5").Select

Et maintenant, tout le travail va consister à connaitre les objets d’Excel, leurs propriétés et leurs méthodes. Vous voyez que ce n’est pas si compliqué que ça !