Private Sub Worksheet_Activate()
Dim col%, w As Worksheet, i&, P As Range, a$, j%, dates As Range, donnees As Range, n%
Application.ScreenUpdating = False
Rows("6:27").Delete 'RAZ
col = 2
For Each w In Worksheets
If IsDate("1 " & w.Name) Then
For i = 9 To 101 Step 23
'---tris des tableaux pour placer les noms en mêmes positions qu'en feuille "Noms"---
If i = 9 Then 'il y a des formules de liaisons en A35:A123 !!!
'---sécurité : recherche des doublons en colonne A du 1er tableau---
Set P = w.Cells(i + 3, 1).Resize(20): a = P.Address
P(1, 30).FormulaArray = "=SUM(IF(" & a & "<>0,1/COUNTIF(" & a & "," & a & ")))"
If P(1, 30) < Application.CountA(P) Then MsgBox "Doublon !!!": Application.Goto w.Cells(i, 1), True: Exit Sub
'---formules en colonnes AD et AE pour permettre le classement---
P.Columns(30).FormulaR1C1 = "=MATCH(RC1,Noms,0)"
a = P.Columns(30).Address(, , xlR1C1)
P(1, 31).FormulaArray = _
"=IF(ISNUMBER(RC30),RC30,MIN(IF(NOT(COUNTIF(" & a & ",ROW(R1:R20))+COUNTIF(R" & i + 2 & "C:R[-1]C,ROW(R1:R20))),ROW(R1:R20))))"
P(1, 31).AutoFill P.Columns(31) 'tire la formule matricielle vers le bas
P.Columns(30).Resize(, 2) = P.Columns(30).Resize(, 2).Value 'supprime les formules
'---tris---
For j = 1 To 4 'pour les 4 autres tableaux
P.Columns(30).Offset(23 * j).Resize(, 2) = P.Columns(30).Resize(, 2).Value 'colonnes AD:AE des 4 autres tableaux
P.Columns(2).Offset(23 * j).Resize(, 30).Sort P(1, 31), xlAscending, Header:=xlNo 'tri des colonnes B:AE sur AE
Next j
P.Resize(, 31).Sort P(1, 31), xlAscending, Header:=xlNo 'tri du 1er tableau sur la colonne AE
'---effacement des données entrées par erreur sur des lignes sans nom---
On Error Resume Next 'si aucune SpecialCells
Intersect(w.Columns(2).Resize(, 28), w.Columns(30).SpecialCells(xlCellTypeConstants, 16).EntireRow) = ""
On Error GoTo 0
w.Columns(30).Resize(, 2).ClearContents 'RAZ des colonnes auxiliaires AD et AE
End If
'---copie les dates et leurs données seulement s'il y a des données---
Set dates = Nothing: Set donnees = Nothing: n = 0
For j = 2 To 26 Step 4
If Application.CountA(w.Cells(i + 3, j).Resize(20, 4)) Then
Set dates = Union(w.Cells(i, j).Resize(, 4), IIf(n, dates, w.Cells(i, j).Resize(, 4)))
Set donnees = Union(w.Cells(i + 3, j).Resize(20, 4), IIf(n, donnees, w.Cells(i + 3, j).Resize(20, 4)))
n = n + 4
End If
Next j
If n Then
dates.Copy 'copie groupée des dates
Cells(6, col).PasteSpecial xlPasteValues 'collage spécial valeurs
Cells(6, col).PasteSpecial xlPasteFormats 'collage spécial formats
For j = 0 To n - 4 Step 4
Cells(6, col + j).UnMerge 'défusionne la cellule
Cells(6, col + j).Resize(, 4).HorizontalAlignment = xlCenterAcrossSelection 'centre sur 4 colonnes
Cells(27, col + j).Resize(, 4) = Cells(6, col + j) '4 fois la date pour le tri horizontal final
Next j
donnees.Copy Cells(7, col) 'copie groupée des données
col = col + n
End If
Next i
End If
Next w
If col > 2 Then Range(Cells(6, 2), Cells(27, col - 2)).Sort Rows(27), xlAscending, Orientation:=xlLeftToRight 'tri horizontal par date
[Noms].Resize(20).Copy [A7] 'copie la liste des noms (limitée à 20 noms)
i = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne
If i < 6 Then i = 6
Rows(i + 1 & ":27").Delete
Application.Goto [A1], True 'cadrage
End Sub