XL 2019 Recherche basée sur critères

duplaly

XLDnaute Occasionnel
Bonjour

J'essaye de réaliser une recherche basée sur des critères.

Extraire en liste sans doublon les # de semaines utilisées dans la feuille (Commande), colonne (E) pour les critères mentionnés en cellules (B2, C2, D2) dans la feuille Résultat.

Si je change d'années, les semaines doivent changer aussi en fonction des critères.

Dans mon code actuel proposé par un collègue, cela fonctionne sur 2 critères dans la feuille résultat en «B2 et C2». J'aimerais rajouter le critère en D2 dans la recherche.

J'ai mis mon fichier pour être plus clair dans ce que je dis.

Merci pour votre aide et temps précieux!
 

Pièces jointes

  • Base.xlsm
    35 KB · Affichages: 12

Lolote83

XLDnaute Barbatruc
Bonjour DUPLALY,
Voici ton fichier en retour avec filtre élaboré.
Dans l'onglet Result, les critères sont en B3:C4
Clic sur le bouton TEST, et la liste correspondant à tes critères s'affichera.
@+ Lolote83
 

Pièces jointes

  • Copie de DUPLALY - Filtre élaboré.xlsm
    40.7 KB · Affichages: 7

ChTi160

XLDnaute Barbatruc
Re
Bonjour Lolote83

peut être avec cette adaptation de ta procédure !
VB:
Sub Recherche()
Dim a(), d As New Dictionary, i As Long, an1 As Long, an2 As Long, Periode$
    Application.ScreenUpdating = False
    a = Worksheets("Commande").UsedRange.Value
    Worksheets("Résultat").Range("A2:A100").ClearContents
             an1 = Worksheets("Résultat").Range("B2").Value: an2 = Worksheets("Résultat").Range("C2").Value
        Periode$ = Worksheets("Résultat").Range("D2").Value
    For i = 2 To UBound(a)
        If Year(a(i, 1)) = an1 And a(i, 11) = Periode Or Year(a(i, 1)) = an2 And a(i, 11) = Periode Then   'needed date
            d(a(i, 5)) = a(i, 5)
        End If
    Next
    If d.Count > 1 Then
        Worksheets("Résultat").Range("A2").Resize(d.Count) = Application.Transpose(d.Items)
    Else
        Worksheets("Résultat").Range("A2").Value = d.Item(1)
    End If
    Worksheets("Résultat").Range("A2:A" & Worksheets("Résultat").Cells(Worksheets("Résultat").Rows.Count, "A").End(xlUp).Row).Sort key1:=Worksheets("Résultat").Range("A2"), order1:=xlAscending
    Application.ScreenUpdating = True
End Sub
ajout du troisième critère .
Bonne journée
jean marie
Edit : j'ai modifié la procédure 9:20
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour à tous

Une solution sans VBA par PowerQuery intégré à Excel

Si on choisit plus d'une année, le résultat affiche les années et semaines, sinon seulement les semaines

Actualiser par Données, Actualiser tout ou par clic droit dans le tableau de résultat
 

Pièces jointes

  • Base_Filtre_PQ.xlsx
    33.1 KB · Affichages: 16

Lolote83

XLDnaute Barbatruc
Re bonjour à tous.
Purée, encore du PowerQuery et je n'y ai pas pensé.
Cependant, suite à mon extraction, je trouve en plus de Chris du 20 et du 48 que l'on ne retrouve pas dans son fichier.
1633597168964.png

A voir.
@+ Lolote83
 

Lolote83

XLDnaute Barbatruc
Re bonjour,
Chris,
- A l'ouverture du fichier joint au post#4, voici la liste triée (Dernière ligne = 14)
1633600224817.png

- Après actualisation (Dernière ligne = 12)
1633600270017.png

Les valeurs 20 et 48 ont disparues
Que ce passe-t-il ?

Et avec la petite animation

@+ Lolote83
 

Pièces jointes

  • PowerQuery-Chris.gif
    PowerQuery-Chris.gif
    70.9 KB · Affichages: 17
Dernière édition:

duplaly

XLDnaute Occasionnel
Re
Bonjour Lolote83

peut être avec cette adaptation de ta procédure !
VB:
Sub Recherche()
Dim a(), d As New Dictionary, i As Long, an1 As Long, an2 As Long, Periode$
    Application.ScreenUpdating = False
    a = Worksheets("Commande").UsedRange.Value
    Worksheets("Résultat").Range("A2:A100").ClearContents
             an1 = Worksheets("Résultat").Range("B2").Value: an2 = Worksheets("Résultat").Range("C2").Value
        Periode$ = Worksheets("Résultat").Range("D2").Value
    For i = 2 To UBound(a)
        If Year(a(i, 1)) = an1 And a(i, 11) = Periode Or Year(a(i, 1)) = an2 And a(i, 11) = Periode Then   'needed date
            d(a(i, 5)) = a(i, 5)
        End If
    Next
    If d.Count > 1 Then
        Worksheets("Résultat").Range("A2").Resize(d.Count) = Application.Transpose(d.Items)
    Else
        Worksheets("Résultat").Range("A2").Value = d.Item(1)
    End If
    Worksheets("Résultat").Range("A2:A" & Worksheets("Résultat").Cells(Worksheets("Résultat").Rows.Count, "A").End(xlUp).Row).Sort key1:=Worksheets("Résultat").Range("A2"), order1:=xlAscending
    Application.ScreenUpdating = True
End Sub
ajout du troisième critère .
Bonne journée
jean marie
Edit : j'ai modifié la procédure 9:20

Re
Bonjour Lolote83

peut être avec cette adaptation de ta procédure !
VB:
Sub Recherche()
Dim a(), d As New Dictionary, i As Long, an1 As Long, an2 As Long, Periode$
    Application.ScreenUpdating = False
    a = Worksheets("Commande").UsedRange.Value
    Worksheets("Résultat").Range("A2:A100").ClearContents
             an1 = Worksheets("Résultat").Range("B2").Value: an2 = Worksheets("Résultat").Range("C2").Value
        Periode$ = Worksheets("Résultat").Range("D2").Value
    For i = 2 To UBound(a)
        If Year(a(i, 1)) = an1 And a(i, 11) = Periode Or Year(a(i, 1)) = an2 And a(i, 11) = Periode Then   'needed date
            d(a(i, 5)) = a(i, 5)
        End If
    Next
    If d.Count > 1 Then
        Worksheets("Résultat").Range("A2").Resize(d.Count) = Application.Transpose(d.Items)
    Else
        Worksheets("Résultat").Range("A2").Value = d.Item(1)
    End If
    Worksheets("Résultat").Range("A2:A" & Worksheets("Résultat").Cells(Worksheets("Résultat").Rows.Count, "A").End(xlUp).Row).Sort key1:=Worksheets("Résultat").Range("A2"), order1:=xlAscending
    Application.ScreenUpdating = True
End Sub
ajout du troisième critère .
Bonne journée
jean marie
Edit : j'ai modifié la procédure 9:20
Bonjour
J'aime bien le code proposé qui fonctionne. Il y a juste une petite correction à apporter selon mon test.
si je choisi la même année dans les critères 1 et 2, je n'ai aucun résultat.

Merci pour ton temps

1633612064804.png
 

Discussions similaires

Réponses
9
Affichages
404

Statistiques des forums

Discussions
312 329
Messages
2 087 331
Membres
103 519
dernier inscrit
Thomas_grc11