Liste triée ordre alpha sans doublon suivant 3 critères

olivierk1450

XLDnaute Nouveau
Bonjour,

J'ai une formule très compliqué à mettre en place, je parviens à faire ce que je veux avec un critère pas avec 3
Un p'tit exemple ci dessous pour une liste sans doublon sur 1 critère

=INDEX($D$1:$D$50;MIN(SI(d_heure_sco<>0;SI(NB.SI(H$1:H1;d_heure_nom)=0;LIGNE(d_heure_nom);LIGNES(d_heure_nom)+LIGNE(d_heure_nom)))))

... J'ai pas mieux
Merci d'avance
 

Pièces jointes

  • exemple.xlsx
    12.3 KB · Affichages: 67

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir olivierk1450,

Un essai via macro (le classeur a donc été enregistré en .xlsm). La macro s'éxécute automatiquement dès qu'une valeur sur la feuille "Feuil1" est modifiée.
Le code est entièrement dans le module de code de la feuille "Feuil1":
VB:
Sub Liste3Crit()
Dim debut, fin, derlig, tablo, dico, i&, key

   debut = Range("a1"): fin = Range("a2")
   Range("h2:h" & Rows.Count).ClearContents
   derlig = Cells(Rows.Count, "d").End(xlUp).Row
   tablo = Range("c2:e" & derlig)
   Set dico = CreateObject("scripting.dictionary")
   dico.comparemode = vbTextCompare
   For i = 1 To UBound(tablo)
      If tablo(i, 1) >= debut And tablo(i, 1) <= fin And tablo(i, 3) <> 0 Then
         dico(tablo(i, 2)) = ""
      End If
   Next i
   If dico.Count > 0 Then
      ReDim res(1 To dico.Count, 1 To 1): i = 0
      For Each key In dico.keys
         i = i + 1: res(i, 1) = key
      Next key
      Range("h2").Resize(dico.Count) = res
      Range("h1").Resize(dico.Count + 1).Sort Range("h1"), xlAscending, Header:=xlYes
   End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim oldsel

   If Not Intersect(Target, Union(Range("a1:a2"), Range("c:e"))) Is Nothing Then
      Application.EnableEvents = False
      Set oldsel = Selection
      Liste3Crit
      Application.EnableEvents = True
      oldsel.Select
   End If
End Sub
 

Pièces jointes

  • olivierk1450- liste triée 3 crit- v1.xlsm
    20.1 KB · Affichages: 63

olivierk1450

XLDnaute Nouveau
Hello,

Il n'y a pas de colonne de date de fin. Juste la colonne C qui détermine la date à prendre en compte.
Ma recherche doit filtrer et trier les noms, si la date en C est comprise entre la date début (A1) et la date fin (A2).
C'est plus clair ou moins obscure ?
Merci pour ton aide.
 

CISCO

XLDnaute Barbatruc
Bonsoir

Cf. en pièce jointe, une possibilité avec une "petite" formule matricielle à valider avec les 3 touches Ctrl+maj+entrer.
Code:
=SI(SOMME((NB.SI(G$1:G1;D$2: D$26)=0)*NB.SI(D$2:D$26;">"&D$2:D$26)*(date_debut<=C$2:C$26)*(C$2:C$26<=date_fin)*(E$2:E$26<>0))=0;"";INDEX(D$2: D$26;EQUIV(MAX((NB.SI(G$1:G1;D$2: D$26)=0)*NB.SI(D$2: D$26;">"&D$2: D$26)*(date_debut<=C$2:C$26)*(C$2:C$26<=date_fin)*(E$2:E$26<>0));(NB.SI(G$1:G1;D$2: D$26)=0)*NB.SI(D$2: D$26;">"&D$2:D$26)*(date_debut<=C$2:C$26)*(C$2:C$26<=date_fin)*(E$2:E$26<>0);0)))


NB.SI(G$1:G1;D$2: D$26)=0 permet de ne conserver que les noms non déjà cités dans la colonne G.
NB.SI(D$2: D$26;">"&D$2: D$26) permet de classer les noms dans l'ordre alphabétique
(date_debut<=C$2:C$26)*(C$2:C$26<=date_fin) permet de ne garder que les noms avec une date dans la colonne C comprise entre date_début et date_fin.
(E$2:E$26<>0) permet de ne prendre en compte que les noms n'ayant pas un 0 dans la colonne E.

On peut écrire cela plus simplement sous la forme
Code:
=SI(SOMME(test)=0;"";INDEX(D$2:D$26;EQUIV(MAX(test);test;0)))
avec le nom test défini dans le gestionnaire de noms sous la forme
=(NB.SI(G$1:G1;D$2: D$26)=0)*NB.SI(D$2: D$26;">"&D$2: D$26)*(date_debut<=C$2:C$26)*(C$2:C$26<=date_fin)*(E$2:E$26<>0)

Le mieux serait de définir des plages dynamiques, correspondant à D2: D26, C2:C26 et E2:E26, mais dont la hauteur s'adapterait automatiquement à la hauteur de ton fichier.

@ plus
 

Pièces jointes

  • olivierk1450- liste triée 3 crit- v1.xlsm
    25.6 KB · Affichages: 44
Dernière édition:

R@chid

XLDnaute Barbatruc
Bonjour @tous,
Salut l'ami CISCO,
oui tu as raison, je suis très habitué à petite.valeur;1 puisqu'elle renvoie une erreur #NOMBRE que je gère par le biais de SIERREUR(), par-contre MIN() plusieurs fois elle me renvoie des 0 et du coup le résultat de INDEX() sera la première valeur de la colonne de recherche.

@ + +
 

CISCO

XLDnaute Barbatruc
Bonjour

@ R@chid : Ici, cela fonctionne avec MIN, mais comme cela n'est pas toujours le cas, ton astuce est intéressante à garder. Merci pour l'info. Pour obtenir des cellules vides, je suis passé par un SI(SOMME(test)=0;"";, mais c'est plutôt lourd...

@ plus
 

CISCO

XLDnaute Barbatruc
Bonjour

OK. J'avais bien compris, puisque j'ai le même type de pb : en cherchant à ne pas utiliser des SI, je ne peux pas faire avec un SIERREUR, car, une fois la liste des noms convenant donnée, je n'obtiens pas une erreur, mais un INDEX(....; 0).

@ plus
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 974
Membres
103 076
dernier inscrit
LoneWolf90