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