1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
Sub Recup()
Dim Fe_1 As Worksheet
Dim Fe_2 As Worksheet
Dim Fe_3 As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Dico As Object
Dim Cle As Variant
Dim Ligne As Long
Dim Max As Long
Dim DerLigne As Long
Set Fe_1 = Worksheets("Feuil1")
Set Fe_2 = Worksheets("Feuil2")
Set Fe_3 = Worksheets("Feuil3")
Set Dico = CreateObject("Scripting.Dictionary")
'défini la plage sue la feuille "Feuil1" colonne A
With Fe_1
Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
'dédoublonne
For Each Cel In Plage
If Dico.exists(Cel.Value) = False Then
Dico.Add Cel.Value, Cel.Value
End If
Next Cel
'redéfini la plage sur les colonnes cibles, ici A1 à C...
'La plage est sensée avoir une ligne d'entêtes
With Fe_1
Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 3).End(xlUp))
End With
'parcour les codes article uniques pour le filtrage
For Each Cle In Dico.Keys
Plage.AutoFilter 1, Cle 'applique le filtre
Fe_1.AutoFilter.Range.EntireRow.Copy Fe_2.Range("A1") 'copie le résultat sur la feuille "Feuil2"
Plage.AutoFilter 'supprime le filtre
With Fe_2
'recherche la valeur max
Max = Application.WorksheetFunction.Max(.Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp)))
'recherche la ligne où se trouve cette valeur max
Ligne = Application.WorksheetFunction.Match(Max, .Range(.Cells(2, 2), .Cells(.Rows.Count, 2).End(xlUp)), 0)
'cherche la première ligne vide
DerLigne = Fe_3.Cells(Rows.Count, 1).End(xlUp).Row + 1
'et récupère le résultat ici, sur les trois colonnes...
Fe_3.Range(Fe_3.Cells(DerLigne, 1), Fe_3.Cells(DerLigne, 3)).Value = .Range(.Cells(Ligne + 1, 1), .Cells(Ligne + 1, 3)).Value
'vide la feuille "Feuil2" qui sert d'intermédiaire
.Cells.Clear
End With
Next Cle
End Sub |
Partager