Utilisation If Else Then

DoReg

XLDnaute Nouveau
Bonjour à tous,

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 ? :rolleyes:

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 ...

Merci de vos réponses, bon week-end
 

Pierrot93

XLDnaute Barbatruc
Re : Utilisation If Else Then

Bonjour Doreg, Philippe:)

essaye peut être ceci :
Code:
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
bon après midi
@+
 

Misange

XLDnaute Barbatruc
Re : Utilisation If Else Then

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.
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Utilisation If Else Then

Re, bonjour Misange:)

Aarf ... sauf erreur doit manquer les ":" non...
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
 

DoReg

XLDnaute Nouveau
Re : Utilisation If Else Then

Re-bonjour !

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 ... :(

Merci de vos réponses!
 

Pierrot93

XLDnaute Barbatruc
Re : Utilisation If Else Then

Bonjour,

essaye comme ceci :
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:
    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

bon après midi
@+
 

Misange

XLDnaute Barbatruc
Re : Utilisation If Else Then

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
 

Si...

XLDnaute Barbatruc
Re : Utilisation If Else Then

salut

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
 

Discussions similaires

Statistiques des forums

Discussions
312 503
Messages
2 089 055
Membres
104 013
dernier inscrit
VELONDAHY Mickaël