[Resolu] RechercheV par couleur de cellule

Shindaraa

XLDnaute Nouveau
Bonjour a tous,
Comment allez vous?

Longtemps que je n'ai pas eu recours a ce forum puisque j'ai reussi a y trouver une reponse a chaque fois pour des sujet existants, mais malheureusement pas ce coup-ci.

Apres de nombreuses recherches ici et ailleurs, j'ai reussi a trouver un tutoriel Youtube pour créer une formule RechercheV par VBA (je suis novice absolu dans ce domaine) qui me renvoit une valeur en fonction de la couleur du fond de la cellule.
Comme vous pouvez le constater dans les colonnes K et L de la P1 , la formule semble bien fonctionner (si jamais vous avez le temps de jeter un coup d'oeil au code VBA pour le verifier et me dire si c'est "propre" ce serait genial aussi, j'ai eu quelques soucis avec le numero de colonne pour renvoyer la valeur qui ne fonctionnait pas toujours).
Cependant, j'aimerais combiner cette nouvelle formule avec une imbrication de RechercheV et Index que javais precedemment cree, que vous pouvez voir en cellule I4 -> I6 . Seulement quand j'essaye de les assembler (en I2 et I3) cela ne semble pas fonctionner.

Alors vu que je n'y connais rien en VBA, je me demandais si il y avait une ligne de code a rajouter pour que cette nouvelle formule fonctionne en imbrication, ou si c'etait autre chose qui clochait.

Un grand merci d'avance pour vos reponses, et n'hesitez pas a me demander si vous avez besoin de plus d'informations de ma part pour me repondre au mieux.

:)
 

Fichiers joints

vgendron

XLDnaute Barbatruc
Bonjour

Déjà.; il faudrait expliquer ce que fait ta FONCTION colorvlookup, notamment les arguments passés..
ce que je comprend:
elle recherche dans une zone (arg2) LA cellule qui a la meme couleur que l'argument 1
et renvoie la valeur situé à Arg3 colonnes
à quoi sert l'argument 4 ??

ensuite.. ta FORMULE qu'est elle censée faire??
 

vgendron

XLDnaute Barbatruc
dans ton fichier tel quel avec ta formule en L6 telle quelle..
si tu tires vers le bas
ce qui va te donner =colorvlookup(K8;$D$2:$E$5;2;1)
K8 étant vide
le résultat sera: QWRRT ==> est ce le résultat attendu??

si la réponse est non....essai cette fonction
VB:
Function colorvlookup(r1 As Range, r2 As Range, n As Integer, b As Boolean) As Variant
Application.Volatile

Dim r3 As Range

For Each r3 In r2
    If r3.Interior.Color = r1.Interior.Color Then
        colorvlookup = r3.Offset(0, n - 1).Value
        If b = False Then Exit For 's'arrete au premier trouvé?
    End If
Next r3

If colorvlookup = "" Then colorvlookup = "#N/A"

End Function
et CETTE formule en L6
=colorvlookup(K5;$D$2:$D$4;2;1)
 

Shindaraa

XLDnaute Nouveau
Salut vgendron,

Merci beaucoup pour ta reponse,

Du coup l'objectif que j'avais pour cette fonction colorvlookup; c'est d'avoir exactement exactement le meme fonctionnement qu'une fonction recherchev, sauf que au lieu de rechercher une valeur et de renvoyer la donnee correspondante sur une cellule d'une autre commande; je voudrais qu'elle cherche la couleur de fond de la cellule, et renvoi la donnee qui est sur la cellule adjacente.
Du coup pour repondre a ta question sur l'argument 4; si j'ai bien compris l'explication du gars sur le tutoriel que j'ai regarde (j'avoue que j'ai surtout recopie "betement" le code), cette partie de la fonction est l'equivalent du VRAI/FAUX qu'on entre sur la fin de la RechercheV.

J'ai essaye ton code du coup, j'ai effectivement l'impression que ca fonctionne deja mieux que celui que j'avais, qui renvoyait pas toujours la bonne valeur. Apres j'ai l'impression que ca ne fonctionne toujours pas comme une vrai rechercheV, ou l'on defini une zone de recherche entiere, et la colonne exact ou la valeur doit etre renvoye.

L'objectif final comme j'essayais d'expliquer dans mon premier ca, ce sera apres de combiner cette formule colorvlookup, avec celle qui existe deja en celulle I4-5-6. Le but ce sera que la formule puisse identifier la couleur qui se trouve dans le tableau de la P2 (colonne U->BJ) en fonction du code de projet (A,B,C en colone A) et de la date (ligne 2), et de renvoyer le code qui correspond a cette couleur (mini tableau en P2 U12:V13).

Peut etre qu'il y a un autre moyen plus simple de faire la meme chose mais j'avoue avoir un peu epuise mes pistes de reflexion la dessus.

Merci encore pour ton aide,
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum, Shindaraa, vgendron

@Shindaraa
Peut etre qu'il y a un autre moyen plus simple de faire la meme chose mais j'avoue avoir un peu epuise mes pistes de reflexion la dessus.
Pour info, sur les versions récentes d'Excel, on peut
1) Trier sur la couleur
2) Filtrer sur la couleur
01filtri.png

PS: Le lien vers le tutoriel YT (à l'accent chantant) ;)
 
Dernière édition:

Shindaraa

XLDnaute Nouveau
Salut Staple,

Merci pour cette fonction, que je connaissais deja et qui malheureusement ne va pas me permettre de faire le travail dont j'aurais besoin (automatiser le renvoi de valeur).
Et en effet c'est bien ce tuto youtube a l'accent chantant (c'est joliment dit!), avoir l'habitude de travailler avec des collegues pakistanais et indiens m'a pas mal aide a pas regarde la video 15 fois pour etre sur de comprendre hehe.
 

Staple1600

XLDnaute Barbatruc
Re

@Shindaraa
Tu la connais mais pas forcément les autres membres du forum qui tomberont sur ton fil.

[l'instant humour "stapelien"]
Pour le reste, Excel est d'abord un tableur, pas un album de coloriage ;)
Pourquoi ne pas simplement se baser sur les valeurs dans les cellules pour un RECHERCHEV classique?
(tel qu'enseigné dans les ashrams dédiés à la Cellule Sacrée, à droite en sortant du couloir)
[/l'instant humour "stapelien"]
 

job75

XLDnaute Barbatruc
Bonjour Shindaraa, vgendron, JM,

Il faut bien comprendre pourquoi votre formule en I2 de la feuille P1 renvoie forcément une erreur.

Le 1er argument de la fonction colorvlookup doit être impérativment un Range.

Or vous y mettez une fonction RECHERCHEV qui ne renvoie pas un Range mais un scalaire.

Pour avoir un Range il faut utiliser la fonction INDEX avec cette nouvelle formule en I2 :
Code:
=colorvlookup(INDEX('P2'!$A$2:$AX$9;EQUIV(A2;'P2'!$A$2:$A$9;0);EQUIV(B2;'P2'!$A$2:$AX$2;0));'P2'!$U$12:$V$13;2;0)
Fichier joint.

A+
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
Serait-ce cela que vous recherchez ?
*** pièce jointe supprimée, re-jointe plus loin.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re, salut Bernard,

Pour mieux comprendre mon post #8 précédent voyez le fichier joint et cette fonction VBA :
Code:
Function TypeRenvoiFormule(c As Range) As String
TypeRenvoiFormule = TypeName(Evaluate(c.Formula))
End Function
Le renvoi de la formule (RECHERCHEV) en E4 est de type Double.

Le renvoi de la formule (INDEX) en E5 est de type Range.

A+
 

Fichiers joints

job75

XLDnaute Barbatruc
Re,

Le problème de Shindaraa n'est pas la fonction colorvlookup, sa syntaxe est correcte.

Elle est de l'imbriquer avec un Range calculé par formule, c'est l'objet de mes posts #8 et #10.

A+
 

Dranreb

XLDnaute Barbatruc
Oui, oui, job75, je m'adressait à Shindaraa.
Je me demandais pourquoi elle imbriquait dans des arguments de la fonction des chose qui ne pouvaient pas marcher, et je répond à une hypothèse: chercherait elle une combinaison valeur + couleur ?
Je le re-joins, il y avait une erreur.
 

Fichiers joints

Shindaraa

XLDnaute Nouveau
Bonjour a tous,

@job75
Un immense merci pour ta solution ça résout parfaitement mon soucis et je l'ai teste sur le fichier grandeur nature ça a l'air de plutôt bien fonctionner.

Petite question subsidiaire si jamais tu as le temps/la réponse :
Que faudrait-il changer dans le code VBA de la fonction colorvlookup pour qu'elle puisse marcher en association avec la recherche V? Juste changer le Dim r3 as Double plutôt que Range?

C'est plus pour ma compréhension personnelle que pour une réelle utilisation , mais sait-on jamais.

Encore un gros merci, et je peux mettre le sujet en Resolu :)
A bientot
 

job75

XLDnaute Barbatruc
Bonjour Shindaraa, le forum,

Il n'y a rien à changer, comme je l'ai dit le 1er argument r1 doit être un Range puisqu'il faut déterminer sa couleur.

A+
 

Dranreb

XLDnaute Barbatruc
Bonjour.
On pourrait juste la changer pour qu'elle accepte la valeur d'un code de couleur à rechercher, si vous préfériez…
La mienne demande aussi une cellule modèle de celle qu'on cherche: Valeur + couleur de fond.
 

Dranreb

XLDnaute Barbatruc
Mais si on ne cherche plus la couleur ça peut être autre chose qu'un Range.
J'ai toujours une fonction qui peut virtuellement restituer à la cellule qui la porte le format d'une autre cellule spécifiée.
J'ai changé mon fusil d'épaule: Je n'aime déjà pas en temps normal la fonction RECHERCHEV parce qu'elle ne permet de redonner qu'une colonne à droite de celle des valeurs de référence et qu'elle oblige à compter le nombre de colonnes qui les séparent, Mais la c'est le bouquet s'il faut pouvoir restituer la valeur seule ou bien la valeur + le format, chacune de ces 2 possibilités pour 3 cas de figures de recherche : seulement la valeur, seulement la couleur ou bien la valeur + la couleur. Ayant fait des suppositions quant à la raison possible pour laquelle si peu de gens ne préfèrent pas la combinaison INDEX/EQUIV, il m'est venu une idée: Une fonction PlagEquiV qui fonctionne à peu près comme EQUIV sauf qu'on ne précise pas le 3ième paramètre 0, mais surtout qui au lieu de renvoyer un numéro de ligne, renvoie la ligne elle même. Il ne reste plus qu'à en demander l'intersection avec la colonne désirée par un simple espace entre les deux.
Voilà où j'en suis.
 

Fichiers joints

job75

XLDnaute Barbatruc
Bonjour Shindaraa, Bernard, le forum,

Uniquement pour le fun voici une fonction VBA qui convertit le résultat de RECHERCHEV en Range :
Code:
Function ConvertToRange(x) As Range
Dim s, v As Variant, plage As Range, colonne As Integer
s = Split(Application.Caller.Formula, ",")
v = Evaluate(Replace(s(0), "=colorvlookup(ConvertToRange(VLOOKUP(", "")) 'valeur recherchée
Set plage = Evaluate(s(1))
colonne = Evaluate(s(2) & "," & s(3) & "," & s(4))
Set ConvertToRange = plage(Application.Match(v, plage.Columns(1), 0), colonne)
End Function
Formule en I2 de ce fichier (2) :
Code:
=colorvlookup(ConvertToRange(RECHERCHEV(A2;'P2'!$A$2:$AX$9;EQUIV(B2;'P2'!$A$2:$AX$2;0);FAUX));'P2'!$U$12:$V$13;2;0)
A+
 

Fichiers joints

job75

XLDnaute Barbatruc
Re,

Toujours pour le fun dans ce fichier (2 bis) la conversion en Range se fait dans la fonction colorvlookup elle-même.

Edit : dans la formule en I2 il est mieux de préciser la feuille avec 'P1'!A2 et "P1'!B2.

A+
 

Fichiers joints

Dernière édition:

Discussions similaires


Haut Bas