Boucle sur une plage de donnees s'arrete apres condition rempli

wuhrlinanthony Messages postés 57 Statut Membre -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Désolé pour le titre, ce n'est pas clair car j'ai du mal à expliquer ce que je veux faire.

Je vais essayer de détailler un maximum :

J'ai une liste de plus ou moins 1000 cellules rempli par des chiffres. Je voudrais créer une boucle qui vérifie la première et la dernière cellule sur une plage de 46 cellules. Si la première et la dernière cellule égale 0 alors l'action me surligne la plage de 46 cellules en jaune et la boucle s'arrête. Si non elle continu a tourné.

Et si la boucle ne trouve pas une plage de 46 cellules commençant et finissant par 0, alors la boucle recommence mais avec une plage de 92 cellules (46*2), etc...

Voici mon fichier Excel avec une macro que j'ai essayé mais je ne suis vraiment pas sur :

https://www.cjoint.com/c/FFudxUsFIUz

S'il vous plait, si quelqu'un peut m'aider sur mon fichier et m'expliquer ce qu'il a fait (Pour apprendre en même temps :) ) , ce sera vraiment génial.

Merci beaucoup.

1 réponse

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Sub color()
        Dim adr1 As String, c As Range
    
        Set c = [B6:B1006].Find(0, LookIn:=xlValues, lookat:=xlWhole)
        If Not c Is Nothing Then
            adr1 = c.Address
            Do
                If c.Offset(46) = 0 And c.Offset(46) <> "" Then
                    c.Resize(46).Interior.ColorIndex = 6
                    Exit Do
                End If
                Set c = Cells.FindNext(c)
            Loop While c.Address <> adr1    'And Not c Is Nothing
        End If
    End Sub

    Faire F1 sur les fonctions que tu ne connais pas.
    eric

    0
    1. wuhrlinanthony Messages postés 57 Statut Membre
       
      Merci Eric pour le code

      J'ai essayer "d'agrandir" le code en ajoutant deux autres colonnes :

      Sub color()
      Dim adr1 As String, bvh As Range, emp As Range, phev As Range
      Dim adr2 As String
      Dim adr3 As String
      Set bvh = [O7:O1006].Find(0, LookIn:=xlValues, lookat:=xlWhole)
      Set emp = [P7:P1006].Find(0, LookIn:=xlValues, lookat:=xlWhole)
      Set phev = [Q7:Q1006].Find(0, LookIn:=xlValues, lookat:=xlWhole)
      If Not bvh Is Nothing Then
      adr1 = bvh.Address
      adr2 = emp.Address
      adr3 = phev.Address
      Do
      If bvh.Offset(46) = 0 And bvh.Offset(46) <> "" And emp.Offset(46) = 0 And emp.Offset(46) <> "" And phev.Offset(46) = 0 And phev.Offset(46) <> "" Then
      bvh.Resize(46).Interior.ColorIndex = 6
      emp.Resize(46).Interior.ColorIndex = 6
      phev.Resize(46).Interior.ColorIndex = 6
      Exit Do
      End If
      Set bvh = Cells.FindNext(bvh)
      Set emp = Cells.FindNext(emp)
      Set phev = Cells.FindNext(phev)
      Loop While bvh.Address <> adr1 And emp.Address <> adr2 And phev.Address <> adr3 'And Not bvh Is Nothing
      End If
      End Sub

      Je sais, c'est assez simpliste comme ajout, je pense qu'il y a mieux :) . Je suis debutant donc je cherche a faire simple.

      Ce qui est bizarre c'est qu'au lieu de me surligner les colonnes O P et Q , le code me surligne les colones R S et T.

      Tu sais pourquoi ?

      Merci pour ton aide.
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Tu ne peux pas imbriquer des .find comme ça.
      Fais-en un complet, après tu passes au suivant.
      Quand tu mets un code indente-le et utilise la balise code (icone <>)
      eric
      0
    3. wuhrlinanthony Messages postés 57 Statut Membre
       
      Ok je comprends. Je voulais integrer les deux autres colonnes dans les conditions de la boucle If.

      Je peux toujours le faire par la suite ou dois-je les integrer au code que tu as fait ?

      Une boucle avec les conditions :
      premiere et derniere cellule de la plage (46) de la colonne O = 0
      + premiere et derniere cellule de la plage (46) de la colonne P = 0
      + premiere et derniere cellule de la plage (46) de la colonne Q = 0

      Si c'est 6 conditions sont respecter, alors le code surligne en couleur la plage de 46 cellules des 3 colonnes.

      C'est un peu chiant, c'est pour ca que je ne vois pas tres clair sur ce code.

      anthony
      0
    4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Reste avec un seul .find comme je t'ai mis, seulement le test
      If c.Offset(46) = 0 And c.Offset(46) <> "" Then

      n'est plus suffisant. Complète-le avec tes conditions supplémentaires.

      Regarde l'aide sur Offset. La syntaxe complète est Offset(ligne, colonne)
      Ex : .Offset(0,1) te donne le range même ligne, 1 colonne à droite.
      0