RECHERCHEV sur plusieurs colonnes (ou équivalent)
Rebonjour,
après la chouette réponse sur mes accès dynamiques, j'aurais besoin d'un autre petit coup de main
j'ai un tableau de 3 colonnes :
# | A | B | C
1 | truc | muche | 3
2 | toto | tata | 6
3 | toto | titi | 8
je voudrais "trouver" la valeur 6 en connaissant le couple toto | tata
en gros, je voudrais faire un truc du style =RECHERCHEV({"toto";"tata"};A1:C3;2;FAUX)
bon, évidemment, cela ne fonctionne pas
ce que je pensais, c'était utiliser une fonction de recherche qui renverrait une seconde matrice sur laquelle je pourrais exécuter RECHERCHEV:
=RECHERCHEV("tata";FONCTIONSUPER("toto";A1:C3;FAUX))
avec FONCTIONSUPER qui cherche "toto" dans la première colonne de A1:C3 et me renvoie le tableau B2:C2 puisque "toto" est en première colonne dans ces 2 lignes
Bonjour
=SOMMEPROD((A1:A3="toto")*(B1:B3="tata")*(C1:C3))
Cordialement
Amadéus
Il est certain qu'aprés Amadeus il n'y a plus grand chose à dire.
Si tu désires conserver ta fonction RECHERCHEV, tu peux le faire en créant une colonne de reroupement des textes, et faire la recherche sur cette zone
Truc muche =A1&B1 3
toto tata =A2&B2 6
toto titi =A3&B3 8
Ce qui donne comme résultat
Truc muche Trucmuche 3
toto tata tototata 6
toto titi tototiti 8
mais bien entendu je préfère la solution d'Amadeus
le problème, c'est que je ne peux pas créer de colonne de regroupement
Par contre, j'ai un petit souci (qui recoupe d'ailleurs peut-être un problème que je rencontre sur cette réponse ci : https://www.excel-pratique.com/forum/viewtopic.php?p=2384#2384 )
la fonction SOMMEPROD ne permet d'utiliser que des chiffres je suppose ? Je n'y avais pas pensé sur le coup, mais je peux également avoir autre chose que des chiffres dans mes colonnes cibles
Sinon, pour la RECERCHEV, j'ai finalement opté pour une création d'une fonction personnalisée qui permet justement de rechercher sur plusieurs colonnes.
Je la donne ici si jamais cela peut intéresser des gens (attention: je suis loin d'être un connaisseur en matière de code pour excel, donc il y'a peut-être pleins de trucs qui foirent avec cette fonction ! J'ai surtout du mal entre les Range et les Cells et les Select et les Activate
' MAT_RECHERCHEV: idem RECHERCHEV, mais la valeur cherchée est définie
' sur plusieurs colonnes et est recherchée sur les x premières colonnes de la
' matrice de recherche
' ex.
' MAT_RECHERCHEV(A1:C1, A3:D5, 4) recherche une ligne entre A3:D3 et A5:D5
' dont les valeurs des 4 premières colonnes (Ax:Cx) se retrouve en A1:C1 et
' renvoie la valeur de la 4ème colonne sur la ligne correspondante
' Paramètres :
' - valCherchee : plage contenant le critère de recherche
' - matrice : plage sur laquelle la recherche se fait
' - noColonne : numéro de colonne de la valeur à renvoyer
' Retour :
' - valeur de la colonne noColonne dans la ligne correspondant
' au critère de recherche
' Erreur (ne fonctionne pas !) :
' - #REF! si paramètres incohérents
' - # N/A si pas de ligne trouvée
Public Function MAT_RECHERCHEV(valCherchee As Range, _
matrice As Range, _
noColonne As Integer) As Variant
Dim NoLigne As Integer
' s'il y a moins de colonnes dans la plage où se fait la recherche que
' dans le critère ou que le numéro de colonne de la valeur à renvoyer => #REF!
If matrice.Columns.Count < valCherchee.Columns.Count Or _
matrice.Columns.Count < noColonne Then
MAT_RECHERCHEV = CVErr(2023)
Exit Function
End If
' recherche de la ligne où se trouve la valeur cherchée
NoLigne = MAT_RECHERCHE_LIGNE(valCherchee, matrice)
' si trouvé, on retourne la valeur
If NoLigne > 0 Then
MAT_RECHERCHEV = matrice(NoLigne, noColonne).Value
' sinon, on retourne #N/A
Else
MAT_RECHERCHEV = CVErr(2042)
End If
End Function
' MAT_RECHERCHE_LIGNE : fonction de recherche de la ligne correspondante
' Paramètres :
' - valCherchee : plage contenant le critère de recherche
' - matrice : plage sur laquelle la recherche se fait
' Retour :
' - numéro de la ligne correspondant au critère de recherche (-1 si pas trouvée)
Public Function MAT_RECHERCHE_LIGNE(valCherchee As Range, _
matrice As Range) As Integer
Dim NbL As Integer
Dim NbC As Integer
NbL = matrice.Rows.Count
NbC = valCherchee.Columns.Count
MAT_RECHERCHE_LIGNE = -1
j = 1
For i = 1 To NbL
If CStr(matrice(i, j).Value) = CStr(valCherchee(1, j).Value) Then
For j = 2 To NbC
If CStr(matrice(i, j).Value) <> CStr(valCherchee(1, j).Value) Then
Exit For
End If
Next j
End If
If j > NbC Then
MAT_RECHERCHE_LIGNE = i
Exit For
End If
j = 1
Next i
End Function
Bonjour
Waouhhh! Eh Behhh! Qué Boulot!
Quand je pense qu'avec une Matricielle validée avec Ctrl+Maj+Entrée, on arrive au même résultat.
Pourquoi faire simple quand on peut faire compliqué ?
=INDEX($C$1:$C$3;EQUIV(1;($A$1:$A$3="toto")*($B$1:$B$3="tata");0))
aprés validation:
{=INDEX($C$1:$C$3;EQUIV(1;($A$1:$A$3="toto")*($B$1:$B$3="tata");0))}
Marche aussi bien, que la cible recherchée soit numérique ou texte.
Cordialement,
Amadéus
Bonsoir
ou
=INDEX($C$1:$C$3;EQUIV("toto"&"tata";$A$1:$A$3&$B$1:$B$3;0))
à valider par les touches Ctrl+Shift+Entrer
@+Jean-Marie