Autres Copier le contenu de plusieurs cellules en fonction de la couleur de fond

beauserge

XLDnaute Nouveau
Bonjour à tous

Voici mon problème..
Sur excel 2007, j'ai une feuille qui se nomme (Donations) contenant sur la même colonne des cellules (de A11 à A85) qui change de couleur de fond en fonction d'une formule MFC.

Je voudrais recopier uniquement les cellules ayant une couleur de fond bleu (couleur en décimal = 14922983)
sur une 2ème feuille se nommant (Recap)

j'ai tenté de faire une macro à partir d'exemple que j'ai pu trouver mais ça me renvoie une erreur d'execution 9 - "L'indice n'appartient pas à la selection" ??
Je cale car je suis vraiment novice en Vba.

Voici le code en question qui coince :

Sub Macro1()
'
Dim cell As Range
For Each cell In Sheets("Donations").Range("A11:A85")
If cell.Interior.Color = 14922983 Then
cell.Copy
Sheets("Recap").Select
Sheets("Recap").Cells(Range("H65535").End(xlUp).Row + 1, 8).Select

ActiveSheet.Paste
End If

Next cell
End Sub

-------------------------------

Un petit coup de main serait le bienvenu pour dénouer ce problème ..

Merci d'avance pour votre aide

A vous lire
Salutations
Serge
 
Solution
Le fil

Version avec effacement des données en feuille Recap

Ensuite, j'aurai un dilemme, quelle macro utiliser ? celle de Soan ou la tienne ? lol😏
Perso dans l'ordre je dirais tu prends celle que :
1) Tu pourras maintenir tout seul si tu as besoin d'une modification dans X temps
1) Tu comprends le mieux

3) Tu es capable de transposer dans un autre fichier pour d'autre besoin.

*Il y a deux 1) c'est fait exprès ;)

@Phil69970

soan

XLDnaute Barbatruc
Inactif
Bonjour Serge,

bienvenue sur le site XLD ! :)

... qui change de couleur de fond en fonction d'une formule MFC.

If cell.Interior.Color = 14922983 Then

comme la couleur est mise par MFC, fais le test avec
la condition de la MFC et pas avec la couleur !​



note : ça serait bien que tu places ton code VBA entre balises de code !
c'est le bouton "</>" (sur la même ligne que le bouton B pour gras).

ce serait encore mieux si tu peux joindre un fichier Excel exemple !
mais je dois arrêter mon PC (pour affaires personnelles à faire).


soan
 
Dernière édition:

beauserge

XLDnaute Nouveau
Merci Soan pour tes remarques de balises dont je prends note .

je ne comprends pas quand tu me dis "Fais le test avec la condition de la MFC", concrètement je dois faire quoi ?

Concernant le fichier, c'est un gros fichier avec des infos confidentielles donc je ne préfère pas ...
mais s'il te faut un exemple , je pourrai en faire un bien entendu

A te lire

Serge
 

soan

XLDnaute Barbatruc
Inactif
@beauserge

je repasse un court moment. :)

pour les balises de code, j'avais expliqué la procédure à suivre sur ce post. (conversation de Keiko ; rappel : l'image est celle d'un post en cours d'édition, et c'est la 1ère ligne du post, tout en haut)


pour la MFC, j'ai voulu dire : si la couleur de fond (rouge par exemple), est mise avec le test <0 (si la valeur de la plage de la MFC est négatif), alors dans ton code VBA, au lieu de faire un test sur la couleur tel que :​

If cell.Interior.Color = 14922983 Then copie des cellules rouges

fais un test sur la condition de la MFC :

If celluleX < 0 Then copie d'une cellule rouge

à toi de mettre la bonne cellule pour celluleX.

(comme y'a plusieurs cellules, c'est à placer dans une boucle adéquate)



effectivement, il ne faut pas joindre ton vrai fichier qui est confidentiel ; mais ainsi que tu le proposes, ce sera mieux avec un fichier exemple que tu peux créer avec des données anonymes.

j'suis pas disponible ce soir ➯ je laisse la suite à un autre intervenant.

soan
 
Dernière édition:

beauserge

XLDnaute Nouveau
Merci Soan pour tes précisions mais tout ça n'est pas du tout clair pour moi .. désolé

Je joins un fichier test avec les explications à l’intérieur et ce que je souhaite faire avec ma macro.
J'espère que j'aurais été assez précis et clair.

Merci d'avance de votre concours
Serge
 

Pièces jointes

  • Exemple couleur.xlsm
    23.6 KB · Affichages: 6

soan

XLDnaute Barbatruc
Inactif
Bonjour Serge,

ton fichier en retour ; tu peux voir que la feuille "Recap" est entièrement vide ; va sur la feuille "Donations" et clique sur ton bouton "Macro couleur" ; c'est ok ? c'est bien ça que tu voulais ? si oui, merci de passer le post en résolu ; sinon, à te lire pour une adaptation. :)

VB:
Option Explicit

Sub Macro1()
  If ActiveSheet.Name <> "Donations" Then Exit Sub
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row: If dlg = 8 Then Exit Sub
  Dim Wsh As Worksheet, lg1&, lg2&: Application.ScreenUpdating = 0
  Set Wsh = Worksheets("Recap"): Wsh.Columns(1).ClearContents
  For lg1 = 9 To dlg
    With Cells(lg1, 1)
      If .Offset(, 4) <= 0 Then lg2 = lg2 + 1: Wsh.Cells(lg2, 1) = .Value
    End With
  Next lg1
  Wsh.Select
End Sub

soan
 

Pièces jointes

  • Exemple couleur.xlsm
    22.2 KB · Affichages: 7

Phil69970

XLDnaute Barbatruc
Bonjour @beauserge , Soan

Edit: Soan, j'ai pas vu que tu as posté un fichier, pb de rafraichissement comme d'hab.

Remarques:
1) Il y a un espace sur le nom de la feuille "Donations " au lieu de "Donations"

1652909669398.png

Tu as 2 solutions soit tu gardes ton espace mais il faut écrire le code en conséquence soit tu le supprimes et donc tu écris le code sans espace
==> j’ai choisis de supprimer l'espace ;)

2) Il faut au minimum excel 2010 pour pouvoir récupérer la couleur de la MFC

3) J'ai copié la liste dans la colonne H comme dans ta macro on peut bien sur choisir une autre colonne

Je te propose ce fichier

*Merci de ton retour

@Phil69970
 

Pièces jointes

  • Copie couleur V1.xlsm
    25.9 KB · Affichages: 7
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour Phil,

oui, j'avais vu moi aussi l'espace en trop dans le nom de la feuille "Donations " ; je l'ai supprimé, mais c'est volontairement que j'en n'ai pas parlé dans mon post, car je voulais voir si Serge s'en rendrait compte de lui-même, en remarquant que ça marche dans mon fichier et pas dans le sien ! tu as éventé la mèche, mébon, c'est pas grave : j'comprends qu'tu as voulu bien faire ! 😜

remarque : j'ai regardé d'plus près la liste de l'image de ton logo ; c'est très amusant, la Théorie de Cicéron, lollllll ! 🤣 et dire que c'était en 106 avant JC ! c'était un super prophète ! c'qui m'épate, en plus, c'est qu'déjà à l'époque de la Rome antique y'avait des politiciens ! ça signifie qu'depuis la nuit des temps, y'a toujours eu des politiciens pour nous exploiter et pour nous enquiquiner ! (c'est un très gros euphémisme volontaire ! 😁) ; ça explique toute la clique de politiciens qu'on s'coltine à tire-larigot ! et ils se payent largement et grassement sur nos impôts ! j'sais plus qui a dit que la vraie démocratie, c'est gouverner le peuple avec des lois pour le peuple, en utilisant l'argent du peuple, et en donnant de l'argent au peuple. (un truc dans c'genre-là, pas texto) ; y'a un cadeau pour ceux qui ont observé ton logo de près ? 😛

soan
 
Dernière édition:

beauserge

XLDnaute Nouveau
Merci Soan et Phil pour votre retour rapide ! Vous êtes géniaux !
Pour l'espace merci de me l'avoir fait remarqué Phil car cela ne m'avait pas sauté au yeux - je l'ai corrigé et supprimé dans mon fichier officiel.

A Phil, la macro dans ton fichier ne fonctionne pas, j'ai une erreur de propriété - c'est comme tu me l'as expliqué parce que j'ai Excel 2007 et pas 2010, c'est cela, j'ai bien compris ? ou y'a autre chose ?

par contre Soan, ton fichier c'est SUPER, et c'est impeccable. oui c'est que que je voulais donc je pense que je vais utiliser ta méthode.
Mais j'aimerai que tu m'explique un peu ton code pour être moins bête - car à aucun moment je ne vois d'histoire de couleur ?
comment fais tu pour gérer cela ? Et donc donner instruction pour que la macro repère uniquement les cellules bleues ?

Je souhaiterai aussi si possible que tu me dises comment faire pour que la liste des noms qui sont copiés sur la feuille "Recap" ne commence pas sur la cellule A1 mais par exemple en A10 ?

Voilà
Bonne nuit et à demain pour la suite .....
Et pas de soucis Soan, une fois que la macro sera compléte et opérationnel dans mon fichier, je passerai le post en résolu.

Merci déjà et encore pour ce travail
Serge
 

Phil69970

XLDnaute Barbatruc
Le fil

Avec cette version "Copie couleur V2.1" j'ai désactivé la récupération de la couleur de la MFC (qui fonctionnait qu'avec excel 2010 et plus) et coller les valeurs en A10

*Merci de ton retour

Edit: avec la version "Copie couleur V2.1" j'ai mis la couleur qui correspond au bleu de la feuille "Donations" mais attention ce n'est pas la couleur de la MFC qui ne peut pas être récupéré avec ta version excel.
Dit autrement si tu changes la couleur de la MFC tu auras toujours la même couleur (bleu) dans la 2eme feuille

1652920068966.png


@Phil69970
 

Pièces jointes

  • Copie couleur V2.1.xlsm
    25.6 KB · Affichages: 3
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@Serge

à aucun moment je ne vois d'histoire de couleur ?
comment fais tu pour gérer cela ? Et donc donner instruction pour que la macro repère uniquement les cellules bleues ?

ah, ah ! c'est pourtant bien c'que j't'avais dit dans mon post #2 puis dans mon post #4 : au lieu de faire un test sur la couleur, faire un test selon la condition de la MFC qui est : si Ecart <= 0 ! ça devient inutile de tester si la couleur du fond est bleue ou non !

autre façon de l'expliquer : avec la règle de MFC, je mets en fond bleu si Ecart <= 0 ; comme je veux copier les cellules ayant un fond bleu, je copie les cellules pour lesquelles Ecart <= 0. (en fin d'compte, c'est idem)



Je souhaiterai aussi si possible que tu me dises comment faire pour que la liste des noms qui sont copiés sur la feuille "Recap" ne commence pas sur la cellule A1 mais par exemple en A10 ?

c'est tout simple : au lieu que lg2 soit au départ à 0, il suffit de le mettre à 9 : grâce au lg2 = lg2 + 1, ça commencera en ligne 10 ; dans mon prochain post, je mettrai un nouveau fichier avec cette correction, ainsi qu'avec un commentaire du code VBA. :)

soan
 

soan

XLDnaute Barbatruc
Inactif
@Serge

lis d'abord mon post #11 ci-dessus. :)

voici déjà le fichier où sur la feuille "Recap", la liste des noms est à partir de A10.​

VB:
Option Explicit

Sub Macro1()
  If ActiveSheet.Name <> "Donations" Then Exit Sub
  Dim dlg&: dlg = Cells(Rows.Count, 1).End(3).Row: If dlg = 8 Then Exit Sub
  Dim Wsh As Worksheet, lg1&, lg2&: lg2 = 9: Application.ScreenUpdating = 0
  Set Wsh = Worksheets("Recap"): Wsh.Columns(1).ClearContents
  For lg1 = 9 To dlg
    With Cells(lg1, 1)
      If .Offset(, 4) <= 0 Then lg2 = lg2 + 1: Wsh.Cells(lg2, 1) = .Value
    End With
  Next lg1
  Wsh.Select
End Sub

seule modification : sur la 2ème ligne Dim, à droite, j'ai ajouté : lg2 = 9.​

soan
 

Pièces jointes

  • Exemple couleur.xlsm
    22.3 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
@Serge

lis d'abord mon post #12 ci-dessus. :)

ce présent post #13 est pour le commentaire du code VBA.


Option Explicit : ça oblige à déclarer les variables.

Sub Macro1() .. End Sub : c'est la macro qui est appelée par le bouton "Macro couleur".

If ActiveSheet.Name <> "Donations" Then Exit Sub : on sort de la sub si on n'est pas sur la feuille "Donations" ; tu vas dire : « on est forcément sur la feuille "Donations" puisque le bouton "Macro couleur" est dessus, et qu'on clique dessus ! si on est sur la feuille "Recap", on ne peut pas passer la main à travers cette feuille pour aller cliquer sur le bouton de la feuille "Donations" ! » ; oui ... mais faut pas oublier qu'à partir de la feuille "Recap", on peut quand même très bien lancer la macro via Alt F8 ! (fenêtre "Macro") ; idem si j'avais mis en place un raccourci clavier du genre Ctrl e (ce qui n'est pas le cas).

Dim dlg& : idem que Dim dlg As Long ; dlg est mon abréviation pour "dernière ligne".

dlg = Cells(Rows.Count, 1).End(3).Row : idem que dlg = Cells(Rows.Count, "A").End(xlUp).Row ; donc sur la feuille active (qui est "Donations") on « calcule » la dernière ligne qui est utilisée, en colonne A ; Rows.Count est le nombre de lignes d'une feuille de calcul = 1 048 576 ; avec les anciens fichiers .xls (Excel 2003 et versions antérieures), c'était 65 536 ; dans l'exemple, dlg vaut 22 car le dernier nom "Joelle" est en A22 ; maint'nant, imagine que le tableau est vide (ce qui est l'cas au départ) ; y'a donc aucun nom, n'est-ce pas ? et si y'a aucun nom, quelle est la 1ère cellule non vide rencontrée (en remontant du bas) ? c'est la cellule A8 "Membres" de la ligne d'en-têtes ; ça explique l'instruction qui va suivre.

If dlg = 8 Then Exit Sub : si dlg vaut 8, c'est qu'on a "rencontré" la ligne 8 des en-têtes ; donc le tableau est vide et ne contient aucune donnée ; et si y'a pas d'données, on sort de la sub car le traitement qu'on avait l'intention de faire devient sans objet : c'est inutile de faire quoi que ce soit.

Dim Wsh As Worksheet, lg1&, lg2& : déclaration de 3 variables ; Wsh (mon abréviation de Worksheet) est une variable Feuille de calcul ; Dim lg1& : idem que Dim lg1 As Long ; lg1 et lg2 contiendront un n° de ligne.

lg2 = 9 : sans cette instruction, lg2 est initialisé à 0 (c'est fait implicitement par le Dim) et la liste des noms commencera plus loin en A1 ; avec cette instruction, lg2 est initialisé explicitement à 9 et la liste de noms commencera plus loin en A10.

Application.ScreenUpdating = 0 : gel de la mise à jour de l'écran ➯ exécution plus rapide.

Set Wsh = Worksheets("Recap") : Wsh référence la feuille "Recap".

Wsh.Columns(1).ClearContents : sur la feuille "Recap", on efface toutes les données de la colonne A ; c'est pour éviter un mélange entre d'anciens résultats et les nouveaux résultats ; en effet, si on ne le fait pas, au cas où la liste de noms est plus courte qu'une ancienne liste plus longue, on verrait d'anciens noms en trop au bas de la liste des nouveaux noms !

For lg1 = 9 To dlg .. Next lg1 : pour toutes les lignes à partir de la ligne 9 ; dans l'exemple, des lignes 9 à 22.

With Cells(lg1, 1) .. End With : avec la cellule en ligne lg1, colonne 1 (= colonne A).

remarque : les 2 instructions ci-dessus font qu'on lit sur la feuille "Donations" tous les noms de A9 à A22, donc "Pierre" à "Joelle".

If .Offset(, 4) <= 0 Then : voici le test qui évite d'avoir à tester la couleur de fond d'une cellule ! le 1er paramètre de l'offset est omis ➯ même ligne ; le 2ème paramètre de l'offset est 4 ➯ c'est 4 colonnes à droite = colonne E "Ecart" ; donc : si on lit A9, on teste E9 ; si on lit A10, on teste E10 ; si on lit A11, on teste E11 ; si on lit A12, on teste E12 ; etc... ; si Ecart <= 0, on va copier le nom (qui est forcément sur fond bleu puisque la condition "<= 0" est la condition de la règle de MFC) ; la copie du nom est faite par les 2 instructions qui sont à droite du Then (situées sur la même ligne d'instruction).

lg2 = lg2 + 1 : lg2 est augmenté de 1 ➯ on va écrire une ligne plus bas ; rappel : comme au départ lg2 a été initialisé à 9 (c'était sur la 2ème ligne Dim), on commencera à écrire en ligne 10.

Wsh.Cells(lg2, 1) = .Value : .Value est la cellule du With ➯ c'est le nom qu'on lit en feuille "Donations" (ligne lg1, colonne A) ; on écrit ce nom sur la feuille Wsh ("Recap"), dans la cellule de la ligne lg2, colonne 1 (= colonne A).

Wsh.Select : on sélectionne la feuille "Recap" pour montrer la liste des noms qui ont été copiés ; comme par hasard, ce sont les noms qui sont sur fond bleu en feuille "Donations" ! 😲 et on n'a pas eu besoin de tester la couleur de fond ! 😱 miracle ! y'a quand même des coïncidences inouïes, pas vrai ? 😜



si besoin, tu peux demander d'autres infos.
merci de me donner ton avis. ;)

soan
 
Dernière édition:

beauserge

XLDnaute Nouveau
bizarre : pas d'nouvelles de Serge, qui est pourtant passé ce matin :

Regarde la pièce jointe 1140009

j'suppose qu'il doit être en train de cogiter sur tous mes posts ! 😄(wait and see...)

soan
Désolé Soan et Phil, je ne vous ai pas zappé - lol
je suis passé en coup de vent ce matin avant d'aller travailler mais je n'ai pas eu le temps encore de regarder ou tester la macro que tu as modifié.

Je vois ça tout à l'heure mais déjà je vous remercie énormément pour le temps que vous consacrez !

J'aurai des questions et petits ajustements peut être à vous demander par rapport à mon fichier principal.

Je vais regarder ça à tête reposée et je reviens vers vous plus tard.

A+
Serge
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG