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

Fermé
wuhrlinanthony Messages postés 52 Date d'inscription mercredi 29 juillet 2015 Statut Membre Dernière intervention 5 juillet 2017 - 20 juin 2016 à 05:26
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 20 juin 2016 à 11:31
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

eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
20 juin 2016 à 07:47
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
wuhrlinanthony Messages postés 52 Date d'inscription mercredi 29 juillet 2015 Statut Membre Dernière intervention 5 juillet 2017
20 juin 2016 à 10:23
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
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
20 juin 2016 à 10:34
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
wuhrlinanthony Messages postés 52 Date d'inscription mercredi 29 juillet 2015 Statut Membre Dernière intervention 5 juillet 2017
20 juin 2016 à 10:50
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
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
20 juin 2016 à 11:31
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