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

Rechercher des sujets similaires à "else"