VBA Excel : Recherche conditionnelle couleur

Fermé
herve34600 - 29 déc. 2009 à 16:39
 herve34600 - 31 déc. 2009 à 13:40
Bonjour,

Je suis novice de VBA et je souhaiterais avoir une fonction supplémentaire qui me permettrait d'utiliser la couleur d'une cellule pour excécuter une opération.

J'ai imaginé 2 solutions possible :
1 - soit une fonction de type recherchev() qui me donnerait la couleur d'une cellule d'une plage selon critère, plage et position,
2 - soit une fonction qui rechercherait la couleur d'une cellule dans une plage selon N° ligne et Colonne.

J'utilise déjà 2 fonctions supplémentaires : Cumul_Couleur(), ADD_Couleur() et ColorCell().

Merci pour votre aide.
Hervé
A voir également:

8 réponses

Bonjour Eric,

Oui désolé, c'est un peu cavalier en effet, c'était ma première consultation sur des forums, je n'avais pas conscience de la qualité et la rapidité des réponses et je n'étais pas sûr de recevoir des réponses.
Je dois mettre en place mon nouveau système de plannication, restauration, transport et facturation la semaine prochaine.

Merci encore.

A toute fin utile, voilà le lien :
https://codes-sources.commentcamarche.net/#5

Au départ la fonction Application.Volatile True était inclus dans près d'1 milliers de fonction VBA à l'intérieur des fonctions VBA.
A chaque saisie, Excel recalculait toutes ces fonctions. Au finale, cela durait plusieurs minute.

En remplaçant Application.Volatile True par Application.Calculation = xlManual (en lieu et place), Excel recalcule 1 première fois et cela durée longtemps, puis il recalcule que les fonctions concernées par un changement (du moins c'est ce que j'ai constaté).

Par soucis de durée de calcul, je n'ai pas pris en compte votre solution. En y réfléchissant, j'ai imbrique la fonction index dans une fonction ColorCell() et j'ai calculé les N°ligne et Colonne dans d'autres cellule.

Le code de la fonction ColorCell est la suivant :
Function ColorCell(C As Object)
Application.Calculation = xlmanual
ColorCell = Abs(C.Interior.ColorIndex)
End Function

A bientôt
Hervé
1
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
29 déc. 2009 à 19:15
Bonsoir

si couleur de la celllule non issue d'une MEFC

Function dire_couleur(lig As Long, col As Byte)
dire_couleur = Cells(lig, col).Interior.ColorIndex
End Function

Sub test()
MsgBox dire_couleur(5, 6) 'cellule F5
End Sub

0
Bonsoir Michel,

Merci pour votre réponse rapide.

Cette fonction prend telle en compte une plage de cellule?

Je ne vois que le n°ligne + n°colonne.

J'ai trouvé une solution en imbriquant la fonction Index() dans la fonction ColorCell().
Ca marche, c'est un peu lourd et excel met du temps à calculer.

En faite, j'ai un planning annuel de présence et d'activité de près de 120 personnes dans 6 ateliers différents et je souhaite obtenir les effectif journaliers des repas dans 9 lieux différents.
Pour l'année 2010, j'ai revu et simplifié le système en utilisation les couleurs (9) des cellules pour définir les lieux de restaurations.
J'y suis arrivé mais les fichiers sont lourds et le temps de calcul est long.

Est-il possible de simplifier ou d'accéler le calcul ?

Merci par avance.
Hervé
0
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
30 déc. 2009 à 00:18
Bonsoir,

Je ne pense pas que ce soit la fonction de michel qui prenne du temps de calcul.

Je me suis attaqué au 2)
(et elle, elle risque de prendre du temps.... ;-) )

Rechercher dans une plage verticale une cellule de couleur x
syntaxe :
=RechercheVCouleur(couleur;plage;index_colonne[;occurence])
Ex:
=RechercheVCouleur(3;H2:H13;0)
=RechercheVCouleur(3;H2:H13;-2;3)

Function RechercheVCouleur(couleur As Long, plage As Range, index_colonne As Long, Optional occurence As Long) As Variant
    ' recherche en vertical dans une 'plage' de largeur 1 colonne
    ' une cellule de couleur de fond 'couleur'
    '
    ' Le retour dépend de la valeur de index_colonne :
    ' index_colonne = 0 : retourne l'index de la cellule dans la plage (sa position dans plage)
    ' index_colonne < 0 : retourne la valeur de la cellule située x cellules à gauche
    ' index_colonne > 0 : retourne la valeur de la cellule située x-1 cellules à droite
    '
    ' occurence : paramètre optionel, pardéfaut=1
    ' Ex : si occurence=5 et couleur=3 la 5ème cellule rouge sera recherchée
    ' si seulement 4 occurences dans la plage #N/A est retourné
    '
    '
    Dim c As Range, cpt As Long, ok As Boolean
    Application.Volatile
    If occurence < 1 Then occurence = 1
    If plage.Columns.Count > 1 Then RechercheVCouleur = "#VALEUR!"
    For Each c In plage
        If c.Interior.ColorIndex = couleur Then
            cpt = cpt + 1
            If cpt = occurence Then
                Select Case index_colonne
                Case Is < 0
                    RechercheVCouleur = c.Offset(0, index_colonne)
                    ok = True
                    Exit For
                Case 0
                    RechercheVCouleur = c.Row - plage.Row + 1
                    ok = True
                    Exit For
                Case Else
                    RechercheVCouleur = c.Offset(0, index_colonne - 1)
                    ok = True
                    Exit For
                End Select
            End If
        End If
    Next c
    If Not ok Then RechercheVCouleur = "#N/A"
End Function

eric
0
Bonsoir Eric,

Merci pour votre réponse trés aboutie. C'est trés précieux.

Je vais examiner et tester plus tard votre code.

Egalement, j'ai imaginé pour gagner du temps de lancer le calcul uniquement sur ordre sot avec F9 soit avec un bouton lié à une macro afin que la personne (ou sa remplaçante) qui fera les saisies journalières n'oublie pas lancer le calcul avant toute édition.

Malheureusement, cette personne utilise d'autre fichier Excel pour d'autre application.
Elle devra penser :
- soit à lancer le calcul manuellement (source d'oublie et donc d'erreur de calcul)
- soit à changer les paramètres d'Excel en fonction des fichiers utilisés. (trop fastidieux)

Avez-vous une idée ?

Merci
A bientôt
Hervé
0
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
30 déc. 2009 à 07:00
Bonjour,

lancer le calcul sur :
-imprimer
-enregistrer
-activation d'onglet

eric

PS: je n'ai pas fignolé le traitement d'erreur. Si tu demandes 3ème colonne à gauche et que tu es en B ça plante (entre autres...)

PS2 : si c'est cette partie qui est lente procède autrement.
Utilise des codes S1, S2, ... pour les salles et met une MFC (excel2007) ou une macro sur 'change' pour colorer les cellules. Ca sera plus rapide de compter tes codes par fonction excel.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonsoir,

Merci pour ton aide.

Pour les affectations S1, S2 etc.. dans le tableau c'est pas pratique car je l'ai utilisé en 2009.

Avec l'aide d'une personne grâce à un autre forum, j'ai changé la fonction Application.Volatile True par Application.Calculation = xlManual.

Et ça fonctionne beaucoup mieux.

Merci pour ton aide.
Hervé
0
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
31 déc. 2009 à 07:49
j'ai changé la fonction Application.Volatile True par Application.Calculation = xlManual
Si c'est à l'intérieur de la fonction personnalisée c'est illogique.
Si elle a besoin d'être volatile ce n'est pas pour rien, le calcul manuel doit être mis à l'extérieur de la fonction.

Par ailleurs si tu t'adresses à plusieurs forums tu dois le dire et mettre les liens.
Par courtoisie et par efficacité.

eric
0
eriiic Messages postés 24571 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
31 déc. 2009 à 12:02
Je reste sur le fait qu'Application.Calculation = xlmanual n'a rien à faire dans une fonction.

Puisque de toute façon le calcul sera toujours désactivé dès le premier appel, l'utilisateur devra lancer les calculs manuellement. Et ça sur tous les classeurs, je ne te raconte pas les risques d'erreurs !!!
Je le mettrai en manuel sur activation de la feuille concerné pour le rétablir sur désactivation de la feuille et sur enregistrement mais bon, c'est ton classeur...
eric
0
Oui cela paraît pas normale.

Je vais refaire des tests approndis pour vérifier si Excel recalcule ou non et dans quel cas.
Il vaut mieux être prudent en effet.

Dès que j'ai des news je t'en informe.

A bientôt
Bon réveillon.
Hervé
0