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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
Private Sub UserForm_Initialize()
Dim Dico As Object
Dim Cles As Variant
Dim Plage As Range
Dim Cel As Range
Dim I As Integer
'rempli le combo avec le nom des ateliers, adapter le nom...
With Worksheets("Feuil1")
Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
'utilise un dictionnaire pour éviter les doublons
Set Dico = CreateObject("Scripting.Dictionary")
For Each Cel In Plage
If Dico.exists(Cel.Value) = False Then
Dico.Add Cel.Value, Cel.Value
End If
Next Cel
Cles = Dico.Keys
'rempli le combo
For I = 0 To Dico.Count - 1
CmbAtelier.AddItem Cles(I)
Next I
'défini la listbox (nombre de colonnes et leur largeur)
With LstResultats
.ColumnCount = 4
.ColumnWidths = "50;50;50;50"
End With
End Sub
Private Sub CmbAtelier_Click()
LstResultats.Clear
Filtre CmbAtelier.Text
End Sub
Sub Filtre(Atelier As String)
Dim Fe_Filtre As Worksheet
Dim Fe_Recup As Worksheet
Dim Plage As Range
Dim PlageDate As Range
Dim Cel As Range
Dim I As Integer
Dim J As Integer
Dim DateMax As Date
Dim Derlgn As Long
'feuille sur laquelle exécuter le filtrage, adapter le nom...
Set Fe_Filtre = Worksheets("Feuil1")
'défini la feuille "Feuil2" comme cible pour
'la récupération des valeurs filtrées, si pas libre, adapter le nom...
Set Fe_Recup = Worksheets("Feuil2")
'vide la feuille au cas où il y aurait des cellules non vides
Fe_Recup.UsedRange.Cells.Clear
'défini la plage à filtrer sur toute la zone utilisée de la feuille
Set Plage = Fe_Filtre.UsedRange
With Plage
'exécute le filtrage sur le champ 1 (colonne A, les ateliers)
.AutoFilter 1, Atelier
'copie les valeurs filtrées dans la feuille qui sert de tranfert
Fe_Filtre.AutoFilter.Range.EntireRow.Copy Fe_Recup.[A1]
'supprime le filtrage
.AutoFilter
End With
'redéfini la plage
Set Plage = Fe_Recup.UsedRange
Derlgn = Plage.Rows.Count + 2
With Plage
For I = 1 To 5
'filtre sur les codes de 1 à 5
.AutoFilter 2, I
'colle le résultat deux lignes en dessous
Fe_Recup.AutoFilter.Range.EntireRow.Copy Fe_Recup.Cells(Derlgn, 1)
'supprime le filtrage
.AutoFilter
'défini la nouvelle plage pour récupérer la date max
With Fe_Recup
Set PlageDate = .Range(.Cells(Derlgn, 1), .Cells(.Rows.Count, 8).End(xlUp))
End With
'si au moins un enregistrement existe ("> 1" car un filtrage emporte systématiquement la ligne d'entêtes)
If PlageDate.Rows.Count > 1 Then
'recherche la date la plus récente
DateMax = Application.WorksheetFunction.Max(PlageDate.Columns(3))
'en recherche sa position
Set Cel = PlageDate.Columns(3).Find(DateMax, , xlValues, xlWhole)
If Not Cel Is Nothing Then
With LstResultats
.AddItem Cel.Offset(0, 2).Value
.Column(1, J) = Cel.Offset(0, 3).Value
.Column(2, J) = Cel.Offset(0, 4).Value
.Column(3, J) = Cel.Offset(0, 5).Value
J = J + 1
End With
PlageDate.Clear
End If
End If
Next I
End With
'vide la feuille
Fe_Recup.UsedRange.Cells.Clear
End Sub |
Partager