Else sans IF - (Code avancé)

Bonjour a tous et a toutes et avis a ceux qui aime se creuser la tête !

J'ai un petit problème avec le code d'une macro, où l'erreur "Else sans IF" apparait.
J'ai pourtant vérifier l'intégralité des IF..THEN..ELSE..END IF et je ne voit pas ou est le problème

J'ai conscience que le code est plutôt illisible et de plus il contient des règles ingénieries que je ne pourrais vous expliquez en quelque ligne.
Si vous pouviez jetez un œil sur la construction et me dire ce que vous pensez ça serait top !

Merci d'avance

PS : Merci de ne pas tenir compte des multiple "DIM AS" inutile

8classeur1.xlsm (45.73 Ko)

Bonjour,

En général, ce genre de messages survient lorsqu'une instruction n'est pas correctement fermée.

En l'occurrence, vous aviez 2 next qui se baladaient à la fin sans boucle for correspondante. Je pense que vous avez fait un peu de restructuration...

Je les ai effacés mais je n'ai pas testé.

Cdlt,

4classeur1.xlsm (45.09 Ko)

Bonjour, je vais regarder ça, en effet j'ai fait une restructuration, mais étant débutant en code VBA et ayant a faire a un code conséquent je me perd un peu dans ces tunnels de conditions et de boucle

J'ai créer tout le code intérieur personnellement mais la boucle de recherche par fichier et par dossier a été récupéré et adapter d'une autre Macro.

Merci beaucoup pour l'aide je regarde ça !

Alors j'ai revérifier tout les portes et boucle en prenant en compte tes remarques, mais j'ai toujours la même erreur.

Est-ce que ca pourrait venir de mes deux IF de suite ? (Voir Screen)

9classeur1.xlsm (46.82 Ko)
screenshot 2

Alors franchement, j'ai parcouru rapidement les if car je n'ai jamais vu ça de ma vie , j'étais légèrement déconcerté... J'ai plutôt cherché un end with ou un next manquant et j'ai vu qu'il y avait 2 next en trop...

Ah oui, les 2 if sont à examiner...

Oui ça ce comprend, en effet j'aimerais faire un traitement automatisé des poteaux, mais il y a des solutions différentes pour tout les combinaisons de conditions possible donc..

Sur le bout de code que j'ai mis en Screen, ce que j'aimerai c'est que il essaye le premier IF, si ce n'est pas le cas il passe au deuxième IF, et si ce n'est pas le cas non plus il passe au ELSE pour tout les autres cas

Je ne sais pas si je me suis bien exprimé ?

Oui, c'est assez clair. Il faudrait quelque chose comme ça :

If cond1 then
    instruc1
elseif cond2 then
    instruc2
else
    suite du code

En essayant cette construction j'ai un message d'erreur qui me dit " Cette instruction doit être la première de la ligne"

screenshot 3

Il faut les coller. Par exemple :

If
elseif
elseif
elseif
else
    if
    elseif
    else
    end if
end if

J'en ai vu 2 dans votre codes :

sub solution()

'....
If Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 6).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 7).Value = "Non" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 8).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 9).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 10).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 11).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 12).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 29).Interior.Color = RGB(250, 170, 70) Or RGB(146, 208, 80) Then
    Workbooks(Nom_Classeur_Macro).Sheets("FT").Cells(Incrementation_Ligne, 9).Value = "Recalage"                                                                                                                 'MI6 - Voisinage elec:no - Appui strat:no - Utilisable en l'état:no + (et uniquement le control de verticalité:no) - Milieu:TER/BMP - Resultat:vert/orange'
ElseIf Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 6).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 7).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 8).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 9).Value = "Non" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 10).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 11).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 12).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 29).Interior.Color = RGB(250, 170, 70) Or RGB(146, 208, 80) Then
    Workbooks(Nom_Classeur_Macro).Sheets("FT").Cells(Incrementation_Ligne, 9).Value = "Réaménagement"                                                                                                            'MI6 - Voisinage elec:no - Appui strat:no - Utilisable en l'état:no + (et uniquement le voisinage ERDF:no) - Milieu:TER/BMP - Resultat:vert/orange'
Else

'suite code

If Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 6).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 7).Value = "Non" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 8).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 9).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 10).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 11).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 12).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 29).Interior.Color = RGB(250, 170, 70) Or RGB(146, 208, 80) Then
                                    Workbooks(Nom_Classeur_Macro).Sheets("FT").Cells(Incrementation_Ligne, 7).Value = "Recalage"                                                                                                                                                                                                                                                                                                                                                                                                                                        'MI6 - Voisinage elec:yes - Appui strat:no - Utilisable en l'état:no + (et uniquement le control de verticalité:no) - Milieu:TER/BMP - Resultat:vert/orange'

ElseIf Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 6).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 7).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 8).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 9).Value = "Non" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 10).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 11).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 12).Value = "Oui" And Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet).Cells(i, 29).Interior.Color = RGB(250, 170, 70) Or RGB(146, 208, 80) Then
                                    Workbooks(Nom_Classeur_Macro).Sheets("FT").Cells(Incrementation_Ligne, 7).Value = "Réaménagement"                                                                                                                                                                                                                                                                                                                                                                                                                                   'MI6 - Voisinage elec:yes - Appui strat:no - Utilisable en l'état:no + (et uniquement le voisinage EDF:no) - Milieu:TER/BMP - Resultat:vert/orange'

Else

Vous devriez faire quelque chose comme ça en début de macro :

Dim fNumOng as worksheet, fFT as worksheet

Set fNumOng = Workbooks(Classeur_CAPFT).Sheets(Numero_Onglet)
Set fFT = Workbooks(Nom_Classeur_Macro).Sheets("FT")

'....

With fNumOng
    if .cells(i, 6).value = "Oui" And .cells(i, 7).value = "Non" and ... then
    '.....
End with                                                                                                                                                                                                                                                                                                                                                                                                                                

Ca faciliterait la relecture.

Et je ne sais pas exactement ce que vous testez mais il peut y avoir plus simple :

- boucler sur les colonnes : for k = 6 to 12
- utiliser des fonctions : Application.countif(Range("F" & i & ":L" & i), "Non") >>> compte le nombre de "Non" dans la plage spécifiée
- Utiliser l'instruction Select case, par exemple :

Select Case k
    Case 6
        if .cells(i, k).value = "Oui" then
            instruction
        else
            autre instruction
        end if
    Case 7: (Instruction)
    Case 8: (Instruction)
    Case 9: (Instruction)
    Case 10: (Instruction)
    Case 11: (Instruction)
    Case 12: (Instruction)
    Case else: (Instruction)
End select

Car là, ça me semble trop complexe...

J'ai essayer la construction suivante :

If "condition1" Then
Résultat1
Else If "condition2" Then
Résultat2
Else
Résultat3

J'ai également essayer ça :

If "condition1" Then Résultat1
Else If "condition2" Then Résultat2
Else
Résultat3

Mais j'ai toujours : " Cette instruction doit être la première de la ligne"

J'ai ne comprend pas ce qu'il ne vas pas la condition me semble pourtant simple, j'ai du mal comprendre quelque chose ?

Effectivement j'ai deux fois cette petite séquence dans mon code.

Je note les idées mais si je pouvais la faire fonctionner avec ce code cela m'éviterai de tout reprendre a zéro

Merci beaucoup pour votre temps et votre aide !

L'instruction ElseIf se rapporte au groupe If auquel elle appartient. Si la condition 1 est fausse, la condition 2 (dans le elseif) est testé (et on peut en ajouter comme ça nous chante), puis si toutes ces conditions sont fausse, l'instruction du else est effectuée.

Mais si la condition du if ou l'un des elseif (j'ai limpression de refaire ton code là !) est vraie, l'instruction qui s'y rapporte sera exécutée et on ne s'intéressera plus aux autres.

If a = "Oui" then
    ...
Elseif a = "Non" then '<<<<<<ElseIf collés en un mot
    ...
Elseif a = "peut-etre" then
    ...
elseif a = "je ne sais pas" then
 ...
else 'c'est-à-dire aucune de ces options ("" par exemple)
...
end if

Le mot Elseif est un seul mot et c'est différent de

If a = "Oui" then
    ...
Else
    if a = "Non" then
        ...
    elseif a = "peut-etre" then
        ...
    else
        ...
    end if
end if

L'exemple n'est probablement pas le meilleur mais dans le premier cas, les conditions sont sur le même plan (dès qu'une vraie, on sort du bloc if) alors que dans le second cas, les conditions "non", "peut-etre" sont subordonnées au premier Else (il y a une hiérarchie des conditions, bien présente dans ton code !). Et ça peut être intéressant quand on doit tester une seconde condition selon le résultat de la première condition.

Mais un petit article vaut mieux que mes explications :

https://docs.microsoft.com/fr-fr/office/vba/language/concepts/getting-started/using-ifthenelse-state...

J'avais effectivement mal compris, l'erreur viens du fait que j'ai écrit "Else If" au lieu de "ElseIf"

La Macro se lance, Merci beaucoup pour ton aide et désoler pour le mal de tête.
Effectivement je suis novice dans le code et j'apprend seul, je n'ai donc aucune mécanique pour ce qui est d'optimiser la lecture en simplifiant le code au plus possible, le code est écrit "en dur".

Merci beaucoup pour tout !

(en espérant ne pas me retrouver bloquer trop vite)

Allez je vais tester tout ça

Oui, je comprends bien, il n'y a pas de souci.

Je comprends aussi que tu veuilles par écraser ton code mais si tu créais un fichier bis, tu pourrais essayer de la refaire, cette fois-ci sans toutes ces imbrications de If. Parce que le jour où tu devras te replonger dedans, .

Est-ce que tu pourrais m'expliquer rapidement ce que tu dois faire et dans quel cas ?

Alors en fait j'ai des donné concernant des poteaux, et en fonction de différents test effectué sur les appui et de plein d'autre paramètre je traite l'ensemble des appui en fonction des règles d'ingénierie

La macro à pour but de me donner des solution dans l'ordre de priorité automatiquement en fonction des paramètres relever dans le tableau capft et des règles d'ingénierie

Oui effectivement pour ce replonger dedans ça sera compliqué (surtout que tout ce code concerne 1 seul type de poteau (ici MI6) et j'en ai une 20aine à inclure encore en copier coller de ce code) mais je vais mettre des balise car le code en lui même ne changera pas mais juste les solutions proposées

Je sais pas si j'ai été clair ?

Oui, l'explication sommaire est claire mais je voulais plutôt connaitre toutes les conditions, dans leur ordre de priorité, et leurs instructions afin d'essayer de trouver des dénominateurs communs et de factoriser les éléments répétitifs du code.

Edit : enfin, je veux dire, sans avoir à me farcir tout le code tel qu'il est

Je l'ai sous forme de diagramme qui s'apparente plus à un labyrinthe

Malheureusement je ne peut partager ces règles d'ingénierie comme ça publiquement sur le forum :/

Mais je doit avoir une 20aine de type d'appui differents

Avec pour chaque appui 36 suite de priorité différente en fonction de 6 critères

Jai potasser ça un moment mais peut importe ce que j'essaye de regrouper, ou par quel critère je commence à traiter (ici le type d'appui, ou MI6 est un poteau métallique simple de 6m), mais rien ne me permet d'éviter ces cascades de if

En complexifiant un peu mon code je pourrai regrouper les appui par type ex (MI) et traiter les hauteur par la suite ce qui je pense réduirait mon code de quelques lignes au lieu de traiter MI6 et MI7 séparément

Mais dans l'idée je préfère pouvoir traiter chaque cas individuellement plutôt que de grouper (généralisé), car petite précision, le programme sera sûrement adapté à de nouvelles règles d'ingénierie en fonction de la zone géographique du projet d'étude..

Rechercher des sujets similaires à "else code avance"