Écrire des macros VBA à partir de zéro

L'enregistreur de macros d'Excel a beaucoup de puissance, mais il a ses limites. Comme indiqué dans un autre article, l'enregistreur de macros enregistre souvent du code inutile et ne peut pas enregistrer des éléments tels que la logique ou les interactions avec d'autres programmes. Il peut également être difficile à utiliser pour des macros plus longues - vous pouvez vous retrouver à scénariser vos actions à l'avance juste pour éviter de commettre des erreurs coûteuses.

Cet article a pour but de vous aider à commencer à coder des macros à partir de zéro en VBA. Vous apprendrez où sont stockées les macros, écrirez une macro de base et apprendrez les bases de la programmation en VBA à l'aide de variables, de logique et de boucles.

Commencer

VBA et l'éditeur Visual Basic

VBA, ou Visual Basic pour Applications, est le langage dans lequel les macros sont écrites. Toutes les macros sont stockées sous forme de code VBA, qu'elles soient codées à la main ou créées avec l'enregistreur de macros.

Vous pouvez accéder à tout le code VBA d'un classeur à l'aide de Visual Basic Editor. Il s'agit d'un éditeur de texte et d'un débogueur spéciaux intégrés à toutes les applications bureautiques, y compris Excel. En règle générale, vous ouvrez cet éditeur avec le ALT+F11 raccourci clavier dans Excel, mais vous pouvez également y accéder à partir d'Excel Développeur onglet si vous l'avez activé.

L'explorateur de projets

Les Explorateur de projets est une fenêtre à l'intérieur de l'éditeur VB qui vous montre tous les éléments pouvant contenir du code VBA. Si vous ne voyez pas cette fenêtre, appuyez sur F5 pour le faire apparaître ou sélectionnez Explorateur de projets du Vue menu.

Double-cliquer sur un élément dans l'explorateur de projet affichera le code de cet élément. Plusieurs types d'éléments peuvent apparaître dans l'explorateur de projets :

  • Cahiers d'exercices
  • Des feuilles de calcul
  • Formulaires utilisateur
  • Modules de classe
  • Modules (les macros sont stockées dans ces éléments)

Bien que tous ces types d'éléments puissent inclure du code VBA, la meilleure pratique consiste à coder les macros dans les modules.

Faire votre première macro

Utilisation de la liste des macros

La liste des macros vous montre toutes les macros de votre classeur. À partir de cette liste, vous pouvez modifier une macro existante ou en créer une nouvelle.

Pour créer une nouvelle macro à l'aide de la liste Macros :

  • Sélectionnez l'onglet Développeur et cliquez sur Macro (ou appuyez sur ALT+F8)

  • Saisissez un nouveau nom pour votre macro, puis cliquez sur « Créer »

Après avoir cliqué sur "Créer", l'éditeur VB apparaîtra, montrant la macro nouvellement créée. Excel créera un nouveau module pour la macro si nécessaire.

Manuellement dans l'éditeur VB

Vous pouvez ajouter une nouvelle macro manuellement sans la liste Macros. C'est la meilleure option si vous souhaitez spécifier le module dans lequel la macro est enregistrée.

Pour ajouter une macro manuellement :

  • Ouvrez l'éditeur VB (ALT+F11)
  • Soit:
    • Ajoutez un nouveau module en cliquant Insérer > Module dans le menu (le module s'ouvrira automatiquement)

    • OU, double-cliquez sur un module existant dans l'explorateur de projet pour l'ouvrir

  • Dans le module, tapez le code de votre nouvelle macro
Sub MyMacro() End Sub

Ces deux lignes indiquent le début et la fin d'une macro nommée « MaMacro » (notez les parenthèses, qui sont obligatoires). Cela apparaîtra dans la boîte de dialogue "Afficher les macros" dans Excel et peut être affecté à un bouton (même s'il ne fait rien pour le moment).

Ajouter du code à la macro

Maintenant, ajoutons du code entre les lignes « Sub » et « End Sub » pour que cette macro fasse réellement quelque chose :

Sub MyMacro() Range ("A1").Valeur = "Hello World!" Fin du sous-marin

Structures de code de base

L'objet Range

Excel VBA utilise l'objet Range pour représenter les cellules d'une feuille de calcul. Dans l'exemple ci-dessus, un objet Range est créé avec le code Plage ("A1") pour accéder à la valeur de la cellule A1.
Les objets de plage sont principalement utilisés pour définir les valeurs des cellules :

Plage ("A1"). Valeur = 1
Plage ("A1").Valeur = "Première cellule"

Notez que lorsque vous définissez des valeurs de cellule sous forme de nombres, vous entrez simplement le nombre, mais lorsque vous saisissez du texte, vous devez entourer le texte de guillemets.

Les plages peuvent également être utilisées pour accéder à de nombreuses propriétés des cellules telles que leur police, leurs bordures, leurs formules, etc.
Par exemple, vous pouvez définir la police d'une cellule sur Gras comme ceci :

Plage ("A1").Font.Bold = True

Vous pouvez également définir la formule d'une cellule :

Plage ("A1").Formule = "=Somme(A2:A10)"

Dans Excel, vous pouvez sélectionner un bloc de cellules avec le curseur (par exemple, de A1 à D10) et les mettre toutes en gras. Les objets de plage peuvent accéder à des blocs de cellules comme ceci :

Plage ("A1:D10").Font.Bold = True

Vous pouvez également faire référence à plusieurs cellules/blocs à la fois :

Plage ("A1:D10,A12:D12,G1").Font.Bold = True

Le format est le même que celui que vous utiliseriez lors de la sélection de cellules pour la formule SUM() dans Excel. Chaque bloc est séparé par une virgule et les blocs sont indiqués par les cellules en haut à gauche et en bas à droite séparées par deux points.

Enfin, les objets Range ont des méthodes intégrées pour effectuer des opérations courantes sur une feuille de calcul. Par exemple, vous pouvez vouloir copier certaines données d'un endroit à un autre. Voici un exemple :

Plage ("A1:D10").Copier la plage ("F1").PasteSpecial xlPasteValues ​​Range ("F1").PasteSpecial xlPasteFormats

Cela copie les cellules A1:D10 dans le presse-papiers, puis effectue un PasteSpecial() à partir de la cellule C1 - comme vous le feriez manuellement dans Excel. Notez que cet exemple montre comment utiliser PasteSpecial() pour coller uniquement les valeurs et les formats - il existe des paramètres pour toutes les options que vous verriez dans la boîte de dialogue Collage spécial.

Voici un exemple de collage de « Tous » dans une autre feuille de calcul :

Plage ("A1:D10").Copier les feuilles ("Feuille2").Plage ("A1").PasteSpecial xlPasteAll

Si les déclarations

Avec un Si déclaration, vous pouvez exécuter une section de code uniquement « si » une certaine déclaration est vraie.

Par exemple, vous pouvez mettre une cellule en gras et la colorer en rouge, mais uniquement « si » la valeur de la cellule est inférieure à 100.

If Range ("A4").Valeur < 100 Then Range ("A4").Font.Bold = True Range ("A4").Interior.Color = vbRed End If 

La structure appropriée d'une instruction If est la suivante (les crochets indiquent les composants facultatifs) :

Si donc

[Sinon si alors]

[Autre]

Fin si

Vous pouvez inclure autant de SinonSi blocs comme vous le souhaitez pour tester plusieurs conditions. Vous pouvez également ajouter un Autre bloc qui ne s'exécute que si aucune des autres conditions de l'instruction If n'est remplie.

Voici un autre exemple basé sur le précédent, où la cellule est formatée de plusieurs manières différentes en fonction de la valeur :

If Range("A4").Valeur < 100 Then Range("A4").Font.Bold = True Range("A4").Interior.Color = vbRed ElseIf Range("A4").Valeur < 200 Then Range( "A4").Font.Bold = False Range ("A4").Intérieur.Couleur = vbYellow Else Range ("A4").Font.Bold = False Range ("A4").Intérieur.Couleur = vbGreen End If

Dans l'exemple ci-dessus, la cellule n'est pas en gras dans les blocs ElseIf où la valeur n'est pas inférieure à 100. Vous pouvez nid Si des instructions pour éviter de dupliquer le code, comme ceci :

If Range ("A4").Valeur < 100 Then Range ("A4").Font.Bold = True Range ("A4").Interior.Color = vbRed Else Range ("A4").Font.Bold = False ' dégraissant la police une seule fois If Range("A4").Valeur < 200 Then Range("A4").Interior.Color = vbYellow Else Range("A4").Interior.Color = vbGreen End If End If

Variables

UNE Variable est un morceau de mémoire utilisé pour stocker des informations temporaires pendant l'exécution d'une macro. Ils sont souvent utilisés dans les boucles comme itérateurs ou pour conserver le résultat d'une opération que vous souhaitez utiliser plusieurs fois dans une macro.

Voici un exemple de variable et comment vous pouvez l'utiliser :

Sub ExtractSerialNumber() Dim strSerial As String ' il s'agit de la déclaration de variable ' ' As String ' signifie que cette variable est destinée à contenir du texte ' définissant un faux numéro de série : Range("A4").Value = "serial# 804567-88 ” ' analyser le numéro de série de la cellule A4 et l'affecter à la variable strSerial = Mid(Range("A4").Value, 9) ' maintenant utiliser la variable deux fois, au lieu d'avoir à analyser le numéro de série deux fois Range(" B4").Valeur = strSerial MsgBox strSerial End Sub 

Dans cet exemple de base, la variable 'strSerial' est utilisée pour extraire le numéro de série de la cellule A4 à l'aide de la fonction Mid(), puis est utilisée à deux autres endroits.

La façon standard de déclarer une variable est la suivante :

Faible quel que soit le nom [Comme taper]

  • quel que soit le nom est le nom que vous décidez de donner à votre variable
  • taper est le type de données de la variable

Le "[Comme taper] » peut être omise - si c'est le cas, la variable est déclarée en tant que type Variant, qui peut contenir n'importe quel type de données. Bien que parfaitement valides, les types Variant doivent être évités car ils peuvent conduire à des résultats inattendus si vous ne faites pas attention.

Il y a règles pour les noms de variables. Ils doivent commencer par une lettre ou un caractère de soulignement, ne peuvent pas contenir d'espaces, de points, de virgules, de guillemets ou de caractères "! @ & $ #”.

Voici quelques exemples de déclarations de variables :

Dim strFilename As String ' style de nom correct - descriptif et utilise le préfixe Dim i As Long ' style de nom incorrect - acceptable uniquement pour certains itérateurs Dim SalePrice As Double ' style de nom correct - descriptif, mais n'utilise pas de préfixe Dim iCounter ' nom correct - pas trop descriptif, utilise un préfixe, aucun type de données

Tous ces exemples utilisent des schémas de nommage légèrement différents, mais tous sont valides. Ce n'est pas une mauvaise idée de préfixer un nom de variable avec une forme courte de son type de données (comme dans certains de ces exemples), car cela rend votre code plus lisible en un coup d'œil.

VBA comprend beaucoup de bases Types de données. Les plus populaires incluent :

  • Chaîne de caractères (utilisé pour contenir des données textuelles)
  • Longue (utilisé pour contenir des nombres entiers, c'est-à-dire sans décimales)
  • Double (utilisé pour contenir des nombres à virgule flottante, c'est-à-dire des décimales)

Une liste complète des types de données intrinsèques VBA est disponible ici : https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

Variables d'objet de plage

Il est également possible de créer des variables qui référencent des objets de plage. Ceci est utile si vous souhaitez faire référence à une plage spécifique dans votre code à plusieurs endroits - de cette façon, si vous devez modifier la plage, vous n'avez besoin de la modifier qu'à un seul endroit.

Lorsque vous créez une variable objet Range, vous devez la « définir » sur une instance d'un Range. Par exemple:

Dim rMyRange As Range Set rMyRange = Range ("A1:A10;D1:J10")

Laisser l'instruction "Set" lors de l'affectation d'une variable Range entraînera une erreur.

Boucles

Les boucles sont des blocs qui répètent le code qu'ils contiennent un certain nombre de fois. Ils sont utiles pour réduire la quantité de code que vous devez écrire et vous permettent d'écrire un morceau de code qui exécute les mêmes actions sur de nombreux éléments liés différents.

Pour-Suivant

UNE Pour-Suivant block est une boucle qui se répète un certain nombre de fois. Il utilise une variable comme itérateur pour compter combien de fois il s'est exécuté, et cette variable d'itérateur peut être utilisée à l'intérieur de la boucle. Cela rend les boucles For-Next très utiles pour parcourir des cellules ou des tableaux.

Voici un exemple qui parcourt les cellules des lignes 1 à 100, colonne 1, et définit leurs valeurs sur la valeur de la variable d'itération :

Dim i As Long For i = 1 To 100 Cells(i, 1).Value = i Next i

La ligne « Pour i = 1 à 100 » signifie que la boucle commence à partir de 1 et se termine après 100. Vous pouvez définir les numéros de début et de fin que vous souhaitez; vous pouvez également utiliser des variables pour ces nombres.

Par défaut, les boucles For-Next comptent par 1. Si vous souhaitez compter par un nombre différent, vous pouvez écrire la boucle avec un Étape clause:

Pour i = 5 à 100 Étape 5

Cette boucle commencera à 5, puis ajoutera 5 à «i» à chaque fois que la boucle se répétera (donc «i» sera 10 à la deuxième répétition, 15 à la troisième, et ainsi de suite).

À l'aide de Étape, vous pouvez également faire un compte de boucle à rebours :

Pour i = 100 à 1 pas -1

Vous pouvez également nid Boucles For-Next. Chaque bloc nécessite sa propre variable avec laquelle compter, mais vous pouvez utiliser ces variables où vous le souhaitez. Voici un exemple de son utilité dans Excel VBA :

Dim i As Long, j As Long For i = 1 To 100 For j = 1 To 100 Cells(i, j).Value = i * j Next j Next i

Cela vous permet de parcourir les lignes et les colonnes.

ATTENTION: bien que cela soit autorisé, vous ne devez JAMAIS MODIFIER la variable d'itérateur à l'intérieur d'un bloc For-Next, car il utilise cet itérateur pour garder une trace de la boucle. La modification de l'itérateur peut provoquer une boucle infinie et bloquer votre macro. Par exemple:

Pour i = 1 À 100 i = 1 Suivant i

Dans cette boucle, « I » n'ira jamais au-delà de 2 avant d'être réinitialisé à 1, et la boucle se répétera indéfiniment.

Pour chaque

Pour chaque les blocs sont très similaires aux blocs For-Next, sauf qu'ils n'utilisent pas de compteur pour spécifier combien de fois ils bouclent. Au lieu de cela, un bloc For-Each prend une « collection » d'objets (comme une plage de cellules) et s'exécute autant de fois qu'il y a d'objets dans cette collection.

Voici un exemple :

Dim r As Range For Each r In Range("A15:J54") Si r.Value > 0 Then r.Font.Bold = True End If Next r

Notez l'utilisation de la variable objet Range 'r'. Il s'agit de la variable d'itération utilisée dans la boucle For-Each - à chaque fois que la boucle est parcourue, "r" obtient une référence à la cellule suivante de la plage.

Un avantage de l'utilisation des boucles For-Each dans Excel VBA est que vous pouvez parcourir toutes les cellules d'une plage sans boucles d'imbrication. Cela peut être pratique si vous devez parcourir toutes les cellules d'une plage complexe comme Plage ("A1:D12,J13, M1:Y12").

Un inconvénient des boucles For-Each est que vous n'avez aucun contrôle sur l'ordre dans lequel les cellules sont traitées. Même si en pratique Excel va parcourir les cellules dans l'ordre, en théorie il pourrait traiter les cellules dans un ordre complètement aléatoire. Si vous devez traiter les cellules dans un ordre particulier, vous devez plutôt utiliser des boucles For-Next.

Do-Loop

Alors que les blocs For-Next utilisent des compteurs pour savoir quand s'arrêter, Do-Loop les blocs s'exécutent jusqu'à ce qu'une condition soit remplie. Pour ce faire, vous utilisez un Jusqu'à au début ou à la fin du bloc, qui teste la condition et provoque l'arrêt de la boucle lorsque cette condition est remplie.

Exemple:

Dim str As String str = "Buffalo" Do Until str = "Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo" str = str & " " & "Buffalo" Loop Range("A1").Value = str

Dans cette boucle, "Buffalo" est concaténé à "str" ​​à chaque fois dans la boucle jusqu'à ce qu'il corresponde à la phrase attendue. Dans ce cas, le test est effectué au début de la boucle - si 'str' était déjà la phrase attendue (ce qui n'est pas le cas parce que nous ne l'avons pas commencé de cette façon, mais si) la boucle ne s'exécuterait même pas .

Vous pouvez exécuter la boucle au moins une fois en déplaçant la clause Until à la fin, comme ceci :

Faire str = str & " " & Boucle "Buffalo" Jusqu'à str = "Buffle Buffle Buffle Buffle Buffle Buffle Buffle"

Vous pouvez utiliser la version qui a du sens dans votre macro.

ATTENTION: vous pouvez provoquer une boucle infinie avec un bloc Do-Loop si la condition Until n'est jamais remplie. Écrivez toujours votre code de manière à ce que la condition Until soit définitivement remplie lorsque vous utilisez ce type de boucle.

Et après?

Une fois que vous avez compris les bases, pourquoi ne pas essayer d'apprendre des techniques plus avancées ? Notre tutoriel sur https://easyexcel.net/excel/learn-vba-tutorial/ s'appuiera sur tout ce que vous avez appris ici et développera vos compétences avec les événements, les formulaires utilisateur, l'optimisation de code et bien plus encore !

wave wave wave wave wave