Boucle Do Loop erreur

Résolu
bthenault -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai créé une boucle Do - Loop, à la quel j'ai intégré plusieurs condition.

Z = 1
Sheets(Z).Select

Do Until Z = 12
If Not Sheet.Range("G3") = DateSerial(2009, 1 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 2 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 3 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 4 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 5 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 6 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 7 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 8 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 9 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 10 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 11 + 1, 0) Then
If Not Sheet.Range("G3") = DateSerial(2009, 12 + 1, 0) Then
If Not Weekday(Sheet.Range("G3")) = 6 Then
If Sheet.Range("G3") < Date - 8 Then Sheet(Z).Delete
End If
Z = 1 + 1

Loop

End Sub

En fait chaque feuille contient une date en G3. Si celle-ci n'est pas le dernier jour d'un mois de l'année, ni un vendredi, ni inférieur à 8 jours par rapport à aujourd'hui, alors la feuille doit être supprimée.
Mon problème :
- Quand je lance la macro, elle m'indique une erreur "Loop sans Do", pourtant mon Do existe, j'ai essayé différents alignements, je ne comprends pas pourkoi il ne le retrouve pas. Il doit manquer quelque chos,e le soucis, c'est que je ne trouve rien dans mes doc qui m'indique l'erreur commise...

Merci de m'aider, car cela fait depuis hier que je crise dessus! lol
Merciiiiiiiiiiiii
Configuration: Windows XP
Firefox 3.0.14

4 réponses

  1. le père
     
    Bonjour

    Il faut un endif pour chaque if - then (quand le then est à la fin de la ligne), tu es loin du compte...
    VB cherche le 'Do' correspondant à ton Loop à l'intérieur du dernier "if" ouvert.
    Dans ton cas, le plus simple est de mettre des AND à la place des then suivis de if :
    If Not Sheet.Range("G3") = DateSerial(2009, 1 + 1, 0) AND _
    If Not Sheet.Range("G3") = DateSerial(2009, 2 + 1, 0) AND _
    If Not Sheet.Range("G3") = DateSerial(2009, 3 + 1, 0) AND _
    ...
    0
  2. le père
     
    pardon, j'ai laissé traîner des if...
    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 _
    ...
    0
    1. bthenault Messages postés 58 Statut Membre 1
       
      du coup j'ai fait comme ça :
      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
      Mais il met dit "END IF" sans If... alors je pige pas
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > bthenault Messages postés 58 Statut Membre
         
        Excusez-moi d'avoir dérangé en proposant une alternative
        Mais, rassures toi, cela ne se reproduira plus, bthenault...
        Merci car cela me libère du post concernant le publipostage où je terminais une proposition
        0
  3. bthenault
     
    super !!! je m'étais aperçu ce matin qu'il fallait "fermer" les If, mais pour les AND je savais pas ça!!! On fait toujours trop compliker !!!! Merciiiiiiiiiiiiiiiiiii
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    A la bourre certes mais

    dans chaque feuille par exemple en H3
    =((G3=FIN.MOIS(G3;0))+(JOURSEM(G3)=6)+(G3>AUJOURDHUI()-8))>0
    renvoie vrai si une des conditions de non-destruction existe

    macro
    Sub virer_feuille_si()
    Dim nbre As Byte, z As Byte
    Dim onglet As String, feuille As String
    
    nbre = ThisWorkbook.Sheets.Count
    onglet = Sheets(nbre).Name
    
    z = 1
    feuille = Sheets(z).Name
    While feuille <> onglet
        If Not Sheets(z).Range("H3") Then
            Application.DisplayAlerts = False
            Sheets(z).Delete
            Application.DisplayAlerts = True
        Else
            z = z + 1
            feuille = Sheets(z).Name
        End If
    Wend
    End Sub


    ci joint tite démo
    https://www.cjoint.com/?jDo1PLXrZo
    0