Ce que vous voyez est une erreur de compilation qui indique qu’un mot-clé Else (ou ElseIf) n’a pas été précédé d’une instruction If correcte.
Ce qui signifie que le compilateur a trouvé une instruction Else (qu’il mettra en évidence pour l’utilisateur) sans voir une instruction If dans les lignes au-dessus. C’est une erreur car elle viole la syntaxe correcte d’une instruction If-Then-Else. La syntaxe correcte est la suivante :
Pour utiliser la syntaxe abrégée de l’instruction if qui spécifie une condition et une action (pour lorsque la condition est remplie) :
If
Alors
Pour utiliser la syntaxe standard pour une instruction If qui spécifie une condition et une action (pour quand la condition est remplie) et une action alternative pour quand la condition n’est pas remplie :
If
Then
Else
.
End if
Pour spécifier plus d’une condition (et leurs actions) :
If
Alors
ElseIf
Alors
Else
.
End if
L’erreur de compilation « Else Without If » se produit lorsque « If
Then
» est manquant ou mal écrit. Discutons des causes courantes de l’erreur plus en détail ci-dessous avec des exemples.
Missing If Statement
Lorsque le compilateur VBA voit que le mot-clé Else n’est pas précédé d’une instruction If reconnaissable (correcte), il génère une erreur ‘Else sans If’. Pour chaque Else, il doit y avoir une instruction If. Cependant, pour chaque If, nous n’avons pas nécessairement besoin d’une instruction else.
Exemple 1 : Déclaration If manquante
Dans cet exemple, nous affichons une boîte de saisie qui prend l’entrée de l’utilisateur et la stocke dans x. Ensuite, nous rencontrons un mot-clé Else, mais il n’y avait aucune déclaration If avant. Cela va en effet provoquer une erreur de compilation : Else sans If.
Pour résoudre ce problème, il suffit d’ajouter une instruction If. Une instruction If se compose de If
Then
.
Suivre de bonnes pratiques d’indentation est crucial pour reconnaître si chaque logique if-else-then se compose des mots clés nécessaires (instruction If, mot clé Else, mot clé End If).
Si
Alors
Else
Si
Alors
. Else
End If
End If
Exemple 2 : L’instruction Else est à l’intérieur d’une boucle et l’instruction If est à l’extérieur
Vous pourriez être surpris d’obtenir l’erreur alors que vous avez déjà l’instruction If présente dans le code et placée avant le mot-clé Else et écrite correctement. Le problème peut ne pas être apparent à première vue. Mais si nous regardons de plus près, nous verrons que la portée de l’instruction If est différente de celle de l’instruction else.
Tout ce qui se trouve entre l’instruction If et le mot-clé End If appartient à la portée de cette instruction If. D’autres scopes peuvent également exister dans le code en raison de l’existence de boucles telles que la boucle For Next, la boucle Do Until ou la boucle For Each Next.
Un scope existe lorsqu’une instruction logique nécessite plusieurs mots-clés pour indiquer les points de début et de fin de l’instruction. Un problème survient si vous chevauchez des scopes d’une manière qui fait que l’un est partiellement placé à l’intérieur de l’autre. La façon correcte de faire fonctionner plusieurs scopes entre eux est d’en placer un totalement à l’intérieur de l’autre.
Dans l’exemple suivant, If
Then
est suivi du début d’une For
boucle suivie du mot-clé Else
. Cela sépare l’instruction If et le mot-clé Else et provoque l’affichage de l’erreur.
Sub Else_Without_If()x = InputBox("Set x value")'démarrage de l'instruction if scopeIf x = 1 Then MsgBox "x value is equal to 1"'démarrage d'un nouveau scope (boucle For Next) For R = 1 To 5'Le mot-clé Else est séparé de son instruction If car il est dans un scope différent.Else Next R MsgBox "x value is not equal to 1 "End IfEnd Sub
Pour résoudre le problème, nous nous assurons que l’instruction logique If dans son ensemble est entièrement englobée dans la boucle For. Ou la boucle For est entièrement englobée dans l’action de l’instruction logique If ; entre If et Else ou entre Else et End If.
En règle générale, si une section de votre code a un certain statut du fait d’avoir un point de départ et un point d’arrivée (If – Else, Else – End If, For – Next, Do – Until), alors vous ne pouvez pas commencer une autre section (portée) à l’intérieur de celle-ci sans la terminer à l’intérieur de la première section.
Point de départ (If, Else, For, Do)
Autre point de départ
Do Something
Autre point de fin
Point de fin (Else, End If, Next, Until)
Pour appliquer cela à notre exemple, nous le changeons en code suivant ;
Sub Else_Without_If()x = InputBox("Set x value") 'démarrage de l'instruction if scopeIf x = 1 Then MsgBox "x value is equal to 1" 'démarrage d'un nouveau scope (For Next loop) For R = 1 To 5 MsgBox "x value is equal to 1" 'ending the new scope within the same scope it was started in Next RElse MsgBox "x value is not equal to 1 "End IfEnd Sub
Incorrect If Statement
Exemple 3 : Placer l’action sur la même ligne que l’énoncé If
Une autre erreur très courante qui est souvent faite est d’écrire l’énoncé If d’une manière qui n’est pas compatible avec l’utilisation du mot-clé Else.
Si nous voulons utiliser le mot-clé Else, nous devons placer la partie action de la logique If-Then-Else dans la ligne suivante après l’instruction if. Si nous n’utilisons pas le mot clé Else, alors nous pouvons placer l’action sur la même ligne que l’instruction If et nous n’écrivons pas le mot clé Else ou le mot clé End If.
Lorsque l’action (qui doit être exécutée si la condition est vraie) est placée sur la même ligne que l’instruction If, alors l’instruction If est considérée comme complète. Ceci est considéré comme une façon abrégée d’écrire la logique If – then.
C’est pourquoi lorsque le compilateur rencontre un mot-clé Else après cela, il ne trouve pas d’instruction If qui appartient au mot-clé Else, car cette instruction If a été complétée en plaçant l’action sur la ligne comme l’instruction If. Le code suivant n’est PAS correct et provoquera l’erreur du compilateur : Else sans If.
L’action (MsgBox "x valeur est égale à 1"
) doit être placée sur la ligne suivante après l’instruction If afin de pouvoir avoir une instruction Else utilisée dans la logique If-Then-Else. Dans le code suivant, nous avons déplacé dans l’instruction action à la ligne suivante, ce qui corrige le problème.
Nous avons maintenant couvert toutes les causes possibles d’erreur de compilation : Else sans if. Pour récapituler, si vous obtenez cette erreur, vérifiez si
1) Il y a une instruction If en place qui précède le mot-clé Else.
2) La ligne d’instruction if ne contient rien d’autre que If
Then
.
3) Vérifiez que l’instruction If et le mot-clé Else ne sont pas séparés par une autre portée ou section, comme les boucles.
Voir aussi : Comment corriger l’erreur « End If without block If »
.