Recherche Multicritères compris dans des bornes

thenthelo

XLDnaute Junior
Bonjour,

N’arrivant pas à trouver une solution à mon problème, qui doit pourtant être simple, je fais appel à vos lumières.

Je souhaite connaitre la formule me permettant de retrouver un tarif dans une base de données en fonction de 3 critères :
Critère n°1 : ville (Paris, Lyon,…)
Critère n°2 : année de naissance comprise dans des bornes dans la base de données.
Critère n°3 : sport choisi (tennis, foot,…)

C’est le critère n°2 d’année de naissance -comprise dans des bornes- que je n’arrive pas à gérer en le combinant avec d’autres critères. En tant que seul critère j’y arrive avec index/equiv mais associé à d’autres critères je sèche !:(

Dans le fichier joint je souhaite donc avoir le tarif, avec une formule identique dans les cellules jaunes, en fonction des critères inscrits en B16 et C16 et D15 E15.

Merci d'avance !
 

Pièces jointes

  • Test Excel Recherche Bornes Multicritères.xlsx
    8.8 KB · Affichages: 43

thenthelo

XLDnaute Junior
Re : Recherche Multicritères compris dans des bornes

Super merci beaucoup !
En tant que grande fan du sommeprod me voila ravie :D
Je n'avais pas pensé à le faire en y mettant du <= et du >=

Pour info je l'ai adaptée pour avoir exactement la même formule en D16 et E16.
=SOMMEPROD(($A$2:$A$11=$B16)*($B$2:$B$11<=$C16)*($C$2:$C$11>=$C16)*($D$1:$E$1=D$15)*($D$2:$E$11)).

Merci pour ce retour rapide et efficace.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Recherche Multicritères compris dans des bornes

Bonjour Thenthelo, Piga, bonjour le forum,

Une proposition VBA (je l'envoie puisqu'elle est faite...). Le code d'ouverture dans le composant ThisWorkbook permet de créer la validation de données en B16.

Code:
Private Sub Workbook_Open()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim dv As Object 'déclare la variable dv (Dictionnaire des Villes)
Dim lv As String 'déclare la variable lv (Liste de Validation)

With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière cellule éditée dl de la colonne 1 (=A)
    Set pl = .Range("A2:A" & dl) 'définit la plage pl
    Set dv = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dv
    For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
        dv(cel.Value) = "" 'alimente le dictionnaire dv
    Next cel 'prochaine cellule de la boucle
    lv = Join(dv.keys, ",") 'définit la liste lst
    With .Range("B16").Validation 'prend en compte la validation de données de la cellule B16
        .Delete 'supprime la validation de donnée existante
        .Add Type:=xlValidateList, Formula1:=lv 'utilsie lv comme liste de validation de données
    End With 'fin de la prise en compte de la validation de données de la cellule B16
End With 'fin de la prose en compte de l'onglet "Feuil1"
End Sub
Ensuite, renseigne les deux critères puis double-clique sur D16 ou E16. Le code se trouve dans le composant Feuil1(Feuil1) :
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim os As Byte 'déclare la variable os (OffSet)

Range("D16:E16").ClearContents 'efface le contenu de la plage D16:E16
If Application.Intersect(Target, Range("D16:E16")) Is Nothing Then Exit Sub 'si le double-clic a lieu ailleurs que dans la plage D16:E16, sort de la procédure
If Range("B16").Value = "" Then MsgBox "Veuillez renseigner un Critère Ville !": Range("B16").Select: Exit Sub 'si B16 est vide message, sort de la procédure
If Range("C16").Value = "" Then MsgBox "Veuillez renseigner un Critère Année !": Range("C16").Select: Exit Sub 'si C16 est vide message, sort de la procédure
Cancel = True 'annule le mode édition lié ua double-clic
Application.ScreenUpdating = False 'masque les rafraîchiseements d'écran
dl = Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière cellule éditée dl de la colonne 1 (=A)
Set pl = Range("A2:A" & dl) 'définit la plage pl
Select Case Target.Address(0, 0) 'agit en fonction de l'adresse de la cellule double-cliquée
    Case "D16" 'cas D16
        os = 3 'définit l'offset os
        Range("E16").Value = "" 'vide la cellule E16
    Case "E16" 'cas E16
        os = 4 'définit l'offset os
        Range("D16").Value = "" 'vide la cellule D16
End Select 'fin de l'action en fonction de...
Range("A1").AutoFilter 'active le filtre automatique
Range("A1").AutoFilter field:=1, Criteria1:=Range("B16").Value 'filtre la colonne 1 avec la ville en B16 comme critère
For Each cel In pl.SpecialCells(xlCellTypeVisible) 'boucle sur toutes les cellules visibles de la plage pl
    'condition : si l'année est comprise entre les bornes Min/max
    If Range("C16").Value <= cel.Offset(0, 2) And Range("C16").Value >= cel.Offset(0, 1).Value Then
        Target.Value = cel.Offset(0, os).Value 'place dans la cellule double-cliquée la valeur de la cellule décalée de os colonnes à droite
        Exit For 'sort de la boucle
    End If 'fin de la condition
Next cel 'prochaine cellule de la boucle
Range("A1").AutoFilter 'désactive le filtre automatique
Application.ScreenUpdating = True 'affiche les rafraîchiseements d'écran
End Sub
Oui je sais. Toutes ces lignes alors que deux petites formules font la mêmes chose ! Mais comme je disais au début, ça pourra peut-être servir à quelqu'un d'autre...
Le fichier :
 

Pièces jointes

  • Thenthelo_v01.xlsm
    22.8 KB · Affichages: 30

Discussions similaires

Statistiques des forums

Discussions
312 095
Messages
2 085 249
Membres
102 835
dernier inscrit
Alexandrax971