Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim PLV As Range 'déclare la variable PLV (PLage des cellules Visibles)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim OD1 As Object 'déclare la variable OD1 (Onglet de Destination 1)
Dim OD2 As Object 'déclare la variable OD2 (Onglet de Destination 2)
Dim I As Integer 'déclare la variable I (Incrément de machine)
Dim J As Byte 'déclare la variable J (incrément de Jour)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim C As Byte 'déclare la variable C (Type Contrôle))
Dim R As Byte 'déclare la variable R (type Réglage)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Sheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, 5).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 5 (=E) de l'onglet O
Set PL = O.Range("E2:E" & DL) 'définit la plage PL
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
D(CEL.Value) = "" 'alimente le dictionnaire D
Next CEL 'prochaine cellule de la boucle
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste sans doublons des machines de la colonne E
For I = 0 To UBound(TMP) 'boucle 1 : sur toutes les machines du tableau temporaire TMP
Set OD1 = Sheets(TMP(I) & "-7,95") 'définit l'onglet OD1
Set OD2 = Sheets(TMP(I) & "-9,14") 'définit l'onglet OD2
For J = 2 To 6 'boucle 2 : de 2 à 6 sur les 5 jours (du lundi au vendredi)
O.Range("A1").AutoFilter 'supprime un éventuel filtre existant
O.Range("A1").AutoFilter Field:=5, Criteria1:=TMP(I) 'filtre la colonne E par rapport à la machine TMP(I) de la boucle 1
O.Range("A1").AutoFilter Field:=8, Criteria1:=J 'filtre la colonne H par rapport au jour J de la boucle 2
O.Range("A1").AutoFilter Field:=7, Criteria1:="M" 'filtre la colonne G par rapport au critère "M"
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
'cette ligne génère une erreur si les filtres n'affichent aucune ligne visible
Set PLV = PL.SpecialCells(xlCellTypeVisible).Offset(0, -2) 'définit la plage PLV (cellulles de la plage PL visibles en colonne C)
If Err <> 0 Then Err.Clear: GoTo suite1 'si une erreur a été générée, annule l'erreur, va à l'étiquette "suite1"
C = 5: R = 11 'initialise les variables C et R
For Each CEL In PLV 'boucle 3 : sur toutes les cellules CEL de la plage PLV
COL = IIf(CEL.Offset(0, 3).Value = "Réglage", R, C) 'définit la colonne COL en fonction du type
'récupère la valeur "7,95" et la place en fonction du jour J dans l'onglet OD1
OD1.Cells((2 * J) + (J - 2), COL).Value = CEL.Value
'récupère la valeur "9,14" et la place en fonction du jour J dans l'onglet OD2
OD2.Cells((2 * J) + (J - 2), COL).Value = CEL.Offset(0, 1).Value
'incrémente les variables C et R
C = IIf(CEL.Offset(0, 3).Value = "Réglage", C, C + 1): R = IIf(CEL.Offset(0, 3).Value = "Réglage", R + 1, R)
Next CEL 'prochaine cellule de la boucle 3
suite1: 'étiquette
O.Range("A1").AutoFilter Field:=7, Criteria1:="AM" 'filtre la colonne G par rapport au critère "AM"
'cette ligne génère une erreur si les filtres n'affichent aucune ligne visible
Set PLV = PL.SpecialCells(xlCellTypeVisible).Offset(0, -2) 'définit la plage PLV (cellulles de la plage PL visibles en colonne C)
If Err <> 0 Then Err.Clear: GoTo suite2 'si une erreur a été générée, annule l'erreur, va à l'étiquette "suite2"
C = 5: R = 11 'initialise les variables C et R
For Each CEL In PLV 'boucle 4 : sur toutes les cellules CEL de la plage PLV
COL = IIf(CEL.Offset(0, 3).Value = "Réglage", R, C) 'définit la colonne COL en fonction du type
'récupère la valeur "7,95" et la place en fonction du jour J dans l'onglet OD1
OD1.Cells((2 * J) + (J - 1), COL).Value = CEL.Value
'récupère la valeur "9,14" et la place en fonction du jour J dans l'onglet OD2
OD2.Cells((2 * J) + (J - 1), COL).Value = CEL.Offset(0, 1).Value
'incrémente les variables C et R
C = IIf(CEL.Offset(0, 3).Value = "Réglage", C, C + 1): R = IIf(CEL.Offset(0, 3).Value = "Réglage", R + 1, R)
Next CEL 'prochaine cellule de la boucle 4
suite2: 'étiquette
O.Range("A1").AutoFilter Field:=7, Criteria1:="N" 'filtre la colonne G par rapport au critère "N"
'cette ligne génère une erreur si les filtres n'affichent aucune ligne visible
Set PLV = PL.SpecialCells(xlCellTypeVisible).Offset(0, -2) 'définit la plage PLV (cellulles de la plage PL visibles en colonne C)
If Err <> 0 Then Err.Clear: GoTo suite3 'si une erreur a été générée, annule l'erreur, va à l'étiquette "suite3"
C = 5: R = 11 'initialise les variables C et R
For Each CEL In PLV 'boucle 5 : sur toutes les cellules CEL de la plage PLV
COL = IIf(CEL.Offset(0, 3).Value = "Réglage", R, C) 'définit la colonne COL en fonction du type
'récupère la valeur "7,95" et la place en fonction du jour J dans l'onglet OD1
OD1.Cells((2 * J) + J, COL).Value = CEL.Value
'récupère la valeur "9,14" et la place en fonction du jour J dans l'onglet OD2
OD2.Cells((2 * J) + J, COL).Value = CEL.Offset(0, 1).Value
'incrémente les variables C et R
C = IIf(CEL.Offset(0, 3).Value = "Réglage", C, C + 1): R = IIf(CEL.Offset(0, 3).Value = "Réglage", R + 1, R)
Next CEL 'prochaine cellule de la boucle 5
suite3: 'étiquette
Next J 'prochain jour de la boucle 2
Next I 'prochaine machine de la boucle 1
O.Range("A1").AutoFilter 'supprime le filtre automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
MsgBox "Données traitées !" 'message
End Sub