Sub NommerColonnes(Entêtes As Range)
'pour renvoyer dernière ligne:
'1 - Formule avec matricielle MAX(SI.....
Const BaseFormule As String = "=OFFSET([EMAIL="&!@,,,MAX(IF(&!@:#<>"""",ROW"]&!@,,,MAX(IF(&!@:#<>"""",ROW[/EMAIL](&!@:#))))"
'2 - Formule avec equiv pour données Chaine de caractère dans colonne
'Const BaseFormule As String = "=OFFSET([EMAIL="&!@,,,MATCH(""ùùùùùù"",&!@:#,1"]&!@,,,MATCH(""ùùùùùù"",&!@:#,1[/EMAIL]))"
'3 - Formule avec equiv pour données numériques dans colonnes
'Const BaseFormule As String = "=OFFSET([EMAIL="&!@,,,MATCH(9^9,&!@:#,1"]&!@,,,MATCH(9^9,&!@:#,1[/EMAIL]))"
'Elements qui seront remplacés dans la formule nommée:
' & = Nom de la feuille
' @ = Adresse de la première cellule à prendre en considération
' # = Adresse de la dernière cellule à prendre en considération
Dim c As Range, adr1 As String, adr2 As String
If Entêtes.Rows.Count > 1 Or Entêtes.Areas.Count > 1 Then
MsgBox "Le paramètre 'Entêtes' doit correspondre à une seule ligne de cellules contigues", vbExclamation, "Nommer colonnes"
Exit Sub
End If
For Each c In Entêtes
If Not IsEmpty(c) Then
With c.Parent
adr1 = c(2).Address
adr2 = .Cells(Rows.Count, c.Column).Address
Application.Names.Add Replace(c, " ", "_"), Replace(Replace(Replace(BaseFormule, "#", adr2), "@", adr1), "&", .Name)
End With
End If
Next
End Sub