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
|
Sub date_prod()
Dim i As Integer
Dim j As Integer
Dim l As Integer
Dim ShSource As Worksheet
Dim ShDest As Worksheet
Dim CellSource As Range
Dim Cell As Range
Dim Reponse As String
Dim DerLigSource As Long
Dim DerLigDest As Long
Dim PlageFiltre As Range
' mise sous variable des deux feuilles
With ThisWorkbook
Set ShSource = .Worksheets("Tableau2")
Set ShDest = .Worksheets("Tableau1")
End With
DerLigDest = ShDest.UsedRange.Rows.Count
DerLigSource = ShSource.UsedRange.Rows.Count
' tri ascendant de la colonne
With ShDest.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("F1", "F" & DerLigDest), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A1", "G" & DerLigDest)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' on boucle sur chaque ligne de tableau2
' on positionne CellSource sur la colonne A de cette ligne
For i = 2 To DerLigSource
Set CellSource = ShSource.Range("A" & i)
Reponse = ShSource.Range("A" & i)
With ShDest
' désactive les filtres automatiques
.AutoFilterMode = False
With .Range("A1")
' on filtre la colonne F avec le numéro de semaine
.AutoFilter 6, Reponse, xlFilterValues
End With
' on récupère la plage filtrée
' gestion du cas où le numéro de semaine testé n'existe pas dans tableau 1
If .Range(.Cells(1, 6), .Cells(DerLigDest, 6)).SpecialCells(xlCellTypeVisible).Address = "$F$1" Then
Set PlageFiltre = Nothing
Else
Set PlageFiltre = .Range(.Cells(2, 6), .Cells(DerLigDest, 6)).SpecialCells(xlCellTypeVisible)
End If
End With
If Not PlageFiltre Is Nothing Then
' on se positionne sur la première cellule de la plage filtrée
Set Cell = PlageFiltre(1, 1)
' pour les 5 jours de la semaine
For j = 2 To 6
' on boucle autant de fois que le nombre de pièces à produire sur cette journé
For l = 0 To CellSource.Offset(0, j) - 1
' on écrit la date de production sur les "l" lignes de tableau 1
Cell.Offset(l, 1) = CDate(CellSource.Offset(0, j + 7))
Next l
' on décale Cell pour écrire le jour de la semaine suivant
Set Cell = Cell.Offset(CellSource.Offset(0, j), 0)
Next j
End If
Next i
ShDest.AutoFilterMode = False
Set PlageFiltre = Nothing
Set Cell = Nothing
Set CellSource = Nothing
Set ShDest = Nothing
Set ShSource = Nothing
End Sub |
Partager