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 mais si vous avez d'autres idées

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 (je ne peux pas modifier le fichier en entrée qui n'est pas créé par moi et qui a un format définit).

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 et j'ai toujours de problèmes sur mes liaisons je vais essayer de poster un exemple dans la soirée

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 et les retours d'erreurs ne fonctionnent absolument pas je ne sais pas comment faire :/ et pleins d'autres trucs surement mais bon... ça fait ce que je lui demande )

' 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

Rechercher des sujets similaires à "recherchev colonnes equivalent"