Aide boucle case et condition

bonjour a tous

j'essaye d'apprendre l'écriture de macro j'ai bien suivi les cours vba du site et un ami m’envoie un petit exercice

il faut que je mette en rouge claire tt les fruits rouge d'une liste

cela fait 2 jours et 4 livres pour résoudre mon problème mais ma macro ne veux pas fonctionner

j'ai surement un problème de syntaxe, ou je me suis complètement trompée sur la procédure a suivre

pouvez vous m'aider avant de perdre ts mes cheveux

merci d'avance

23ma-macro1.xlsm (18.27 Ko)

Bonjour,

Ne jamais se décourager, et un peu de méthode pour bâtir ta macro.

1) Tu n'échappes pas à la définition a-priori des fruits rouge à détecter dans la liste, il faut donc dresser une liste des fruits rouges.

Tu peux effectivement par la suite utiliser cette liste dans une instruction Select Case [là, il faut revoir la syntaxe] mais cela reste malcommode si la liste est longue, tu peux donc aussi en faire un tableau affecté à une variable, ce qui sera plus facile à écrire en utilisant la fonction Split. Tes fruits rouges étant en tableau, tu peux alors les défiler dans une boucle pour rechercher si chaque valeur de ta liste à tester est ou non un fruit rouge.

2) Pour tester, tu devras parcourir les valeurs de la liste au moyen d'une boucle.

Le début de la liste est fixe, mais la fin pourrait varier si on allonge ou raccourcit la liste. Il peut donc être judicieux de détecter la fin de liste dans la macro, pour que celle-ci soit réutilisable.

3) Une fois détecté qu'un élément correspond à un fruit rouge, au moyen de 2 boucles intégrées, il faut affecter la couleur de remplissage de la cellule.

Là, si l'utilisation d'un enregistrement peut être une bonne idée si on hésite sur la syntaxe et qu'on n'a pas trouvé comment coder dans l'aide, cela en est une mauvaise si l'on reproduit ce que fait l'enregistreur (qui a la déplorable manie d'allonger de façon superflue le code avec toutes les propriétés par défaut, que l'on peut omettre dès lors qu'on ne les modifie pas).

En outre dans l'hypothèse où des colorations pourraient déjà exister (et ne pas ou plus correspondre) il peut être judicieux de les supprimer, ce que l'on peut faire en une seule fois au démarrage.

Voilà pour la méthode générale.

Illustration à suivre.

wouah je suis une vrai débutante mais une vrai de vrai !

donc ou je bête ou je ne comprend rien a ce tu a répondu

je sais a peu près lire une macro existante mais j'apprends enfin j'essaye !

tu peux me réexpliquer car c'est un peu compliqué

merci

il te parle d'une "reference" fruit rouge:

un tableau avec tt les fruits rouges possible que tu utilisera pour la comparer avec le tableau a colorier.(1 boucle liste ref, 1 boucle liste a colorier et une condition valeur ref=valeur a colorier)

OU

tu liste tout les fruits rouges present dans ta liste a colorier et tu inclus tout dans le code mais c'est contraignant a modifier par la suite

(1 boucle liste a colorier et une condition pour verifier si c'est fraise, une autre pour tomate, etc...voir switch.)

On continue en illustrant l'écriture pour chaque élément :

1) Liste des fruits rouge :

On va donc dresser cette liste et la constituer en tableau dans une variable que nous appellerons fr [variable de type Variant, pouvant accueillir tout type de donnée et qui contiendra donc un tableau de données de type String].

On note que nous avons des noms de fruits qui ne se limitent pas à un mot comme 'tomate ovale' et 'fraise des bois'. On va donc faire l'économie d'une répétition 'tomate' et 'tomate ovale' en prenant 'tomate*' [* est un caractère joker indiquant qu'à la suite de tomate il peut y avoir autre chose ou rien], et même chose pour 'fraise*'.

Ce faisant, dans la comparaison pour détecter les fruits rouges, on ne pourra plus utiliser le signe = ; on utilisera alors l'opérateur Like qui permettra de vérifier si chaque élément de la liste correspond ou non au modèle de notre liste de fruits rouges.

On utilise la fonction Split pour transformer une chaîne en tableau, soit une chaîne constituée par la liste des fruits rouge que nous établissons, séparés par des espaces [l'espace est le séparateur par défaut, si on utilise un autre séparateur dans le cas où les éléments du tableau contiennent des espaces, le séparateur utilisés doit être mentionné en 2e argument de la fonction.

On aboutit donc à la ligne de code suivante :

fr = Split("tomate* framboise myrtille fraise* cassis groseille")

pour constituer notre tableau.

(à suivre)

Merci zarik pour tes compléments...

2) Etape suivante :

With ActiveSheet
        n = .Cells(.Rows.Count, 12).End(xlUp).Row
        .Range("L3:L" & n).Interior.ColorIndex = xlColorIndexNone
        coul = .Cells(7, 9).Interior.color
             [...]
End With

On fait 3 choses :

a) On cherche la dernière ligne de la liste à tester qui figure en colonne L et débute ligne 3. On affecte le numéro de ligne de fin de liste à une variable [n de type Integer, qui convient s'il n'est pas prévu que ta liste puisse dépasser 32000 lignes].

L'utilisation de la méthode End est fréquente d'utilisation pour ce faire (il convient que tu la maîtrises car tu auras sûrement à t'en resservir).

b) On élimine les couleurs préexistantes des cellules de la liste pour le cas où il y en aurait.

Utilisation de la propriété ColorIndex avec la valeur xlColorIndexNone (absence de couleur de remplissage).

c) On affecte la couleur destinée à colorer les fruits rouges à une variable [coul de type Long (les couleurs définies au moyen de la propriété Color sont des données de type Long)].

J'ai supposé ici que la couleur utilisée était celle dont on avait préalablement rempli la cellule I7 (cellule témoin). On affecte donc la valeur de couleur de cette cellule.

On peut de la même façon affecter une couleur à la variable en utilisant la fonction RGB (avec les composantes rouge, vert et bleu de la couleur souhaitée.

NB: je fais explicitement appliquer l'action à la feuille active. Sans le faire explicitement elle serait de toute façon appliquée à la feuille active en l'absence de précision relative à la feuille. Mais il est préférable de préciser, surtout s'agissant d'un exercice.

Noter l'utilisation de l'instruction With... End With qui permet de ne pas répéter l'objet auquel on se réfère.

Il reste à combler ce que j'ai laissé en [...]

3) On parcourt la liste à tester au moyen d'une boucle de 3 à n dans la colonne 12 (L). Utilisation d'une variable compteur [i de type Integer].

On s'arrête à chaque cellule pour tester la valeur de l'élément : on le fera donc au moyen d'une instruction With... End With, imbriquée dans la précédente vue en 2), qui permet de ne pas répéter la référence de la cellule de la feuille active concernée (ce qui est aussi plus rapide lors de l'exécution du code, la référence étant mémorisée par VBA qui n'a plus à la rechercher à chaque fois).

On compare la valeur de la cellule à chaque élément du tableau de fruits rouges qu'on a constitué au départ (ce qui implique une autre variable compteur [j de type Integer]).

Comparaison utilisant l'opérateur Like...

Cette 2e boucle se fera de 0 [indice minimum des tableaux VBA par défaut (si on ne la modifie pas au moyen d'une instruction Option Base 1 qui met cet indice mini à 1...) à l'indice supérieur de notre tableau que l'on va définir par la fonction : UBound(fr) pour le renvoyer. On aurait pu compter les éléments (à partir de 0) mais ainsi si l'on devait ajouter des fruits rouges à notre liste, cela réduira les modifications à apporter à la macro.

Si une valeur fruit rouge est identifiée, on affecte la couleur de remplissage à la cellule.

Et dans ce cas on sort de cette 2e boucle, car inutile de continuer à tester la même valeur !

Ce qui donne en code :

With ActiveSheet
          (...)
        For i = 3 To n
            With .Cells(i, 12)
                For j = 0 To UBound(fr)
                    If .Value Like fr(j) Then
                        .Interior.color = coul
                        Exit For
                    End If
                Next j
            End With
        Next i
    End With

(à suivre)

je vous ai envoyé un message privé a tous les 2 je ne sais pas si vous les avez reçu

4) On n'omet pas autant que possible de déclarer les variables utilisées (en début de procédure) :

fr sans indication de type car de type Variant (type par défaut lorsqu'on n'en indique pas),

n, i, j de type Integer [donc: As Integer, ou suivies de % (caractère de déclaration de type Integer) pour raccourcir]

coul de type Long (donc: As Long, ou suivie de & (caractère de déclaration de type Long) pour raccourcir]

Ce qui donne au final :

Sub ColorerFruitsRouges()
    Dim fr, n%, i%, j%, coul&
    fr = Split("tomate* framboise myrtille fraise* cassis groseille")
    With ActiveSheet
        n = .Cells(.Rows.Count, 12).End(xlUp).Row
        .Range("L3:L" & n).Interior.ColorIndex = xlColorIndexNone
        coul = .Cells(7, 9).Interior.color
        For i = 3 To n
            With .Cells(i, 12)
                For j = 0 To UBound(fr)
                    If .Value Like fr(j) Then
                        .Interior.color = coul
                        Exit For
                    End If
                Next j
            End With
        Next i
    End With
End Sub

Enfin, pour faciliter l'utilisation, on peut affecter la macro à un bouton sur la feuille (ce qui par ailleurs garantit que cette feuille sera la feuille active au lancement de la macro (enfin ! en principe car la macro peut toujours être lancée au moyen de la boîte de dialogue Macro [pour l'empêcher, après affectation au bouton, on peut ajouter un argument optionnel à la prodédure [exemple : Sub ColorerFruitsRouges(Optional m As Boolean)] qui n'empêchera pas son lancement à partir du bouton mais la fera desparaître de la boîte de dialogue Macro).

A ce stade, il n'y a plus qu'à tester...

Cordialement

Ferrand

ca marche nickel

merci beaucoup

mais je n'aurais jamais trouvé tt seule

Rechercher des sujets similaires à "aide boucle case condition"