End If sans Bloc If

Résolu
Bonjour,
Je ne vois pas pourquoi il met mets l'erreur (classique certes) End If sans bloc IF

Application.DisplayAlerts = False
For Each Sheet In ThisWorkbook.Worksheets
If Not Sheet.Range("G3") = DateSerial(2009, 1 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 2 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 3 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 4 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 5 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 6 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 7 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 8 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 9 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 10 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 11 + 1, 0) And _
Not Sheet.Range("G3") = DateSerial(2009, 12 + 1, 0) And _
Not Weekday(Sheet.Range("G3")) = 6 And _
Not Sheet.Range("G3") < Date - 8 _
Then Sheet.Delete _
Else
End If

Next Sheet

Application.DisplayAlerts = True

Merci pour votre aide !!!!
Configuration: Windows XP
Firefox 3.0.14

12 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Bonjour,

    Je n'ai aucune idée du langage dans lequel tu programmes, mais à mon avis, l'erreur est affichée parce que tu n'as aucune instruction dans ton bloc 'Else', ou alors parce que cette ligne de code est mal terminée (caractère obligatoire de fin de ligne peut-être ?)

    Puisque tu ne fais rien de ton cas 'Else', supprime cette ligne et passe directement à ton 'EndIf', ça ne devrait plus marquer l'erreur.
    1. Bonjour

      Sais-tu ce que veut dire le _ à la fin de la ligne ?
      il veut dire que la ligne suivante doit être mise au bout de la précédente, et non pas considérée comme une ligne différente. C'est comme si tu avais écrit du if ... jusqu'au else sur une seule ligne
      Quand le if et les instructions qui le suivent sont sur une seule ligne en VB, il ne faut pas de endif.

      Tu as le choix entre les deux options
      1 - instructions sur la même ligne logique que le if, pas de endif
      If Not Sheet.Range("G3") = DateSerial(2009, 1 + 1, 0) And _
      ...
      Not Sheet.Range("G3") < Date - 8 _
      Then  Sheet.Delete _
      Else     ' ce "else" est sur la même ligne logique que tout ce qui précède
      

      2 - instructions sur une ligne logique différente de celle du if, il faut un endif
      If Not Sheet.Range("G3") = DateSerial(2009, 1 + 1, 0) And _
      ...
      Not Sheet.Range("G3") < Date - 8 _
      Then 
      Sheet.Delete ' cette instruction n'est pas sur la même ligne logique que le if.. then
      Else       ' donc le else doit aussi être sur une ligne différente
      End If   'et il faut un endif
      


      Il est inutile de mettre un else vide. Si tu choisis la variante 1, n'oublie pas d'enlever le _ après SheetDelete sinon la ligne suivante sera mise à la suite
      1. J'ai compris ce que tu as mis, je te remercie. Malheureusement j'ai essayé les deux ça ne marche pas, alors je remet ici parce que je comprends pas l'erreur :
        Sub SupprOnglet()

        'Suppression des onglets dont la date de mise à jour est : Supérieure à 8 jours pa rapport à la date dajou'dhui, n'est pas un vendredi, n'est pas le dernier jour d'un mois de l'année

        Application.DisplayAlerts = False
        For Each Sheet In ThisWorkbook.Worksheets
        If Not Sheet.Range("G3") = DateSerial(2009, 1 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 2 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 3 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 4 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 5 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 6 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 7 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 8 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 9 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 10 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 11 + 1, 0) Or _
        Not Sheet.Range("G3") = DateSerial(2009, 12 + 1, 0) Or _
        Not Weekday(Sheet.Range("G3")) = 6 Or _
        Not Sheet.Range("G3") < Date - 8 _
        Then Sheet.Delete

        Next Sheet

        Application.DisplayAlerts = True

        End Sub

        Je m'excuse mais je trouve pas....
        Il m'indique une erreur sur le Then apparement mais j'ai tout essayé
        1. Quel message d'erreur as-tu ?
          Car chez moi ça marche, Je crée un classeur vide avec 3 feuilles, il m'efface toutes mes feuilles (mais plante sur la dernière car il faut obligatoirement en laisser une)
          1. Bonjour,

            D'après le code que tu postes, il te manque un End If.
            Je vois le IF, je vois le THEN, mais il manque le END IF.
            1. Non, il ne manque pas de endif. Voir message 3
          2. En effet, je n'avais jamais essayé de l'écrire sans le end if, je viens de faire un test et ça marche.
            Toutes mes excuses, ça m'apprendra à survoler les posts :s !
            1. quand je la teste dans une fichier vierge avec que la date en G3, mais dès que je l'applique à mon fichier il me bloque sur "Not Sheet.Range("G3") < Date - 8 _ " ... je crois que j'ai assez mangé de ça aujourd'hui, je rataque demain !!!! ça m'agace!
              1. Contributeur
                Etant donné ce qu'à dit Le_père dans son post 3, je dirai qu'il faut que tu vire le caractère '_' en fin d'instruction dans ton IF, sinon ça concatène la ligne suivante qui est le THEN. C'est bien comme ça que ça marche ?
                1. Le then DOIT être sur la même ligne que le if, donc non seulement il n'y a pas d'inconvénient à le concaténer mais c'est obligatoire.
                  Par contre, c'est entre le then et l'instruction qui suit qu'il peut y avoir ou non une coupure de ligne. Mais les deux sont autorisés, le programme du post 4 ne présente aucune erreur à ce sujet
              2. Tu ne m'as toujours pas dit quel était le message d'erreur...
                Effectivement, avec un fichier non vide j'ai reproduit un problème d'incompatibilité de type. Si G3 contient autre chose qu'une date (un texte en particulier), il ne peut pas faire la comparaison. Si c'est ton cas, utilise isdate() pour savoir si G3 contient une date, avant de faire la comparaison.
                1. comment on utilise isdate ? je ne connais pas?
                  1. Contributeur
                    Est-ce que tu as fais la modification indiquée dans le post 10 ?
                  2. Comme pour toutes les fonction VB, tu écris isdate dans un module et tu fais F1 dessus :) L'aide t'explique tout.
                    Dans ce cas, très simplement isdate(qqchose) te rend true si qqchose est une date, et false si qqchose n'est pas une date. Ensuite, à toi de ne faire des comparaisons avec des dates que si Isdate t'a rendu true.
                    En supposant que ton problème est bien celui que j'ai reproduit, car tu ne m'as toujours donné aucun message d'erreur.
                2. c'était ça en fait j'avais des anciennes feuilles sur lesquelles il y avait des nombres et pas des dates... pfiouuu !!
                  Merci du coup de main !!

                  Pour les erreurs moi ça me met juste débodage, et tout en jaune ce qui pose pb.

                  Maintenant c'est ok!
                  Merci