Pb de else sans if
Bonjour,
j'ai créé une macro qui affiche un mot en fonction d'une valeur dans une autre cellule
Au début j'ai fait
With Sheets(2) ' feuille source'
NbrLig = .Cells(65536, 2).End(xlUp).Row
For Lig = 1 To NbrLig 'n° de la 1ere ligne de données'
If Cells(Lig, 4).Value = "3760161137454" Or Cells(Lig, 4).Value = "3760161138758" Or Cells(Lig, 4).Value = "5015367015500" Or Cells(Lig, 4).Value = "0085854217965" Then
.Cells(Lig, 31).Value = "TRA"
ElseIf .Cells(Lig, 28).Value < 20 Then
.Cells(Lig, 31).Value = "DOM"
ElseIf .Cells(Lig, 28).Value > 20 Then
.Cells(Lig, 31).Value = "DOS"
Puis, comme ma liste des conditions va grandir, j'ai cherché une solution sur les forum afin de simplifier la syntaxe. J'ai repris un sujet sur les tableaux. Cela donne ceci
Sub Bouton3_Cliquer()
'liste des EAN pour lesquels le transports est TRA
Dim EAN As Variant 'déclare la variable EAN (liste des EAN)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
'définit le tablau des EAN
EAN = Array("3760161137454", "3760161138758", "5015367015500", "0085854217965")
'définit le tablau des correspondances TC
Set PL = ActiveSheet.Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)
For Each CEL In PL ' boucle 1 : sur toutes les cellule CEL de la palge PL
For I = 0 To UBound(EAN) 'boucle 2 : sur tous les mots du tableau des EAN
'si l'EAN du tableau est contenu dans la cellule CEL, renvoie dans la colonne AE le mot correspondant tu tableau des correspondances, sort de la boucle 2
If InStr(1, CEL.Value, EAN(I), vbTextCompare) = 1 Then CEL.Offset(0, 27).Value = "TRA": Exit For
ElseIf CEL.Offset(0, 24).Value < 20 Then CEL.Offset(0, 27) = "DOM"
ElseIf CEL.Offset(0, 24).Value > 20 Then CEL.Offset(0, 27) = "DOS"
Next I 'prochain mot de la boucle 2
Next CEL 'prochaine cellule de la boucle 1
End Sub
Le problème vient de mes 2 Else iF
ElseIf CEL.Offset(0, 24).Value < 20 Then CEL.Offset(0, 27) = "DOM"
ElseIf CEL.Offset(0, 24).Value > 20 Then CEL.Offset(0, 27) = "DOS"
Ce donne une" erreur de compilation : else sans if"
1 - Je ne comprends pas pourquoi il n'y a pas de end If mais que cela fonctionne sans mes 2 lignes
2- je ne comprends pas pourquoi j'ai cette erreur
Merci
Bonjour,
Une boucle If s'écrit ainsi :
If (condition) Then
Instruction1
Else
Instruction2
End If
Tu peux ajouter une seconde condition :
If (Condition1) Then
Instruction1
ElseIf (Condition2) Then Instruction2
End If
Mais un "ElseIf" n'accepte pas d'alternative "Else" à ma connaissance, ou alors il faut écrire :
If (Condition1) Then
Instruction1
Else
If (Condition2) Then
Instruction2
Else
Instruction3
End If
End If
Dans tous les cas, tu ne peux écrire (et c'est de là que vient ton erreur):
If (condition) Then
Instruction1
Else
Instruction2
Else
Instruction3
End If
Tu peux aussi t'orienter vers ce type d'écriture :
Select Case (valeur à tester)
Case 1, 3
Instruction1
Case 4 To 10
Instruction2
Case Is > 10
Instruction3
End Select
Bonjour,
On pourrait ajouter qu'il faut éviter les " : " dans ton code. Ça rend le code plus difficile à lire...
Il faut éviter également les structures :
If condition Then instruction
Comme cette structure ne nécessite pas de End if tout doit tenir dans la ligne (Donc pas de Else ni de ElseIf dans la ligne suivante...)
De plus cela rend également le code un peu plus difficile à lire : Il vaut mieux 1 ou 2 ligne de plus avec une indentation rigoureuse qu'un code spaghetti ou il faut chercher les enchainements...
A+
Bonjour,
merci pour vos réponses mais je ne comprends toujours pas.
Dans mon premier exemple j'ai bien la structure
If condition Then
instuction 1
ElseIf condition2 Then
instruction2
ElseIf .condition3 Then
instructions3
Et cela fonctionne.
Comme cette structure ne nécessite pas de End if tout doit tenir dans la ligne (Donc pas de Else ni de ElseIf dans la ligne suivante...)
Comment déclarer mes 2 autres conditions et instructions sans else alors ?
Pour le premier exemple je ne peux pas te dire car la macro n'est pas complète :
Comme il y a plusieurs emboitements
With ...
For ...
If ...
et on ne voit pas comment tu les fermes, on ne peut que supposer que l'un deux est mal ou pas fermé.
VBA ne fait pas de différence quel que soit le problème, il renvoie le même message d'erreur quel que ce soit le problème de syntaxe rencontré : Il ne sait pas dénouer le méli-mélo.
A+
Voici mon code d'origine :
With Sheets(2)
NbrLig = .Cells(65536, 2).End(xlUp).Row
For Lig = 2 To NbrLig
If Cells(Lig, 4).Value = "3760161137454" Or Cells(Lig, 4).Value = "3760161138758" Or Cells(Lig, 4).Value = "5015367015500" Or Cells(Lig, 4).Value = "0085854217965" Then
.Cells(Lig, 31).Value = "TRA"
ElseIf .Cells(Lig, 28).Value < 20 Then
.Cells(Lig, 31).Value = "DOM"
ElseIf .Cells(Lig, 28).Value > 20 Then
.Cells(Lig, 31).Value = "DOS"
NumLig = NumLig + 1
End If
Next
End With
Mon but est de mettre toutes les valeurs possibles dans un tableau pour éviter les répétitions et les "or"
Bonjour,
merci pour vos réponses mais je ne comprends toujours pas.
Dans mon premier exemple j'ai bien la structure
If condition Then instuction 1 ElseIf condition2 Then instruction2 ElseIf .condition3 Then instructions3
Et cela fonctionne.
Comme cette structure ne nécessite pas de End if tout doit tenir dans la ligne (Donc pas de Else ni de ElseIf dans la ligne suivante...)
Comment déclarer mes 2 autres conditions et instructions sans else alors ?
Relis bien mon premier post, ta syntaxe est incorrecte !
If condition Then '<-- cette structure "If" ne termine pas par un "End If"
instuction 1
ElseIf condition2 Then 'Dans un "ElseIf", l'instruction est dans la même ligne et il ne peut pas y avoir de "Else" après
instruction2
ElseIf .condition3 Then 'Tu as un second "Else" dans ta première structure "If", c'est ininterprétable pour Excel
instructions3
Alors ce n'est surement pas très correct comme code mais , désolé de te contredire, Excel l'interprète bien puisque cela marche très bien
With Sheets(2)
NbrLig = .Cells(65536, 2).End(xlUp).Row
For Lig = 2 To NbrLig
If Cells(Lig, 4).Value = "3760161137454" Or Cells(Lig, 4).Value = "3760161138758" Or Cells(Lig, 4).Value = "5015367015500" Or Cells(Lig, 4).Value = "0085854217965" Then
.Cells(Lig, 31).Value = "TRA"
ElseIf .Cells(Lig, 28).Value < 20 Then
.Cells(Lig, 31).Value = "DOM"
ElseIf .Cells(Lig, 28).Value > 20 Then
.Cells(Lig, 31).Value = "DOS"
NumLig = NumLig + 1
End If
Next
End With
Es-tu certain de toi ? Mon avis, c'est qu'il ne te pose pas de problème tant qu'il ne rentre pas dans certaines conditions qui produisent une erreur d’exécution.
Aussi, tu devrais faire bon usage des tabulations pour avoir des retraits cohérents de chaque ligne de ton code avec la structure a laquelle elle dépend...
Merci, du conseil. C'est vrai que c'est brouillon et on s'y perd. Je vais être plus soigneux
Je vais donc chercher du côté de Select Case comme tu me l'a précédemment recommandé et reviendrais monter le résultat et clore le sujet.
Merci
Tant que tu ne nous mettras que des bribes de code, tu as toute les chances d'avoir des réponses incomplètes.
Une macro se comprend depuis Sub... jusqu'à End Sub toute tentative de la réduire à quelques lignes réduit également des chances d'avoir des réponses pertinentes.
Le bout de macro N° 1 corrigée :
With Sheets(2)
NbrLig = .Cells(65536, 2).End(xlUp).Row
For Lig = 2 To NbrLig
If Cells(Lig, 4).Value = "3760161137454" Or _
Cells(Lig, 4).Value = "3760161138758" Or _
Cells(Lig, 4).Value = "5015367015500" Or _
Cells(Lig, 4).Value = "0085854217965" Then
.Cells(Lig, 31).Value = "TRA"
ElseIf .Cells(Lig, 28).Value < 20 Then
.Cells(Lig, 31).Value = "DOM"
ElseIf .Cells(Lig, 28).Value > 20 Then
.Cells(Lig, 31).Value = "DOS"
'NumLig = NumLig + 1 'Instruction mal placée à supprimer
End If
NumLig = NumLig + 1 'Ceci est la bonne place
Next
End With
Nota : Quand tu as un With... End with tous les objets concernés doivent être précédés d'un point. (Et pas seulement quelques Cells quand tu as le temps...)
Après pour la logique de cette section quand tu auras rajouté les points manquants, je garantis que la partie corrigée ne posera pas de problème quelque soit le nombre de "Or"
Nota2 : Les guillemets ne servent à rien dans ces expressions :
If Cells(Lig, 4).Value = "3760161137454" Or _
Cells(Lig, 4).Value = "3760161138758" Or _
Cells(Lig, 4).Value = "5015367015500" Or _
Cells(Lig, 4).Value = "0085854217965" Then
A+
Bonjour,
j'ai finalement utilisé le Select Case.
Mais je fais 2 boucles. La première vérifie un prix dans une colonne et renvoie la valeur DOS ou DOM. La deuxième vérifie un EAN et renvoie TRA en écrasant donc certaines valeurs DOS et DOM.
Sub transport_choix()
Dim c As Range
Dim SKU As Range
Set SKU = ActiveSheet.Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)
Dim c2 As Range
Dim PRIX As Range
Set PRIX = ActiveSheet.Range("AB2:AB" & Range("AB" & Rows.Count).End(xlUp).Row)
For Each c2 In PRIX
Select Case c2.Value
Case Is < 20
c2.Offset(0, 3).Value = "DOM"
Case Is > 20
c2.Offset(0, 3).Value = "DOS"
Case Else
End Select
Next c2
For Each c In SKU
Select Case c.Value
Case "3760161137454", "3457707900053", "5023084204794", "4891372637361", "3760161138758"
c.Offset(0, 27).Value = "TRA"
Case Else
End Select
Next c
End Sub
Cela fonctionne et pour moi il est facile de rajouter des EAN.
Par contre je voudrais déclarer cette suite dans une variable pour l'utiliser ailleurs. Du genre
Liste = "3760161137454", "3457707900053", "5023084204794", "4891372637361", "3760161138758"
et mettre Case Liste au lieu de
Case "3760161137454", "3457707900053", "5023084204794", "4891372637361", "3760161138758"
Avez-vous une idée ?
MErci