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
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,
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)
Alors franchement, j'ai parcouru rapidement les if car je n'ai jamais vu ça de ma vie
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
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à !
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 :
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..