[VBA]Colorier 2 cellules de la même couleur

Colorier 2 cellules de la même couleur [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 24-05-2013 à 09:22:40    

Bonjour à tous,
 
Je voudrais faire une toute petite macro pour dire que si, pour chaque ligne ( donc tout i) de 2 colonnes ( G et H ici) , le contenu des 2 cellules sont les mêmes, alors on colorie les 2 cellules de la même couleur.
Sinon on les colorie d'une autre couleur
 
Voici ma macro:
 
Sub concordance()
 
 
Sheets("Base de données" ).Select
For i = 2 To 10
If Range("G" & i) = Range("H" & i) Then
Selection.Interior.Color = RGB(171, 40, 174)
End If
If Range("G" & i) <> Range("H" & i) Then
Selection.Interior.Color = RGB(174, 240, 194)
End If
Next
 
 
 
End Sub
 
Je pense vraiment que c'est tout bête mais j'y arrive pas. Je lance ma macro et rien ne se passe...
Merci vraiment de votre aide

Reply

Marsh Posté le 24-05-2013 à 09:22:40   

Reply

Marsh Posté le 24-05-2013 à 10:02:34    

 
            Bonjour.

Marc L a écrit :

Quant au code, l'icône prévue à cet effet doit être utilisée !


            Sinon pourquoi utiliser  Selection  alors que ce sont deux  Range  comparés et à colorier ?
 
            Et un seul  If  est nécessaire en utilisant la structure  If…Then…Else  (consulter l'aide d'If) …
 

Reply

Marsh Posté le 24-05-2013 à 10:13:57    

Je viens en effet de voir sur un site qu'un IF suffisait et l'instruction ELSE permettait de faire le sinon ...merci déjà pour ça !
 
ensuite je dois vous avouer que je n'ais pas compris votre message cité, ni la première ni même la seconde fois ...
Je trouve pas l'instruction après le then pour dire alors on colorie les 2 cellules de la même couleur si le contenu des 2 cellules est le même
 
Faudrait-il pas utiliser l'instruction Case pour le contenu des cellules non ?  

Reply

Marsh Posté le 24-05-2013 à 10:33:16    

 
            Et pourtant chaque icône a son info-bulle !     Celle avec un  C  comme code ‼
 
            Pas besoin d'une instruction Case pour ne faire qu'un seul test …
 
            Sinon c'est logique, si un test n'est pas vrai c'est donc qu'il est faux ‼
 
            Si deux cellules sont égales alors (If…Then)
            sinon (…Else…End If) pas besoin de les comparer vu qu'elles ne sont pas égales ‼
 
            Vous comparez quoi, vous coloriez quoi ?  Deux Range, non ? …
 

Reply

Marsh Posté le 24-05-2013 à 10:44:46    

Je compare et je colorie 2 range en effet mais ce que je voudrais dire via la macro c'est par exemple:
Si le contenu de la cellule G2=H2 ( avec par exemple G2 où c'est marqué disons "0B24" et H2 où c'est inscrit "CG54" ) alors on colorie les 2 cases de la même couleur
Sinon on ne colorie rien
Ici en l'occurrence, le contenu des 2 cellules n'est pas la même donc on colorie pas...
Et cela pour toute les lignes de ces 2 colonnes.
 
Je pensais utiliser le Range mais je crois qu'il ne fonctionne que pour des cellules à contenu numérique non ? Par exemple G2 = 12 et H12 = 10 ? D'où le fait que je pensais au Case...
 
Comment dire l'instruction on colorie les 2 cellules de la même couleur?
 
 
merci déjà de vos réponses ! Ca motive de se sentir guidé !

Reply

Marsh Posté le 24-05-2013 à 11:27:03    

 

Code :
  1. Sub Demo1()
  2.     Const X = "A", Y = "a", Z = "A"
  3.    
  4.     M = "X = Y ?   "
  5.     If X = Y Then M = M & "Oui" Else M = M & "Non"
  6.    
  7.     M = M & vbLf & vbLf & "X = Z ?   "
  8.     If X = Z Then M = M & "Oui" Else M = M & "Non"
  9.    
  10.     MsgBox M
  11. End Sub

           C'est pareil pour les cellules …
 
           Maintenant la demande n'est plus la même :sarcastic: :  coloration des Range uniquement s'ils sont égaux,
           donc même plus besoin du Else mais juste d'un simple If

Code :
  1. Sub Demo2()
  2.     Const X = "A", Y = "a", Z = "A"
  3.     If X = Y Then M = "X = Y" & vbLf & vbLf
  4.     If X = Z Then M = M & "X = Z"
  5.     MsgBox M
  6. End Sub


            Pour le reste je me répète :  ce n'est pas  Selection  qui est testée donc ce n'est pas  Selection  devant être coloriée
                                                      mais bien chacun des Range ou un Range englobant les deux.
 
            Comme indiqué du reste dans l'aide de la propriété  Interior
            et voir aussi celle de  Range  ou de  Cells  plus appropriée lors de boucles à indice numérique.
 
            Ne pas oublier l'enregistreur de macros pouvant mettre sur la piste, même si ensuite le code produit exige du nettoyage
 
            Si vous préférez utiliser une structure Select Case, libre à vous,
            mais cela ne change rien à la logique devant être mise en œuvre antérieurement à l'écriture du code …
 

Reply

Marsh Posté le 24-05-2013 à 13:23:55    

J'ai résolu mon soucis, merci en tout cas de m'avoir bien guidé Marc L :)
 
La macro que vous avez proposé me parait trop compliqué, je me suis inspiré de vos dires pour écrire cette macro qui marche !  
Sub Concordance()
 
 
Sheets("Base de données" ).Select
 
For i = 1 To 2
     
    If Range("G" & i) = Range("H" & i) Then
 Range("G" & i, "H" & i).Interior.Color = RGB(0, 255, 0)
   
     
     
    End If
     
     
Next
End Sub
 
C'était tout bête lol
merci en tout cas à votre présence régulière sur ce forum et à votre aide généreuse et précieuse Marc!

Reply

Marsh Posté le 24-05-2013 à 13:30:19    

 
           Bien !
 
           Sinon voici une autre approche :

Code :
  1. Sub Demo3()
  2.     For i = 2 To 10
  3.         With Sheets("Base de données" ).Cells(i, 7).Resize(, 2)
  4.             If .Cells(1) = .Cells(2) Then .Interior.ColorIndex = 40
  5.         End With
  6.     Next
  7. End Sub

 

Reply

Marsh Posté le 04-06-2013 à 15:51:54    

Bonjour,
 
 
J'ai un autre soucis qui rejoint un peu ce cas présent mais qui diffère légèrement ! Je ne n'ais donc pas voulu créer un autre topic .
 
 
Je souhaiterais créer une macro qui dit, pour une colonne donnée contenant dans chaque cellule un chiffre en % ( colonne calculée via une formule), si le pourcentage est disons supérieur à 10% alors on colorie la cellule.
 
Voici ma macro:
For Each cell In Sheets("" ).Range("C" & m).Cells
If Range("C" & m).Value > "10%" Then
Range("B" & m).Interior.Color = RGB(0, 255, 0)
End If
Next cell
 
 
Mais elle me colorie toutes les cellules...
 
merci de votre aide ! :)

Reply

Marsh Posté le 05-06-2013 à 00:41:50    

 
           Bonjour,
 
           dommage de ne pas avoir ouvert un nouveau sujet vu le non rapport avec le sujet de départ …
           
           Pour commencer, revoir l'aide de la structure For Each … in
           car à quoi bon définir une variable représentant chaque cellule d'une plage pour ne pas l'utiliser !
 
           Puis vérifier que contient réellement une cellule %, enfin pour mettre sur la voie,
           certainement pas du texte comme présenté en ligne n° …  oui car le code (incomplet !) n'est toujours pas encadré  
           avec l'icône adéquate pourtant déjà signalé et comme il y a pratiquement une faute par ligne …
 

Reply

Marsh Posté le 05-06-2013 à 00:41:50   

Reply

Marsh Posté le 05-06-2013 à 08:59:10    

Oui mais je me suis dit que ça recoupait mon sujet initiale et donc pas besoin de recréer un sujet ...
 
Oui vous avez raison la première ligne sert à rien ...je peux l'enlever
 
Le problème réside à faire reconnaître le pourcentage ...car le résultat affiché dans la cellule est un chiffre en % mais la cellule, toute la colonne même, sont générées via une formule...
 
Je me doutais bien que cela ne reconnaîtra pas comme ça un chiffre en % d'où le soucis que je trouve pas si simple.
 
Pourquoi il y aurait-il une faute par ligne ? Je vous avoue que j'ai jamais compris cette remarque ...je suis autodidacte et j'ai jamais suivi de cours sur les macros, pouvez vous m’éclairer là car cela vous semble si évident que ça me perturbe :(

Message cité 1 fois
Message édité par macrosoucis le 05-06-2013 à 09:00:27
Reply

Marsh Posté le 05-06-2013 à 12:26:09    

 
           Je n'ai pas jamais affirmé la non utilité de cette première ligne ‼
           Mais au contraire, la variable justement déclarée pour les cellules de la plage n'est pas utilisée dans le reste du code !
           Donc revoir l'aide de la structure  For Each … in  et son exemple …

Code :
  1. For Each cell In Sheets("" ).Range("C" & m).Cells

           cell peut prêté à confusion avec l'objet, donc soit raccourcir à Cel soit franciser par Cellule
 
           Sheets("" )  :  doit y avoir un problème là !   Qui plus est aucune définition de feuille dans les lignes suivantes !
                                                  Voir l'exemple de  With  dans mon code précédent …
 
           Range("C" & m)  :  m ?  Sort d'où ?  Car dans le code il n'est pas défini, donc là aussi une erreur est générée !
                                          Si ce n'est pas le cas, alors le code présenté est incomplet, donc à re-poster avec l'icône qui va bien …
                                          Si m représente un n° de ligne, alors cette instruction représente une seule cellule, pas une colonne !
 
           .Cells  :  n'a d'utilité que si l'objet qui précède représente une plage de cellules et non pas une seule cellule …
 
           Voilà !  Ceci, rien que pour cette première ligne ‼  Et il y en aurait presque autant à dire pour les suivantes …
 
           Donc cela demande de nouveau une remise à plat, un effort de réflexion dont vous êtes capable, avant de réécrire votre code.
           De plus, le code précédent écrit par vous-même est une bonne base pour celui-ci.
 
           Ensuite publiez votre nouveau code avec l'icône dédiée au code (sinon comme d'autres, je zappe ‼  Cf règles de ce forum).
 

macrosoucis a écrit :

Le problème réside à faire reconnaître le pourcentage ...car le résultat affiché dans la cellule est un chiffre en % mais la cellule, toute la colonne même, sont générées via une formule...

           Ce n'est pas le problème, sauf que vous fixez dessus alors que pourtant, je vous ai déjà mis sur la voie ‼
 
           En effet, quelle est la valeur réelle d'une cellule affichée en pourcentage ?
           Certainement pas du texte comme dans le test de votre code !
 
           L'affichage en pourcentage n'est qu'un format d'affichage, ne change rien quant à la valeur de la cellule …
           Vérifiez simplement ce que contient réellement la valeur d'une telle cellule par un  MsgBox
           ou bien en la recopiant dans une cellule au format Standard  (ou bien en remettant dans ce format une cellule au format %) …
 

macrosoucis a écrit :

je suis autodidacte et j'ai jamais suivi de cours sur les macros

           Comme moi, bienvenue au club !
 

Reply

Marsh Posté le 05-06-2013 à 15:08:29    

Ah merci beaucoup pour les précisions apportées ! Je vais tout reprendre éléments par éléments.
 
Pour la plage de données, j'ai oublié de mettre le "for m = .... to ....", manque d'attention de ma part...
 
Je vous publie donc mon code actuel que je vais retravailler car le format texte comme vous dites n'a pas de sens. Je pensais laisser le format de la cellule en normal (sans %) et procéder de même :
 

Code :
  1. Sub ffff ()
  2. For m = 2 to 50
  3. For Each cell In Sheets("ksdksk" ).Range("C" & m).Cells
  4. If Range("C" & m).Value > 10 Then
  5. Range("B" & m).Interior.Color = RGB(0, 255, 0)
  6. End If
  7. Next cell
  8. next
  9. end sub


 
 
J'ai enfin compris l'icône code !  :wahoo: Je me demandais comment les gens faisaient pour poster sous ce format ! Merci j'ai compris pour la prochaine fois !
 
J'y réfléchis en tout cas merci

Reply

Marsh Posté le 05-06-2013 à 16:09:21    

 
           Pourquoi deux boucles pour scanner une seule plage de cellules ?‼
           S'il s'agit bien de parcourir la plage C2:C50, une boucle suffit !
 
           Ligne n°3, concernant la feuille, même remarque que dans le message précédent …
           Ne sert à rien si c'est déjà la feuille active, sinon il faut la préciser pour chaque ligne du bloc de ce code
           ou activer la feuille juste avant ce bloc …
 
           Ce n'est pas le format de la cellule qui est en cause, bien au contraire car si on veut afficher un %;
           mais bien l'interprétation qui est en faîte dans le test de votre code !
           Et chez moi, 10% est égal à 0,1  (10 ÷ 100 !), pourtant simple à vérifier comme indiqué auparavant …

Code :
  1. Sub ffff()
  2.     For m = 2 To 50
  3.         If Range("C" & m).Value > 0.1 Then Range("B" & m).Interior.Color = RGB(0, 255, 0)
  4.     Next
  5. End Sub


          Même principe avec la propriété  Cells  :

Code :
  1. Sub ffff()
  2.     For m = 2 To 50
  3.         If Cells(m, 3).Value > 0.1 Then Cells(m, 2).Interior.Color = RGB(0, 255, 0)
  4.     Next
  5. End Sub


           Une autre approche avec une structure  For Each … In  …

Code :
  1. Sub Demo1()
  2.     For Each Cellule In [C2:C50].Cells
  3.         If Cellule.Value > 0.1 Then Cellule.Offset(, -1).Interior.Color = RGB(0, 255, 0)
  4.     Next
  5. End Sub


           … pouvant être raccourcie implicitement :

Code :
  1. Sub Demo2()
  2.     For Each Cel In [C2:C50]
  3.         If Cel > 0.1 Then Cel.Offset(, -1).Interior.Color = RGB(0, 255, 0)
  4.     Next
  5. End Sub

           A noter pour les néophytes, les puristes et parfois le VBA lui même, la procédure Demo1 est plus claire que celle de Demo2 !
           En tout cas ne risque pas d'être mal interprétée …


Message édité par Marc L le 05-06-2013 à 16:24:42
Reply

Marsh Posté le 06-06-2013 à 09:27:21    

Bonjour Marc L,
 
J'ai supprimé la deuxième boucle en effet ( "For each....in ..." )et le code que j'ai finis par appliqué est finalement celui qui vous cité en 1er avec la boucle "IF"...
 
Je me suis compliqué la vie pour un truc qui paraissait tout bête !
 
En ce qui concerne le %, je ne suis pas passé par sa définition ( dire que 10% c'est 0.1) mais j'ai agis sur la cellule contenant le chiffre avant sa mise en forme en %.
Par exemple j'avais la cellule B1 qui contenait le chiffre 40 et la cellule C1 son pourcentage ( soit 40*100/50 (m=50)), j'ai agis sur la colonne B ...ce qui revient au même que votre possibilité mais je souhaitais éviter de créer une autre colonne et je voulais surtout avoir le résultat sous forme de pourcentage ( en %)...
 
 
Merci pour toutes ces alternatives aux boucles ...ça me donnera des idées pour alterner un peu les expressions ! Je garde vos messages pour éventuellement y revenir !
 
 
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed