Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Recherche multi critères

GUERET

XLDnaute Occasionnel
Bonjour,
Dans ce tableau, feuille "Pilotes", je cherche à savoir les lieux où le pilote a obtenu sa ou ses places (si en H2 j'affiche 2, il me donne le nombre de fois où chaque pilote a finit 2ième). Je ne sais pas si ce que je dis est clair..... J'ai tenté cette formule =SI(EQUIV(Pilotes!H5;Melbourne!D5;0;Melbourne;"")) mais il me dit que j'ai entré un nombre trop important d'arguments... Je cherche encore mais mon niveau Excel est faible.
D'avance, merci

https://www.cjoint.com/c/JKdrebp743V
 

GUERET

XLDnaute Occasionnel
J'ai rectifié l'erreur mais je n'ai pas le résultat escompté.
Par exemple je cherche à afficher en I6 le nom des courses où Quartararo a été 1er (en affichant 1 en H3) d'où le chiffre 3 en H6 car il l'a été en Espagne, Andalousie et en Catalogne. Est-ce possible ou trop compliqué à mettre en œuvre ?
Je ne suis pas très fort dans ce domaine d'où mon appel à l'aide.
Cordialement
 

vgendron

XLDnaute Barbatruc
en retour ton fichier

Me suis permis quelques modifs pour ton tri
déclarer la meme fonction tri dans toutes les feuilles, c'est inutile. voire source de bug
selon la feuille, le tri intervient sur des zones différentes: les cas sont traités directement dans la macro de tri déclarée dans un module standard

l'évènement du Thisworkbook permet de detecter un changement de feuille

l'évènement change de la feuille "Pilote" déclenche la macro "ListeCourses" si tu changes la position

Je te laisse regarder le code
 

Pièces jointes

  • Copie Motos 2020 modifié LE 29-10.xlsm
    659.1 KB · Affichages: 17

GUERET

XLDnaute Occasionnel
Alors là, je reste sur le c...Je ne sais comment te remercier. Je n'avais pas besoin de rentrer le tri sur chaque feuille !!!! Quand on ne sait pas, on ne sait pas !
Par contre, je ne vois pas par quelle formule tu as pu arriver à faire apparaitre le noms des lieux comme je le souhaitais : histoire de ne pas mourir bête ce soir.
En attendant, encore merci.
 

vgendron

XLDnaute Barbatruc
il s'agit de la macro "ListerCourses" qui est déclenchée lorsque tu modifies la cellule H3 (voir évènement change de la feuille)

je te remets la meme macro avec des commentaires..hier j'étais fainéant :-D
VB:
Sub ListerCourses()
If ActiveSheet.Name <> "Pilotes" Then Exit Sub 'si on est pas sur la feuille "Pilotes", on sort ==> normalement.. aucune chance que ca arrive...

Columns("K:Z").ClearContents 'on efface les columns K à Z.. Choix arbitraire de la dernière colonne Z: si un nom de course apparaisait en colonne AA et au dela il ne sera pas effacé....
Fin = Range("H" & Rows.Count).End(xlUp).Row 'on récupère le numéro de la denière ligne

Position = ActiveSheet.Range("H3") 'on récupère la position selectionnée en H3
    
For i = 5 To Fin 'pour chaque ligne du tableau
    If Range("H" & i) <> 0 Then 'si il y a un nombre <>0
        NbCourses = Range("H" & i) 'on récupère ce nombres de courses
        NomPilote = Range("B" & i) 'on récupère le nom du pilote
        ReDim tabCourses(1 To NbCourses) 'on créé un tableau de NbCourses elements ==> contiendra les courses à afficher
        j = 1 'initialisation
        For Each ws In ActiveWorkbook.Sheets 'pour chaque feuille du classeur
            If ws.Name <> "Écuries" And ws.Name <> "Pilotes" Then 's'il s'agit d'une feuille de courses
               Set ici = ws.Range("A:A").Find(NomPilote) 'on cherche ou se trouve le pilote
               If Not ici Is Nothing Then 'si il est dans la feuille
                    If ws.Range("D" & ici.Row) = Position Then 'si son finish correspond à la position cherchée (H3)
                        tabCourses(j) = ws.Name 'on récupère le nom de la course= nom de la feuille
                        j = j + 1
                        If j > NbCourses Then Exit For 'si on a trouvé toutes les courses.. plus la peine de continuer de parcourir les feuilles
                    End If
               End If
            End If
        Next ws
        Range("K" & i).Resize(1, NbCourses) = tabCourses 'on colle le tableau à partir de la colonne K
    End If
Next i

End Sub
 

GUERET

XLDnaute Occasionnel
Merci et encore merci pour ce boulot de DINGUE que tu viens de faire ! C'est sûr, je vais mourir moins bête ce soir ! Je vais tenter de la comprendre et péter ma science auprès de mes amis .
Merci
Cordialement
 

GUERET

XLDnaute Occasionnel
Bonsoir, Excuse moi de te déranger mais j'ai voulu faire la même chose avec la F1 mais je me retrouve avec des #VALEUR en colonne F de la feuille "Pilotes". Je suis là-dessus depuis ce matin et je ne vois pas où j'ai buggué. HELP please et, stp dis moi, pointe mon erreur afin que je ne recommence pas la même erreur deux fois de suite. Et pourtant, j'étais fier de moi
Cordialement
 

Pièces jointes

  • Test GP F1 2020 .xlsm
    796.8 KB · Affichages: 3

vgendron

XLDnaute Barbatruc
Salut,
l'erreur vient de ta fonction "CalculPool"

l'ennui, c'est que je ne comprend pas ce qu'elle calcule...?
regarde les commentaires que j'ai ajoutés dans ton code
VB:
Function CalculPool(Nom$)
Application.Volatile
Dim i%, PosNom As Variant
For i = 1 To Application.CountIf([Courses], "*") 'pour chaque élément de la zone "Courses"
    With Sheets(CStr([Courses].Cells(i, 1))) 'dans la feuille
        PosNom = Application.Match(Nom, .Range("A:A"), 0) 'on récupère la ligne à laquelle se trouve le pilote dont le nom est donné en paramètre d'entrée de la fonction
' et la ligne suivante..Mystère
'si PosNom est un numérique (ca veut dire qu'on a trouvé le pilote)
'mais.. si range("E"PosNom") alors on incrémente CalculPool..
'mais..il manque pas quelque chose sur la condition ? si range ("E"Posnom)... 
'en l'état actuel c'est compris par VBA comme "si range() est vrai...
'ca veut dire quoi vrai ??
        If IsNumeric(PosNom) Then If .Range("E" & PosNom) Then CalculPool = CalculPool + 1
    End With
Next
End Function
 

vgendron

XLDnaute Barbatruc
d'ailleurs;. ta zone Courses est incomplète: il manque des courses..
tu peux la définir dynamiquement:: elle s'ajustera automatiquement en fonction du nombre de courses dans la colonne J
dans le gestionnaire de noms, définis la zone "Courses" avec la formule suivante
VB:
=DECALER(Pilotes!$J$5;;;NBVAL(Pilotes!$J:$J)-2)
 

GUERET

XLDnaute Occasionnel
Bonjour,
la fonction "CalculPool" me sert à calculer le nombre de pôles positions de chaque pilote. J'avais trouvé cette formule sur un forum et l'avais bidouillé à ma manière de débutant. Ce n'est pas mon fort.
Il est vrai qu'il me manquait une course, en l’occurrence "AbuDhabi". Une fois cela fait, tout est rentré dans l'ordre. Je vais appliquer ta formule pour "courses".
Un œil extérieur voit mieux nos erreurs.
Cordialement
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…