Sub Tri_s()
Dim aA, c, cVide, sh, t
Application.ScreenUpdating = False
For Each sh In ThisWorkbook.Worksheets
With sh
Set c = .Range(.Range("B4"), .Range("B4").End(xlDown)) 'la plage commence à B4, jusqu'à la derniere cellule non-vide
i = c.Rows.Count + c.Row 'numéro de la ligne vide en dessous cette plage
If i < 29 Or 30 < i Then 'première cellule "vide", c'est B29 ou B30, dépendant du mois !!!)
MsgBox "Ligne vide n'est pas 29 ou 30, mais " & i & vbLf & "cette feuille n'est pas triée", vbExclamation, "Feuile : " & sh.Name
Else
aA = c.Value 'matrice
ReDim Preserve aA(1 To UBound(aA), 1 To 2) 'agrandir à 4 colonnes
For i = 1 To UBound(aA)
s = Trim(Replace(aA(i, 1), ".", " ")) 'split on espaces et points
If Len(aA(i, 1)) >= 2 Then 'cellule n'est pas vide
aA(i, 2) = Join(Array(Right(s, 1), Left(s, 1))) 'premier et dernier charactère
Else
MsgBox "problème avec ligne " & i + 3, , sh.Name
End If
Next
With .Range("B4:AM4").Resize(UBound(aA)) 'maintenant trier plage initial & plage auxiliaire
.MergeCells = False 'no cellules fusionnées !!!
.Offset(, .Columns.Count - 1).Resize(, 1).Value = Application.Index(aA, 0, 2) 'la colonne avec les initials inversés
.Sort .Cells(1, .Columns.Count), xlAscending, Header:=xlNo 'trier avec cette dernière colonne
.Offset(, .Columns.Count - 1).Resize(, 1).ClearContents 'RAZ la colonne avec les initials inversés
End With
End If
End With
Next
MsgBox "prêt"
End Sub