Sub recap()
Dim cs As Workbook 'déclare la variable cs (Classeur Source)
Dim ch As String 'déclare la variable ch (CHemin)
Dim nc As String 'déclare la variable nc (Nom du Classeur)
Dim cc As Workbook 'déclare la variable cc (Classeur Cible)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim no As String 'déclare la variable no (Nom Onglet)
Dim j As Byte 'déclare la variable j (Jour)
Dim oc As Object 'déclare la variable cs (Onglet Cible)
Dim t As String 'déclare la variable t (Travail)
Dim h As Byte 'déclare la variable cs (Heure)
Dim l As String 'déclare la variable cs (Lieu)
Dim li As Range 'déclare la variable li (recherche de la LIgne)
Dim col As Range 'déclare la variable col (recherche de la COLonne)
Set cs = ThisWorkbook 'définit la classeur source cs
ch = "D:\ANNEE 2013\FEUILLES D'HEURES + ADM\MTE\" 'définit la chemin d'accès (à adapter)"
nc = "HEURES MTE JANVIER.xls" 'dénifit le nom du classeur cible (à adapter)
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set cc = Workbooks(nc) 'définit le classeur cible (si ce classeur n'est pas ouvert, cela génère une ereur)
If Err <> 0 Then 'condition : si une erreur a été générée
Err = 0 'annule l'ereur
Workbooks.Open (ch & nc) 'ouvre le classeur cible
Set cc = Workbooks(nc) 'définit le classeur cible
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Set os = cs.Sheets("Travaux") 'définit l'onglet source
dl = os.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée de la colonne 2 (= B)de l'onglet source
Set pl = os.Range("B2:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
If cel.Offset(0, 5).Value = "MTE" And cel.Interior.ColorIndex <> 6 Then 'condition 1 : si la cellule en colonne G est ;égale à "MTE" et si la cellule n'est pas de couleur jaune
j = CByte(Day(cel.Value)) 'définit la jour j
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set oc = cc.Sheets(cel.Offset(0, 1).Value) 'définit le l'onglet cible (si cet onglet n'existe pas, cela génère une ereur)
If Err <> 0 Then 'condition 2 : si une erreur a été générée
Err = 0 'annule l'ereur
If MsgBox("L'onglet " & cel.Offset(0, 1).Value & " n'existe pas ! Voulez-vous le créer ?", vbYesNo, "Attention !") = vbNo Then 'condition 3 : si "Non" au message
With cs.Sheets("travaux") 'prend en compte l'onglet "Travaux" du classeur source
.Range(.Cells(cel.Row, 1), .Cells(cel.Row, 8)).Interior.ColorIndex = 3 'colore la ligne en rouge
End With 'fin de la prise en compte de l'ongelt "travaux" du classeur source
Else 'si "Oui au message"
no = cel.Offset(0, 1).Value
cc.Sheets("vide").Copy After:=cc.Sheets(cc.Sheets.Count)
cc.Sheets(cc.Sheets.Count).Name = no
Set oc = cc.Sheets(no)
oc.Range("C3").Value = no
oc.Move Before:=cc.Sheets(cc.Sheets.Count - 3)
End If 'fin de la condition 3
End If 'fin de la condition 2
On Error GoTo 0 'annule la gestion des erreurs
If Month(cel.Value) = Month(cc.Sheets("MOI").Range("C2")) Then 'condition 3 : si le mois est égal au mois de la cellule C2 du classeur cible onglet "MOI"
With cs.Sheets("Travaux") 'prend en compte l'onglet "Travaux" du classeur source
.Range(.Cells(cel.Row, 1), .Cells(cel.Row, 8)).Interior.ColorIndex = IIf(.Range(.Cells(cel.Row, 1), .Cells(cel.Row, 8)).Interior.ColorIndex = 3, 3, 6) 'colore la ligne en jaune
End With 'fin de la prise en compte de l'ongelt "travaux" du classeur source
t = cel.Offset(0, 2).Value 'définit le travail t
'h = CByte(cel.Offset(0, 3).Value) 'définit le nombre d'heures h
l = cel.Offset(0, 4).Value 'définit le lieu l
Set li = oc.Columns(1).Find(j, oc.Range("A3"), xlValues, xlWhole) 'définit la ligne li qui recevra les données
If Not li Is Nothing Then 'condition 4 : si il existe au moins une occurrence de la ligne li trouvée
'li.Offset(0, 1).Value = IIf(li.Offset(0, 1).Value = "", h, "") 'place le nombre d'heures h si un seul travail, sinon efface
li.Offset(0, 2).Value = IIf(li.Offset(0, 2).Value = "", t, li.Offset(0, 2).Value & " + " & t) 'place le travail t
Set col = oc.Rows(3).Find(l, oc.Range("C3"), xlValues, xlWhole) 'définit la colonne du lieu
If Not col Is Nothing Then oc.Cells(li.Row, col.Column).Value = "X" 'si il existe au moins une occurrence trouvée du lieu, place un "X" dans la colonne col
End If 'fin de la condition 4
End If 'fin de la condition 3
End If 'fin de la condition 1
suite: 'étiquette
Next cel 'prochaine cellule de la boucle
MsgBox "Toutes les données ont été traîtées sauf d'éventuelles lignes en rouge !"
End Sub