J'ai un problème avec l'utilisation de If, Then, Else... Malgré de nombreux sites consultés, je ne comprend pas comment cela fonctionne ! Est-ce que quelqu'un pourrait m'expliquer dans uhn langage pour novice s'il vous plait ?
De plus, j'ai un problème avec le morceau de code suivant :
Code:
If MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbYes Then _
Windows("Formulaire à compléter.xls").Activate
Sheets("Feuil1").Select
Range("C5:C12,A25:H51").Select
Selection.ClearContents
ElseIf MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbNo Then
MsgBox("Vous aller fermer le classeur", vbOKOnly) = vbOK
ThisWorkbook.Close SaveChanges:=False
End If
Lorsque j'active la macro correspondante, le message suivant apparaît : "erreur de compilation : Else sans If", pour la ligne :
Code:
ElseIf MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbNo Then
L'erreur doit être minime, j'avais trouvé une solution, mais que j'ai effacé par maladresse mad, et je ne la retrouve pas ...
If MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbYes Then
Windows("Formulaire à compléter.xls").Sheets("Feuil1").Range("C5:C12,A25:H51").ClearContents
Else
MsgBox "Vous aller fermer le classeur", vbOKOnly
ThisWorkbook.Close SaveChanges:=False
End If
Bonjour dans ton code tu as un _ après le then. C'est un signe(lespace suivi de l'underscore) qui indique à excel que toutes les instructions sont sur la même ligne même si visuellement tu les répartis sur plusieurs pour que ce soit plus facile à relire.
If MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbYes Then _
si tu écris
if truc=machin then msgbox"coucou"
tout tient sur la même ligne et tu n'as pas besoin de mettre de end if
Si truc est différent de machin il ne se passe rien, pas la peine dans ce cas là de le préciser
si ce que tu veux mettre après le then est long tu peux fractionner sur plusieurs lignes en utilisant le _ mais alors il faut le répéter à chaque fin de ligne :
Code:
If MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbYes Then _
Windows("Formulaire à compléter.xls").Activate _
Sheets("Feuil1").Select _
Range("C5:C12,A25:H51").Select _
Selection.ClearContents
if truc= machin then
msgbox "coucou"
else
msgbox "pas coucou"
end if
là tu dois mettre le end if
pour compacter l'écriture tu as deux signes utiles l'espace suivi de l'underscore d'une part et le : d'autre part
_ permet d'aller à la ligne, : évite de le faire
if truc= machin then
msgbox "coucou"
else: msgbox "pas coucou": autres instructions VBA : encore d'autres instructions
end if
tu ne peux pas mettre
if truc= machin then msgbox "coucou"
else: msgbox "pas coucou"
sans mettre le end if
Sinon la structure d'un test if then else est toujours la même :
if condition then
ce qu'on fait si la condition est remplie
else
ce qu'on fait si elle n'est pas remplie
end if
dans d'autres langages de programmation, on ne termine pas le code par un end if. Avec VBA c'est obligatoire.
If MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbYes Then _
Windows("Formulaire à compléter.xls").Activate: _
Sheets("Feuil1").Select: _
Range("C5:C12,A25:H51").Select: _
Selection.ClearContents
Merci encore pour vos réponse, je pense avoir à peu près compris comment cela fonctionne... à quelque chose près : j'ai une nouvelle erreur qui apparaît, je commence à désespérer !
Voici le code complet :
Code:
Sub sauveFeuille()
With ThisWorkbook
If .Sheets("Feuil1").Range("B2") = "" Then: Exit Sub
Else: Workbooks.Open "L:\commun\DORINE\Suivi formations\" & .Sheets("Feuil1").Range("B2").Value & ".xls": _
.Sheets("Feuil1").Copy after:=Workbooks(.Sheets("Feuil1").Range("B2").Value & ".xls").Sheets(Worksheets.Count): _
ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count).Name = .Sheets("Feuil1").Range("C5").Value: _
ActiveWorkbook.Save
End If
If MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbYes Then _
Windows("Formulaire à compléter.xls").Activate: _
Sheets("Feuil1").Select: _
Range("C5:C12,A25:H51").Select: _
Selection.ClearContents
Else: MsgBox("Vous aller fermer le classeur", vbOKOnly) = vbOK: ThisWorkbook.Close SaveChanges:=False
End If
End With
End Sub
L'erreur est la suivante pour le premier "else" du code: "erreur de compilation : Else sans If".
Je ne comprend pas d'où vient cette erreur, je pensais pourtant avoir suivi à la lettre les indications de Misange ...
If MsgBox("Feuille enregistrée dans le classeur correspondant, voulez-vous saisir une nouvelle fiche ?", vbYesNo) = vbYes Then
Windows("Formulaire à compléter.xls").Activate: _
Sheets("Feuil1").Select: _
Range("C5:C12,A25:H51").Select: _
Selection.ClearContents:
Else: MsgBox "Vous aller fermer le classeur", vbOKOnly: ThisWorkbook.Close SaveChanges:=False
End If
quand on débute préférable du structurer son code classiquement :
Code:
If Condition Then
action1
action2
Else
action3
action4
End If
J'approuve ++ la remarque de Pierrot. De plus ça rend le code plus lisible
dans ton code :
If .Sheets("Feuil1").Range("B2") = "" Then: Exit Sub
les instructions sur la même ligne que le then font qu'excel considère le end if comme implicite.
du coup ton else en dessous se retrouve orphelin et excel râle.
Ne te complique pas la vie. oublie les :
ne garde les instructions sur une seule ligne que pour des cas très très simples par exemple quand le else équivaut à ne rien faire.
dans ton code, quand on écrit then exist sub en général on peu s'en sortir autrement
dans le cas présent : si B2 est vide tu ne fais rien, sinon tu fais ceci cela.
Plutot que d'écrire
si b2 est vide alors exit sub
mieux vaut écrire directement le code qui doit s'exécuter si B2 est différent de ""
Code:
Sub sauveFeuille()
With ThisWorkbook
If .Sheets("Feuil1").Range("B2") <> "" Then
Workbooks.Open "L:\commun\DORINE\Suivi formations\" & .Sheets("Feuil1").Range("B2").Value & ".xls": _
.Sheets("Feuil1").Copy after:=Workbooks(.Sheets("Feuil1").Range("B2").Value & ".xls").Sheets(Worksheets.Count): _
ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count).Name = .Sheets("Feuil1").Range("C5").Value: _
ActiveWorkbook.Save
End If
End With
End Sub
Else If, End If, End With : de quoi s'y perdre.
L'intérêt du Exit Sub est de n'avoir plus, ici, à se préoccuper du End If (une ligne de moins).
Pour ma part, j'insisterais plus au niveau de la lisibilité sur une bonne indentation du code.
Code:
Sub sauveFeuille()
With ThisWorkbook
If .Sheets("Feuil1").Range("B2") = "" Then Exit Sub
'Si... =, on sort point final sinon, sous entendu, on continue
Workbooks.Open "L:\commun\DORINE\Suivi formations\" & .Sheets("Feuil1").Range("B2").Value & ".xls": _
.Sheets("Feuil1").Copy after:=Workbooks(.Sheets("Feuil1").Range("B2").Value & ".xls").Sheets(Worksheets.Count): _
ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count).Name = .Sheets("Feuil1").Range("C5").Value: _
ActiveWorkbook.Save
End With
End Sub