récupérer les codes couleurs sur mise en forme conditionnelle

obelix77

XLDnaute Junior
Bonjour à tous,

J'utilise le code ci-dessous qui me permet de récupérer le code couleur de la palette de 56 couleurs Excel, quand une cellule est remplie en couleur.

Mon problème : cette macro ne fonctionne que si les couleurs ont été mises manuellement.
Si les couleurs provienne d'une mise en forme conditionnelle ou d'un tableau d'Excel, voir un TC, cette macro considère qu'il n'y a aucune couleur.

Je suis nul en VBA. Quelqu'un pourrait m'aider?

Un grand merci à vous

Obelix77

Code:
Function Couleur(CL As Range) As Long
Couleur = CL.Interior.ColorIndex
End Function
 

job75

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Re,

je ne sais pas si cela va bien pour 1 million de lignes...

L'évaluation de <cellule>.DisplayFormat.Interior.ColorIndex prend pas mal de temps.

Sur le fichier joint de seulement 10000 lignes la macro s'exécute en 1,94 s dont 1,80 s pour cette évaluation.

C'est encore jouable.

Edit : en remplaçant P(i, j).DisplayFormat.Interior.ColorIndex par P(i, j).Interior.ColorIndex

l'évaluation prend 0,80 s, donc DisplayFormat fait plus que doubler le temps d'évaluation.

A+
 

Pièces jointes

  • Couleurs(1 bis).xlsm
    49 KB · Affichages: 32
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Bonsoir.
Comment fais-tu Bernard because Evaluate doesn't understand french as far as I know...
Excuse moi, je n'avais pas vu ta question parce que je m'étais désabonné de cette discussion qui ne m'intéressait plus.
Je ne comprends pas l'obstination à vouloir s'intéresser aux couleurs rendues par des MeFC au lieu de s'intéresser à ce qui les conditionne. C'est récurent, et fatiguant, comme ceux qui confondent toujours un changement de valeur d'une formule avec un changement de contenu de la cellule qui la porte et croient donc qu'on peu le détecter dans une Worksheet_Change.
À part ça, je n'ai pas testé, mais j'imaginais qu'un code comme ça devrait fonctionner :
VB:
With MaPlage.FormatConditions(X)
   If .Type = xlExpression Then
      If Application.Evaluate(.Formula1) Then Couleur = .Interior.Color
      End If: End With
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Bonjour Bernard, le forum,

C'est bien ce que je pensais et cela ne va pas.

Sur une version française d'Excel Formula1 est en français et Evaluate ne sait pas la traduire.

Sur une version anglaise pas de problème si ce n'est que cela fonctionne uniquement pour
.Type = xlExpression

Bonne journée.
 

obelix77

XLDnaute Junior
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Bonjoçur à tous,

J'ai comme l'impression que j'en fatigue certains avec ma demande.

Veuillez m'en excuser mais cette demande correspond à un réel besoin, tourné vers des utilisateurs basiques.
Je ne vais pas dérouler le cahier des charges du besoin sur ce forum; ce n'est certainement pas le sujet :eek:

J'ai testé le fichier de ROger2327 (LectureCouleurFondCellule).
Effectivement les problèmes sont bien les suivants, à ce que j'ai constaté :
plage d'utilisation limitée (A1:F1000)
temps de traitement qui risque d'être long si on étend la plage
MAJ par une macro; une MAJ automatique est impossible?

Bonne journée à tous,
 

obelix77

XLDnaute Junior
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Hello job75

J'ai prévenu dès le début : je suis nul en VBA. Donc je fais avec ce que je sais faire.
Par exemple, prendre des bouts de solutions et les assembler, je ne sais pas faire ...
J'étudie chaque réponse, je vous l'assure.

Je crois que je vais finir par clore le sujet. Avec tout ce que j'ai et en me grattant la tête, je devrais arriver à mon but, selon vous?

Bonne journée à tous,
 

job75

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Re,

Si vous joigniez le fichier que vous utilisez on pourrait vous faire un truc aux petits oignons avec toutes les explications que vous voulez.

Si votre fichier est trop lourd déposez-le sur Cjoint.com

A+
 

obelix77

XLDnaute Junior
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Ca c'est coollissime.

J'avais joint le fichier suivant; est il assez clair?

En résumé :

Récupérer sous forme de code le fond de couleur d'une cellule, quelque soit l'origine du fond : manuelle, MFC, tableau d'excel, ...
La récupération du code doit se faire par une formule qui fonctionne sur l'intégralité d'une feuille et sans lancer de macro pour la MAJ ou autre.
La récupération doit se faire cellule par cellule. Par exemple :
Si cellule BX312 a un fond de couleur, une fonction qui peut être mise n'importe ou, du style :
Dans cellule A25 : "= couleurfond(BX312)".
Résultat : "le code"

Cette fonction sera combinuée avec des fonctions diverses comme : SI SOMME.SI, NB.SI, SOMME.SI.ENS, NB.SI.ENS, ...

Je sais récupérer les codes des fonds de cellules, quand le fond est manuel et utilise les 56 couleurs de la palettes. Le code que j'utilise est dans le fichier joint.
J'utilise cette fonction qui me va très bien mais mes besoins ont évolués.

Si pas clair, me dire, bien sur.

Et encore merci à tous
 

Pièces jointes

  • récupérer les codes couleurs sur mise en forme conditionnelle.xlsm
    12.8 KB · Affichages: 35
  • récupérer les codes couleurs sur mise en forme conditionnelle.xlsm
    12.8 KB · Affichages: 39

job75

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Re,

Ce fichier est un fichier de test, ce n'est pas je suppose le fichier que vous destinez à vos utilisateurs !

Joignez ce dernier avec les formules de recherche NB.SI, SOMME.SI etc... dont vous avez parlé.

Pourquoi bricoler par vous-même alors que comme vous dites vous n'y connaissez rien ?

A+
 

obelix77

XLDnaute Junior
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Je n'y connais rien en VBA mais je ne suis pas mauvais comme utilisateur Excel :eek:

Il ne s'agit pas d'un fichier mais d'en ensemble de fichiers que je ne peux pas transmettre (clause de confidentialité ...).

Une fois le code couleur de fond de cellule récupéré, je sais faire tout ce dont j'ai besoin.

Ma seule et unique demande porte sur la récupération de ce code.
Une fonction qui fonctionne à l'identique de ce que je sais faire aujourd'hui avec la fonction "couleur" dont la limite est l'origine du fonds qui ne peut être que manuel et sur un nombre limité de couleur (56).

Bonne journée à tous.
 

Dranreb

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Bonjour.
Effectivement je n'y avais plus pensé non plus à celle là.
On pourrait peut être encore s'en sortir avec :
VB:
With Plg.Worksheet.Names.Add("BidonDeChezBidon", RefersToLocal=FC.Formula1): If Application.Evaluate(.RefersTo) Then Couleur=FC.Interior.Color: .Delete: End With
 

job75

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Re,

Bon puisque vous voulez absolument une fonction VBA, utilisez la solution de Roger2327.

Ou alors avec ma solution (feuille auxiliaire) voyez ce fichier (4).

Fonction volatile dans Module1 :

Code:
Function CodeCouleur(r As Range) As Range
Application.Volatile
Set CodeCouleur = Sheets("Couleurs").Range(r.Address)
End Function
Codes dans ThisWorkbook (pour fonctionner sur toutes les feuilles) :

Code:
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
If Sh.Name <> ActiveSheet.Name Or Sh.Name = "Couleurs" Then Exit Sub
Dim P As Range, t, ncol%, i&, j%
Set P = Sh.UsedRange
If P.Count = 1 Then
  t = P.DisplayFormat.Interior.ColorIndex
Else
  t = P 'matrice, plus rapide
  ncol = UBound(t, 2)
  For i = 1 To UBound(t)
    For j = 1 To ncol
      t(i, j) = P(i, j).DisplayFormat.Interior.ColorIndex
  Next j, i
End If
Application.EnableEvents = False 'désactive les évènements
With Sheets("Couleurs") 'feuille auxiliaire
  .Cells.ClearContents 'RAZ
  .Range(P.Address) = t
End With
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Workbook_SheetCalculate Sh
End Sub
Dans tous vos fichiers il faudra ces codes et la feuille auxiliaire "Couleurs" (masquée).

Edit : bien noter que la fonction ne peut étudier que les cellules de la feuille active.

A+
 

Pièces jointes

  • Couleurs(4).xlsm
    25 KB · Affichages: 47
Dernière édition:

mécano41

XLDnaute Accro
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Bonjour à tous,

....L'évaluation de <cellule>.DisplayFormat.Interior.ColorIndex prend pas mal de temps...Sur le fichier joint de seulement 10000 lignes la macro s'exécute en 1,94 s dont

Merci pour ta réponse ; dans mon message #27, je pensais plus à un problème d'espace maxi autorisé que de temps (je n'avais pas vérifié)... En fait, c'est pire que ce que je pensais car pour la plage nommée, au-delà de 80 à 90 cellules, cela plante (pourquoi pas toujours la même valeur???) ...Est-ce une limite réelle ou est-ce dû à une mauvaise utilisation des instructions de ma part ? (c'est le plus probable!) ...je n'ai pas trouvé malgré pas mal d'essais...

Cordialement
 

job75

XLDnaute Barbatruc
Re : récupérer les codes couleurs sur mise en forme conditionnelle

Re,

On remarquera sur le fichier (4) que si l'on efface A6 le code couleur renvoyé en J3 est 0

Cela signifie que A6 est alors en dehors du UsedRange et dans ce cas sa couleur n'est pas étudiée.

A+
 

Discussions similaires

Réponses
12
Affichages
209

Statistiques des forums

Discussions
312 204
Messages
2 086 198
Membres
103 153
dernier inscrit
SamirN