VBA Excel : Recherche conditionnelle couleur

herve34600 -  
 herve34600 -
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é
Configuration: Windows Vista Internet Explorer 7.0

8 réponses

  1. herve34600
     
    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
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. herve34600
       
      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
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. herve34600
       
      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
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. herve34600
     
    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
  7. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  8. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  9. herve34600
     
    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