[Résolu] Calculer un nombre en fonction d'une couleur

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Jeff
GourOOu
GourOOu
Messages : 9940
Inscription : 18 sept. 2006 09:40
Localisation : France

Re: [Résolu] Calculer un nombre en fonction d'une couleur

Message par Jeff »

Au risque d'enfoncer une porte ouverte, ou bien de doucher tes attentes, Countstyle ne sais pas compter les cellules colorées (sinon son auteur l'aurait probablement appelé Countcolor :wink: ), mais elle compte les cellules qui sont dotées du style mentionné.

Donc, une surcharge de style (par exemple le fait de forcer une couleur d'arrière-plan) ne change pas le style appliqué, la cellule continue d'être comptabilisée comme appartenant à ce style.

Ce qui ne t'empêche pas, par ailleurs, de modifier le style :arrow: les cellules appartenants aux styles changeront alors d'aspect, tout en continuant d'être comptabilisée par la fonction.

Attention : seuls les ordinateurs, sur lesquels la fonction a été installée, seront en mesure de donner le résultat (on ne peut pas intégrer la fonction dans un fichier)

A +
À lire avant tout !

Pour télécharger Apache OpenOffice

AOO 4.1.15 / Debian 12.10 "bookworm" / Xfce
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 6057
Inscription : 02 janv. 2009 23:56

Re: [Résolu] Calculer un nombre en fonction d'une couleur

Message par Jean-Louis Cadeillan »

Bonsoir,
On peut tenter de se passer de l'extension et des styles en utilisant la propriété CellBackColor d'une cellule. Il est possible d'embarquer dans le fichier (voir ci-joint) la fonction suivante :

Code : Tout sélectionner

Function CodeCouleur (Arg As String) As Long'donne le code couleur long de la cellule pointée
	Dim monDocument As Object
	Dim lesFeuilles As Object
	Dim maFeuille As Object
	Dim maCellule As Object
	monDocument = ThisComponent
	lesFeuilles = monDocument.Sheets
	If monDocument.IsLoaded = true  Then
	maFeuille = monDocument.CurrentController.ActiveSheet
	Else
	Exit Function
	End If
	maCellule = maFeuille.getCellRangeByName(Arg)
    CodeCouleur = maCellule.CellBackColor
End Function
Comme je ne suis pas expert en adressage de cellules dans les macros, celle-ci fonctionne en récupérant la référence d'une seule cellule sous forme textuelle. Le code couleur est le code long décimal. La mise en œuvre est la suivante (pour la cellule E8) :

Code : Tout sélectionner

=TEXTE(DECHEX(CODECOULEUR(CELLULE("adresse";E8))+ALEA()*0);"000000")
CELLULE retourne la référence d'E8 sous forme textuelle, CODECOULEUR() retourne le code long décimal, DECHEX() retourne l"équivalent hexadécimal du code long décimal.
+ALEA()*0 permet un recalcul forcé dès qu'on change de couleur d'arrière-plan de la cellule pointée. TEXTE() transforme le code hexa en chaîne textuelle.
DECHEX() n'est pas indispensable pour faire la comparaison, je l'ai ajouté, car sous LibreOffice, on connaît directement le code hexa avec la couleur d'arrière plan de la cellule (menu Format>Cellule>Arrière-plan, champ Hexa). Sous OpenOffice, il suffit d'aller chercher le code par la formule ci-dessus (par exemple, en D1, la formule récupère le code hexa de la couleur d'arrière-plan de la cellule C1.
Il suffit donc de faire une plage-miroir de la plage dont certaines cellules sont colorées, en faisant un test dans chaque cellule (ici en E16) :

Code : Tout sélectionner

=TEXTE(DECHEX(CODECOULEUR(CELLULE("adresse";E8))+ALEA()*0);"000000")=$B$1
formule à propager sur la plage E16:T21 (de la même dimension que la plage E8:T13). Pour chaque cellule, on fait la comparaison avec le code voulu (stocké en B1). La somme de cette plage est faite en A9, le résultat est le même que celui donné en A8.
Le compte des cellules colorées d'une couleur donnée est donc effectué.
Je précise que je me suis inspiré de ce fil pour éviter un dysfonctionnement de la fonction CODECOULEUR().
Tel quel, le fichier fonctionne aussi bien sous OpenOffice que sous LibreOffice.
À tester ci-joint.
Cordialement,
Jean-Louis
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 24.2.7.2 (x64 et Java 1.8.0_451) et AOO 4.1.15 (et Java x32 1.8.0_431), Windows 7 Édition Intégrale 64 SP1
cwolan
Membre hOOnoraire
Membre hOOnoraire
Messages : 116
Inscription : 14 févr. 2021 22:15

Re: [Résolu] Calculer un nombre en fonction d'une couleur

Message par cwolan »

Bonjour,
Jean-Louis Cadeillan a écrit : 10 juin 2025 21:24 Comme je ne suis pas expert en adressage de cellules dans les macros, celle-ci fonctionne en récupérant la référence d'une seule cellule sous forme textuelle. Le code couleur est le code long décimal. La mise en œuvre est la suivante (pour la cellule E8) :

Code : Tout sélectionner

=TEXTE(DECHEX(CODECOULEUR(CELLULE("adresse";E8))+ALEA()*0);"000000")
On peut également le faire de cette façon :

Code : Tout sélectionner

=DECHEX(CODECOULEUR(CELLULE("adresse";E8))+ALEA()*0;6)
OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 25.2
Windows 7,10,11 64-bit
cwolan
Membre hOOnoraire
Membre hOOnoraire
Messages : 116
Inscription : 14 févr. 2021 22:15

Re: [Résolu] Calculer un nombre en fonction d'une couleur

Message par cwolan »

Bonjour,
Jean-Louis Cadeillan a écrit : 10 juin 2025 21:24 (...) car sous LibreOffice, on connaît directement le code hexa avec la couleur d'arrière plan de la cellule (menu Format>Cellule>Arrière-plan, champ Hexa).
Deux autres minuscules remarques :
  1. La valeur hexadécimale de ce champ est affichée par défaut en minuscules. Les fonctions HEXDEC, HEXOCT et HEXBIN acceptent les arguments en minuscules (cf. [1]). Votre formule =TEXTE(DECHEX(CODECOULEUR(CELLULE("adresse";E8))+ALEA()*0);"000000")=$B$1 peut ne pas renvoyer le résultat correct pour une couleur exprimée en lettres minuscules (cellule B1).
  2. C'est menu Format>Cellules>Arrière-plan

──────────
[1] Fonctions Add-in, liste des fonctions d'analyse - Partie Une
OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 25.2
Windows 7,10,11 64-bit
cwolan
Membre hOOnoraire
Membre hOOnoraire
Messages : 116
Inscription : 14 févr. 2021 22:15

Re: [Résolu] Calculer un nombre en fonction d'une couleur

Message par cwolan »

Bonjour,
Jean-Louis Cadeillan a écrit : 10 juin 2025 21:24 On peut tenter de se passer de l'extension et des styles en utilisant la propriété CellBackColor d'une cellule.
Par curiosité, j'ai ajouté à cette extension une fonction qui compte les cellules dont l'arrière-plan a une valeur donnée. Elle s'appelle COMPTE.COULEURFOND et semble fonctionner plus ou moins bien dans OpenOffice et LibreOffice.
CountStyleTEST.oxt
Compte.CouleurFond.gif
Jean-Louis Cadeillan a écrit : 10 juin 2025 21:24 Comme je ne suis pas expert en adressage de cellules dans les macros, celle-ci fonctionne en récupérant la référence d'une seule cellule sous forme textuelle. (...) Il suffit donc de faire une plage-miroir de la plage dont certaines cellules sont colorées, en faisant un test dans chaque cellule (...) formule à propager sur la plage (...) La somme de cette plage est faite.
En BASIC de LibreOffice lorsque la prise en charge VBA est activée (Option VBASupport 1), on peut passer une référence de cellule à une fonction définie par l'utilisateur (UDF).

Cf. fichier joint, la fonction CoCoVBA.
 Ajout : 
foufouner_20250608_JLC01_v1.ods

Code : Tout sélectionner

Function CoCoVBA(crRef,couleur)
  maPlage = crRef.cellRange
  count = 0
  For i = 0 to maPlage.Rows.Count-1
    For j = 0 to maPlage.Columns.Count-1
      if maPlage.getCellByPosition(j,i).CellBackColor = couleur then count = count + 1
    Next j    
  Next i
  CoCoVBA = count
End Function
 

Le nombre de cellules qui remplissent la condition, c.-à-d. ayant la couleur d'arrière-plan spécifiée par la valeur de la cellule B1, est calculé dans la cellule A10 :

Code : Tout sélectionner

=COCOVBA(E8:T13;HEXDEC($B$1))+ALEA()*0
Encore une fois, cela ne fonctionne qu'avec LibreOffice.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 25.2
Windows 7,10,11 64-bit