RECHERCHEV sur plusieurs colonnes (ou équivalent)

Y compris Power BI, Power Query et toute autre question en lien avec Excel
s
senga
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 17 janvier 2007

Message par senga » 18 janvier 2007, 14:50

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 :D

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 :x
A
Amadéus
Modérateur
Modérateur
Messages : 17'763
Appréciations reçues : 76
Inscrit le : 7 mai 2006
Version d'Excel : Office Excel 2003 FR et 2013FR

Message par Amadéus » 18 janvier 2007, 15:00

Bonjour

=SOMMEPROD((A1:A3="toto")*(B1:B3="tata")*(C1:C3))

Cordialement

Amadéus
C
Colas
Membre fidèle
Membre fidèle
Messages : 237
Inscrit le : 30 décembre 2006
Version d'Excel : developpement excel

Message par Colas » 18 janvier 2007, 18:41

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
s
senga
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 17 janvier 2007

Message par senga » 22 janvier 2007, 08:15

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/vie ... =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 :oops: et j'ai toujours de problèmes sur mes liaisons :evil: 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

A
Amadéus
Modérateur
Modérateur
Messages : 17'763
Appréciations reçues : 76
Inscrit le : 7 mai 2006
Version d'Excel : Office Excel 2003 FR et 2013FR

Message par Amadéus » 22 janvier 2007, 14:47

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
J
JeanMarie
Membre fidèle
Membre fidèle
Messages : 281
Inscrit le : 3 décembre 2006

Message par JeanMarie » 22 janvier 2007, 19:10

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
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message