Extraire lignes vers autre feuille en fonction d'un critère

EX…xlsx (11,0 Ko)
Bonjour, je me permet de faire appel a vos compétences pour me venir en aide.

J’ai une base de donnée a crée pour simplifier le travail d’une de mes collègue.

Je dois en fonction d’une liste déroulante (Semaine) faire apparaitre les livraisons correspondante. J’ai essayer avec =RechercheV mais cela n’extrait uniquement la première donner.

J’espère que je suis assez claire dans ma demande.

Je vous met un extrait de mon fichier en pièce jointe.

Merci d’avance.

Bonjour
image

1 « J'aime »

Merci je ne trouvais le bouton.

Je viens de le mettre

Bonsoir @lili98,
Salut @Mimimathy,:wink:

Je passais par là vite fait.

Une proposition par formule.

Dans la feuille “SEMAINE” en “A4”

=SI(LIGNES($4:4)<=NB.SI(COMMANDE!$A$2:$A$500;$B$1);INDEX(COMMANDE!A$2:A$500;PETITE.VALEUR(SI(COMMANDE!$A$2:$A$500=$B$1;LIGNE(INDIRECT("1:"&LIGNES(COMMANDE!$A$2:$A$500))));LIGNES($4:4)));"")

Formule matricielle à valider avec ctrl + maj + entrée
Tirer vers la droite et vers le bas autant que nécessaire.

Fichier en retour ICI==> EX lili98.xlsx (13,9 Ko)

Cordialement.

1 « J'aime »

Bonjour,
Salut MDO

Juste pour le fun, une version VBA.
La liste de validation est dynamique. Elle se charge à chaque activation de la feuille Semaine

Private Sub Worksheet_Activate() 'A l'activation de la feuille SEMAINE
  Dim derlg%
  With Sheets("données")
    .Columns("C:C").Clear 'J'efface la liste pour la validation des semaines
    derlg = Sheets("COMMANDE").Cells(Rows.Count, "A").End(xlUp).Row ' dernière cellule non vide de la colonne A Commande
    'Filtre sans doublons les N° de semaine de la feuille COMMANDE
    Sheets("COMMANDE").Range("A2:A" & derlg).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("C2"), Unique:=True
    derlg = .Cells(Rows.Count, "C").End(xlUp).Row 'dernière cellule non vide de la colonne C DONNEES
    'Effectue le tri ascendant
    .Range("C2:C" & derlg).Sort Key1:=.Range("C2"), Order1:=xlAscending
    'Nomme la plage
    .Range("C2:C" & derlg).Name = "Maliste"
  End With
  Sheets("SEMAINE").Activate
  Sheets("SEMAINE").Range("B1").Select
  With Selection.Validation 'Attribue à la liste de validation la plage pour les N° Semaine
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=Maliste"
  End With
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("B1")) Is Nothing Then 'Sur changement de la liste de validation en B1
    Application.EnableEvents = False
    'Déclaration des variables
    Dim Ws As Worksheet, Wd As Worksheet
    Dim i%, Dl%, Lig%
    'Attribution des variables
    Set Ws = Sheets("COMMANDE")
    Set Wd = Sheets("SEMAINE")
    Dl = Ws.Range("A" & Rows.Count).End(xlUp).Row ' dernière cellule non vide de la colonne A Commande
    Lig = Wd.Range("A" & Rows.Count).End(xlUp).Row + 1 'dernière cellule non vide de la colonne A Semaine
    Wd.Range("A4:H" & Lig).Clear 'Vide la feuille Semaine des anciennes données
    Lig = 4
    For i = 2 To Dl 'boucle sur les N° de semaine de la feuille COMMANDE
      If Ws.Cells(i, 1) = Wd.Range("B1") Then 'Si le N° correspond à la semaine voulue
        Ws.Activate
        Ws.Rows(i).Copy Wd.Rows(Lig) 'je copie la ligne
        Lig = Lig + 1 'j'ajoute 1 à la ligne de la feuille semaine
      End If
    Next i
  End If
  Application.EnableEvents = True
  Wd.Select
End Sub

EX…xlsm (24,2 Ko)

1 « J'aime »

Bien le bonjour @Mimimathy,

Excellent comme tu sais le faire, j’ai hésité a proposer une version en VBA que j’avais dans mes archives sachant que tu passerais par ici.

Toutefois et très modestement pour éviter un effet de scintillement lors du changement de N° de semaine en « B1 » j’ai ajouté à ton code un p’tit:
Application.ScreenUpdating = False

Le code de Mimimathy:

Private Sub Worksheet_Activate() 'A l'activation de la feuille SEMAINE
  Dim derlg%
  With Sheets("donn?es")
    .Columns("C:C").Clear 'J'efface la liste pour la validation des semaines
    derlg = Sheets("COMMANDE").Cells(Rows.Count, "A").End(xlUp).Row ' derni?re cellule non vide de la colonne A Commande
    'Filtre sans doublons les N? de semaine de la feuille COMMANDE
    Sheets("COMMANDE").Range("A2:A" & derlg).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range("C2"), Unique:=True
    derlg = .Cells(Rows.Count, "C").End(xlUp).Row 'derni?re cellule non vide de la colonne C DONNEES
    'Effectue le tri ascendant
    .Range("C2:C" & derlg).Sort Key1:=.Range("C2"), Order1:=xlAscending
    'Nomme la plage
    .Range("C2:C" & derlg).Name = "Maliste"
  End With
  Sheets("SEMAINE").Activate
  Sheets("SEMAINE").Range("B1").Select
  With Selection.Validation 'Attribue ? la liste de validation la plage pour les N? Semaine
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=Maliste"
  End With
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("B1")) Is Nothing Then 'Sur changement de la liste de validation en B1
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    'D?claration des variables
    Dim Ws As Worksheet, Wd As Worksheet
    Dim i%, Dl%, Lig%
    'Attribution des variables
    Set Ws = Sheets("COMMANDE")
    Set Wd = Sheets("SEMAINE")
    Dl = Ws.Range("A" & Rows.Count).End(xlUp).Row ' derni?re cellule non vide de la colonne A Commande
    Lig = Wd.Range("A" & Rows.Count).End(xlUp).Row + 1 'derni?re cellule non vide de la colonne A Semaine
    Wd.Range("A4:H" & Lig).Clear 'Vide la feuille Semaine des anciennes donn?es
    Lig = 4
    For i = 2 To Dl 'boucle sur les N? de semaine de la feuille COMMANDE
      If Ws.Cells(i, 1) = Wd.Range("B1") Then 'Si le N? correspond ? la semaine voulue
        Ws.Activate
        Ws.Rows(i).Copy Wd.Rows(Lig) 'je copie la ligne
        Lig = Lig + 1 'j'ajoute 1 ? la ligne de la feuille semaine
      End If
    Next i
  End If
  Application.EnableEvents = True
  Wd.Select
End Sub

Le fichier ICI==> EX Mimimathy pour lili98.xlsm (21,7 Ko)

Amicalement.

2 « J'aime »

Re,

Comme quoi, on oublie toujours quelques chose pour améliorer :grin:

Merci beaucoup je vais essayer ça de suite

Mmmmmh cela me parait beaucoup plus compliqué mais je vais essayer.

Bonsoir @Mimimathy , @mdo100 , lili98

Je vient mettre mon petit grain de sel et je vois que @Mimimathy et @mdo100 continue les exercices c’est

bien :wink:

Voila mois j’ais juste fais un filtre avancé avec l’enregistreur de macro en retour le classeur

======>EX…xlsm (19,3 Ko)

Cdlt

@kiss6

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.