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
| Sub test()
Dim Sh As Worksheet, Dico As Object, C As Range, Ligne As Long, Plage As Range
Dim DicoDates As Object, X As Range, Plage2 As Range
Ligne = 1
Set Sh = Sheets("TempsMOD")
With Sheets("TempsMOD")
.Range(.[A2], .Cells(.Rows.Count, 4).End(xlUp)).ClearContents
End With
With Sheets("BASE")
Set Dico = CreateObject("Scripting.Dictionary")
Set DicoDates = CreateObject("Scripting.Dictionary")
Set Plage = .Range(.[C5], .Cells(.Rows.Count, 3).End(xlUp)).Resize(, 16)
For Each C In .Range(.[C6], .Cells(.Rows.Count, 3).End(xlUp))
If Not Dico.exists(C.Value) And C.Value <> "" Then
Dico.Add C.Value, C.Value
.AutoFilterMode = False
Set Plage = .Range(.[C5], .Cells(.Rows.Count, 3).End(xlUp)).Resize(, 16)
Plage.AutoFilter 1, C.Value
Plage.AutoFilter 14, 309
Set Plage = Plage.Offset(1).Resize(Plage.Rows.Count - 1)
If Application.Subtotal(103, Plage) > 0 Then
Set Plage = Plage.SpecialCells(xlCellTypeVisible)
DicoDates.RemoveAll
Set Plage2 = .AutoFilter.Range.Resize(, 1).Offset(1, 12)
Set Plage2 = Plage2.Resize(Plage2.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
For Each X In Plage2
If Not DicoDates.exists(X.Value) Then
DicoDates.Add X.Value, X.Value
Plage.AutoFilter 13, X.Value
Ligne = Ligne + 1
Sh.Cells(Ligne, 1) = C.Offset(, 1)
Sh.Cells(Ligne, 2) = C.Offset(, 2)
Sh.Cells(Ligne, 3) = X.Value
Sh.Cells(Ligne, 4) = Application.Subtotal(109, .Columns(19))
End If
Next X
End If
.AutoFilterMode = False
End If
Next C
End With
With Sheets("TempsMOD")
.Range(.[A1], .Cells(.Rows.Count, 4).End(xlUp)).Range(.[A1], .Cells(.Rows.Count, 4).End(xlUp)).Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
, Order2:=xlAscending, Key3:=Range("D2"), Order3:=xlAscending, Header:=xlGuess
End With
End Sub |
Partager