Types d’erreurs VBA : Débogage et Solution

Comme tout autre langage de programmation, VBA n’a pas de chance en ce qui concerne les erreurs et vous devez les gérer, quoi qu’il arrive. Ils peuvent provenir de différentes sources, comme un mauvais codage, des opérations impossibles (comme la division par zéro) ou des erreurs inattendues.

La meilleure façon de gérer cela est d’avoir une bonne compréhension de tous les résultats possibles du résultat que vous pourriez obtenir avec le code. Regardez l’exemple ci-dessous où nous avons un code VBA qui calcule la racine carrée du nombre en utilisant la valeur que vous avez dans la cellule sélectionnée.

Sub Square_Root()
ActiveCell.Value = ActiveCell.Value ^ (1 / 2)
End Sub

Mais si la cellule active a une valeur autre qu’un nombre, vous obtiendrez une erreur d’exécution, comme ci-dessous.

erreur d'exécution

Paramètres d’erreur dans VBA (Interception d’erreurs)

Dans l’option VBA, vous pouvez configurer le paramètre pour traiter les erreurs avant de commencer à écrire des codes. Pour ouvrir les paramètres VBA, accédez à Outils ➤ Options ➤ Général ➤ Interception d’erreurs. Ici, vous avez trois options que vous pouvez utiliser.

  • Arrêter sur toutes les erreurs : Si vous avez activé cette option, VBA arrêtera le code pour tous les types d’erreurs même si vous avez utilisé toutes sortes de techniques de gestion des erreurs.
  • Module de classe d’effraction : Avec cette option, VBA arrêtera tous vos codes qui ne sont gérés par aucune technique. Et si vous utilisez des objets tels que Userforms, il se cassera également dans ces objets et mettra en évidence la ligne exacte où se trouve l’erreur.
  • Break on Unhandled Errors : Il s’agit du paramètre par défaut qui vous aide à connaître toutes les erreurs pour lesquelles vous n’utilisez aucune technique de gestion des erreurs et à arrêter le code pour toutes les erreurs non gérées. (Mais, si vous utilisez des objets tels que Userforms, cela ne mettra pas en surbrillance la ligne provoquant l’erreur dans l’objet, mais ne mettra en évidence que la ligne qui fait référence à cet objet).

Types d’erreurs VBA

Pour comprendre les erreurs VBA, vous pouvez les diviser en quatre catégories, et vous trouverez ci-dessous l’explication de ces types d’erreurs.

1. Erreurs de syntaxe

Lors de l’écriture du code VBA, vous devez suivre une syntaxe particulière et lorsque vous l’ignorez ou ne l’écrivez pas comme il se doit, vous pouvez faire face à une erreur SYNTAX (également appelée erreur de langue). C’est comme des fautes de frappe que vous faites en écrivant vos codes.

Eh bien, VBA vous aide en signalant ces erreurs en affichant un message d’erreur. Vous avez juste besoin de vous assurer que « Auto Syntax Check » est activé dans votre éditeur VB.

Allez dans Outil ➤ Options et assurez-vous de cocher la case « Vérification automatique de la syntaxe ». Avec cela, chaque fois que vous faites une erreur SYNTAX, VBA affiche un message d’erreur.

Mais si « Auto Syntax Check » est désactivé, VBA met toujours en surbrillance la ligne de code avec l’erreur mais n’affiche pas le message d’erreur.

2. Erreurs de compilation

Cela se produit lorsque vous écrivez du code pour effectuer une activité, mais que cette activité n’est pas valide ou ne peut pas être effectuée par VBA. Le meilleur exemple est celui où vous avez un code utilisant l’instruction IF mais que vous avez manqué d’ajouter END IF à la fin de l’instruction et maintenant, lorsque vous exécutez ce VBA, vous affichez un message d’erreur de compilation.

En dehors de cela, il existe d’autres exemples d’erreurs de compilation :

  • Utilisation de For sans Next ( For Next ).
  • Sélectionner sans sélectionner la fin ( Sélectionner la casse ).
  • Ne pas déclarer une variable lorsque vous avez activé  » Option Explicit « .
  • Appel d’une sous/fonction qui n’existe pas.

3. Erreurs d’exécution

Une erreur d’exécution se produit au moment de l’exécution du code. Rappelez-vous l’exemple que j’ai partagé avec vous ci-dessus lorsque le code a calculé la racine carrée d’un nombre.

Lorsqu’une erreur d’exécution se produit lors de l’exécution du code, il arrête le code et vous montre la boîte de dialogue d’erreur et cette boîte d’erreur parle de la nature de l’erreur que vous avez. Supposons que vous ayez écrit un code qui ouvre un classeur à partir de l’emplacement que vous avez spécifié, mais que ce classeur est maintenant déplacé ou supprimé par quelqu’un.

Ainsi, lorsque vous exécutez le code, VBA vous montrera une erreur d’exécution car il ne peut pas trouver ce fichier à cet emplacement. Le message que vous obtenez dans une erreur d’exécution décrit la raison qui vous aide à comprendre la raison de l’erreur.

Et lorsqu’une erreur d’exécution se produit, elle arrête l’exécution du code. Si vous cliquez sur le bouton « Déboguer », il vous montre la ligne de code qui contient cette erreur en la surlignant en jaune. Ou vous pouvez cliquer sur le bouton « Fin » pour arrêter l’exécution du code et fermer le message d’erreur.

4. Erreur logique

Ce n’est pas une erreur mais une erreur lors de l’écriture du code. Ces types d’erreurs peuvent parfois vous donner des ennuis tout en les trouvant et en les corrigeant.

Supposons que vous écriviez du code et que, lors de la déclaration d’une variable, vous utilisiez le mauvais type de données ou que vous ayez utilisé les mauvaises étapes de calcul. Dans ce cas, votre code fonctionnera correctement et vous ne trouverez pas facilement cette erreur. La meilleure façon de traiter ce genre de problème est d’exécuter chaque ligne de code une par une.

Utilisation des outils de débogage dans VBA

VBA vous fournit un ensemble d’outils pour déboguer votre code et supprimer les bogues de vos codes.

1. Compiler le projet VBA

Dans Visual Basic Editor, il existe une option que vous pouvez utiliser instantanément après avoir terminé votre code. Ces options de compilation analysent chaque ligne de votre code et affichent une boîte de message s’il y a une erreur dans votre code.

Remarque : L’option Compiler VBA trace uniquement les erreurs de syntaxe et de compilation, et non les erreurs d’exécution, car ces erreurs ne surviennent que lorsqu’un code est en cours d’exécution. Pour utiliser Compile VBA Project, accédez à ➤ Debug ➤ Compile VBA Project.

Une fois que vous avez exécuté « Compile VBA Project » et que vous n’avez aucune erreur dans votre code, les options seront grisées.

2. Exécutez chaque ligne de code une par une

C’est comme ça que je fais. Lorsque je complète un code, je l’exécute simplement ligne par ligne pour vérifier s’il y a une erreur. Cela peut prendre du temps, mais cela vous aide à résoudre toutes les erreurs (syntaxe, compilation et exécution).

Sur la « Debug Toolbar », il y a un bouton « Step In » que vous pouvez utiliser pour exécuter un code ligne par ligne ou vous pouvez simplement appuyer sur F8 pour exécuter une seule ligne, puis appuyer à nouveau pour exécuter la ligne suivante dans le code.

Utilisation de l’instruction « On ERROR » pour gérer les erreurs VBA

Il est important de vérifier vos codes et de trouver les erreurs possibles dans toutes les méthodes de débogage dont vous disposez. Mais le moyen le meilleur et le plus efficace consiste à créer des instructions de gestion des erreurs capables de traiter une erreur et de rendre votre code impeccable lors de son exécution. Découvrons ces déclarations. Lorsqu’une erreur se produit dans un code VBA, les meilleures façons de gérer cette erreur peuvent être :

  • Laissez le VBA ignorer l’erreur et exécuter le code
  • Laissez un ensemble spécial d’instructions s’exécuter lorsqu’une erreur se produit.

Dans les deux solutions, vous pouvez utiliser des instructions « On Error ». Vous trouverez ci-dessous quatre déclarations « En cas d’erreur » que vous pouvez utiliser. Et maintenant, regardons chaque déclaration une par une.

1. En cas d’erreur, reprendre ensuite

Cette simple ligne de code permet à VBA de continuer à exécuter le code malgré l’apparition d’une erreur. L’IDEA est simple : passez à la ligne suivante du code si une erreur est détectée quelque part lors de l’exécution.

Dans le code ci-dessous, vous avez deux lignes de code :

  • La première ligne indique que la valeur de la cellule A1 est 25 divisé par 0
  • Et la deuxième ligne indique que la cellule de valeur A2 est 10 divisé par 5

Maintenant, il y a un problème avec le code que vous avez en ligne. Comme vous le savez, si vous divisez quoi que ce soit par 0, le résultat sera une erreur. Ainsi, lorsque vous exécutez ce code, VBA affiche un message d’erreur « Erreur d’exécution ’11’ Division par zéro » et arrête l’exécution.

Mais lorsque vous ajoutez « On Error Resume Next » au tout début du code et exécutez le code, VBA ignore simplement la ligne de code où l’erreur se produit et continue avec la deuxième ligne et ajoute cette valeur dans la cellule A2.

Sub myDivide()
On Error Resume Next
    Range("A1").Value = 25 / 0
    Range("A2").Value = 10 / 5
End Sub

Ainsi, chaque fois que vous souhaitez que votre code soit exécuté malgré une erreur survenant n’importe où, utilisez simplement l’instruction « On Error Resume Next » dans votre code.

Mais voici encore une chose que vous devez noter : il ignorera uniquement les erreurs qui se produisent après.

Supposons qu’une erreur se produise à la ligne 5 et que vous ayez ajouté « On Error Resume Next » à la ligne 8, cela ne sauterait pas cette erreur. Ainsi, la meilleure façon est de l’ajouter comme première ligne du code dans la procédure.

2. En cas d’erreur GoTo 0

C’est le comportement par défaut de VBA qui, lorsqu’une erreur se produit, arrête l’exécution du code.

Eh bien, l’utilisation de « On Error GoTo 0″ ne fait aucune différence dans votre code. VBA arrêtera simplement le code et affichera un message avec une description de l’erreur. Alors pourquoi devrais-je m’embêter à l’utiliser ? Question intelligente. Utilisons l’exemple que vous avez utilisé ci-dessus dans  » On Error Resume Next « .

Dans ce code, chaque fois qu’une erreur se produit, VBA reprend la ligne de code suivante et l’exécute et vous ne verrez aucun message d’erreur. Mais disons que vous avez plus de lignes dans votre code et que vous ne voulez pas dépasser ces lignes s’il y a une erreur dans le code.

Ainsi, si vous entrez « On Error GoTo 0 » après la deuxième ligne de code, cela restaurera le gestionnaire d’erreurs par défaut de VBA qui affiche des messages d’erreur chaque fois qu’une erreur se produit.

3. En cas d’erreur GoTo [Étiquette]

Pensez à un endroit dans un bâtiment où vous pouvez vous diriger en cas d’urgence. De la même manière, en utilisant « On Error GoTo [Label] », vous pouvez simplement créer un bloc de code séparé dans votre code principal pour traiter une erreur.

En fait, « On Error GoTo [Label] » est un moyen bien meilleur et plus pratique de gérer les erreurs. Dans le code ci-dessous, vous avez « On Error GoTo Oh! Error » maintenant dans cette déclaration de ligne, le mot « Oh! Error » est l’étiquette.

Si vous regardez à la fin du code où vous avez un début spécifique avec le nom de l’étiquette, puis un code pour une boîte de message avec un message sur le code.

Maintenant, que se passe-t-il si une erreur se produit, le VBA passera à l’étiquette « Oh! Error » et exécutera le bloc de code que vous avez après cette étiquette.

Mais il y a une chose dont vous devez vous occuper : si une erreur ne se produit pas, l’étiquette que vous avez dans votre code sera exécutée. Il y a deux choses que vous devez faire :

  • Tout d’abord, assurez-vous d’ajouter votre étiquette d’erreur à la fin du code.
  • Deuxièmement, ajoutez un « Exit Sub » avant l’étiquette d’erreur.

Avec cela, vous bénéficierez dans les deux situations. Disons que si une erreur se produit et que VBA passe à l’étiquette que vous avez spécifiée, il n’y aura que du code de l’étiquette elle-même à coder. Et si une erreur ne se produit pas, l’instruction « Exit Sub » que vous avez avant l’étiquette quittera la procédure sans exécuter l’étiquette d’erreur.

4. En cas d’erreur GoTo -1

Avant d’entrer dans le vif du sujet, permettez-moi de partager quelque chose avec vous. Lorsqu’une erreur se produit dans un code, VBA stocke ce journal d’erreurs dans sa mémoire et ne l’efface que lorsque la routine se termine.

Ô VBA ! Vivre au présent

Pour traiter la deuxième erreur dans un code VBA, vous devez effacer la première erreur de la mémoire de VBA. Dans le code ci-dessous, vous avez deux instructions « On Error GoTo [Label] » qui traitent des erreurs de deux blocs de code différents.

Mais si vous exécutez ce code, lorsque la deuxième erreur VBA ne passera pas à l’étiquette que vous avez définie et affichera à la place le message d’erreur « Type Mismatch ».

Sub Square_Root()
On Error GoTo myError1
Range("A1").Value = Range("A1").Value ^ (1 / 2)
myError1:
MsgBox "There's some problem with the value you have in the cell A1."
On Error GoTo myError2
Range("A2").Value = Range("A2").Value ^ (1 / 2)
myError2:
MsgBox "There's some problem with the value you have in the cell A2."
End Sub

Pour résoudre ce problème, vous pouvez utiliser « On Error GoTo -1 » qui permet à VBA de supprimer l’erreur actuelle de sa mémoire de stockage.

Sub Square_Root()
 On Error GoTo myError1
 Range("A1").Value = Range("A1").Value ^ (1 / 2)
 myError1:
 MsgBox "There's some problem with the value you have in the cell A1."
 On Error GoTo -1
 On Error GoTo myError2
 Range("A2").Value = Range("A2").Value ^ (1 / 2)
 myError2:
 MsgBox "There's some problem with the value you have in the cell A2."
 End Sub

Maintenant, lorsque vous exécutez ce code, « On Error GoTo -1 » supprime l’erreur de la mémoire et VBA traite l’erreur dans la deuxième instruction comme vous le souhaitez.

Que dois-je savoir d’autre pour gérer les erreurs dans VBA ?

Outre l’utilisation de techniques de gestion des erreurs, il existe quelques autres éléments que vous pouvez utiliser pour mieux gérer les erreurs.

Erreur d’objet

Lorsqu’une erreur s’est produite lors de l’exécution du code, vous pouvez utiliser l’objet Err pour obtenir des détails sur cette erreur. Il existe quelques propriétés et méthodes que vous pouvez utiliser avec l’objet Err. Apprenons-les un par un.

Propriétés

Voici les propriétés que vous pouvez utiliser avec l’objet Err :

  • Err.Number : Lorsqu’une erreur s’est produite, un nombre est stocké dans l’objet Err. Dans le code ci-dessous, lorsqu’il se produit, la boîte de message affiche le numéro d’erreur.
  • Err.Description : Cette propriété affiche la description de l’erreur qui peut vous aider à comprendre la raison de l’erreur.
  • Err.Source : cette propriété vous indique dans quel projet l’erreur s’est produite.
  • Err.HelpContext : cette propriété renvoie l’ID de contexte d’aide pour l’erreur dans le fichier d’aide.
  • Err.HelpContext : Il s’agit d’une valeur de chaîne pour l’emplacement du fichier d’aide.

Normalement, lorsque vous traitez des erreurs à l’aide de techniques de gestion des erreurs, vous n’utilisez pas beaucoup l’objet Err dans vos codes. Mais ci-dessous est un exemple simple pour l’utiliser.

Sub Square_Root()
On Error GoTo myError1
    Range("A1").Value = Sqr(Range("A1").Value)
Exit Sub
myError1:
    MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _
                "Error Number: " & Err.Number  & vbCrLf & _
                "Error Description: " & Err.Description
End Sub

Lorsque vous exécutez le code ci-dessus, et si une erreur s’est produite, il affichera une boîte de message avec le numéro d’erreur et la description de l’erreur.

Méthodes

Avec Err Object, vous pouvez également utiliser deux méthodes.

  • Err.Clear : Cette méthode efface le numéro d’erreur et la description de l’erreur de la mémoire de VBA (c’est différent de « On Error GoTo -1 » car elle ne réinitialise pas complètement l’erreur).
  • Err.Raise : avec cette méthode, vous pouvez générer intentionnellement une erreur d’exécution dans votre code, et voici la syntaxe à suivre :

Err .Raise [numéro], [source], [description], [fichier d’aide], [contexte d’aide]

Conseils rapides sur la gestion des erreurs

Voici quelques conseils rapides que vous pouvez utiliser pour mieux gérer les erreurs VBA.

  • Utilisez « On Error Resume Next » uniquement lorsque vous savez avec certitude qu’une erreur se produit et qu’il est acceptable de sauter la ligne de code avec une erreur et qu’il est sûr de passer à la ligne suivante.
  • La meilleure façon de traiter les erreurs d’exécution consiste à utiliser « Error Handler » avec « On Error GoTo [Label] ». Cela garantit que chaque fois que l’erreur se produit, vous en serez informé, mais cela n’affichera pas ce message d’erreur désagréable.
  • Chaque fois que vous utilisez le gestionnaire d’erreurs, assurez-vous d’utiliser « Exit Sub » avant.

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *