Bonjour le fil, bonjour le forum,
Une proposition en pièce jointe avec le code ci-dessous :
Sub Macro1()
Dim OT As Worksheet 'déclare la variable OT (Onglet Travaux)
Dim OS As Worksheet 'déclare la variable OS (Onglet Salarié)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TS As Variant 'déclare la variable TS (Tableau des Salariés)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Application.ScreenUpdating = False 'masque les message Excel
Application.DisplayAlerts = False 'masque les rafraîchissements d'écran
Set OT = Worksheets("TRAVAUX") 'définit l'onglet OT
For Each OS In Worksheets 'boucle sur tous les onglets du classeur
If OS.Name <> OT.Name Then OS.Delete 'si le nom de l'onglet n'est pas le nom de l'onglet OT, supprime l'onglet
Next OS 'prochain onglet de la boucle
TV = OT.Range("A1").CurrentRegion 'définit le tableau des valeur TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 3)) = "" 'alimente le dictionnaire D avec les données de la colonne 3 du tableau des valeurs TV
Next I 'prochaine ligne de la boucle
TS = D.keys 'récupère dans TS la liste des éléments du dictionnaire D sans doublon
For I = 0 To UBound(TS) 'boucle 1 sur tous les éléments du tableau TS
Worksheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet vierge en derniere position
ActiveSheet.Name = TS(I) 'renome l'onglet
Set OS = ActiveSheet 'définit l'onglet su salarié OS
OS.Columns(1).ColumnWidth = 65 'dimensionne la colonne 1 de l'onglet OS
OS.Columns(2).ColumnWidth = 34.86 'dimensionne la colonne 2 de l'onglet OS
OS.Range("A1").Value = "TRAVAUX À EFFECTUER " & UCase(TS(I)) 'texte en A1
OS.Range("B1").Value = "NOM DU CHANTIER/CLIENT" 'texte en B1
For J = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs TV (en partant de la seconde)
If TV(J, 3) = TS(I) Then 'condition : si la donnée ligne J colonne 3 de TV est égale au salarie TS(I)
Set DEST = OS.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (première ligne vide de la colonne A de l'onglet OS)
DEST.Value = TV(J, 2) 'renvoie la ligne de la tâche a effectuer dans DEST
DEST.Offset(0, 1).Value = OT.Range("A" & J).MergeArea.Cells(1) 'renvoie le nom du chantier/client dans la cellule adjacente en colonne B
End If 'fin de la condition
Next J 'prochaine ligne de la boucle 2
Next I 'prochain salarié du tableau des salariés TS
OT.Activate 'active l'onglet OT
Application.DisplayAlerts = True 'affiche les message Excel
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Les onglets des salariés sont d'abord supprimés puis recréés et remplis...