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.
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
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