Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim NC As Byte 'déclare la variable NC (Nombre de Colonne)
Dim NL As Integer 'déclare la variable NL (Nombre de Ligne)
Dim J As Byte 'déclare la variable J (incrément)
Dim I As Integer 'déclare la variable I (Incrément)
Dim T As Integer 'déclare la variable T (Total)
Set O = Worksheets("Feuil1") 'définit l'onglet O
Set PL = O.Range("A1").CurrentRegion 'définit la plage PL
Set PL = PL.Offset(2, 0) 'redéfinit la plage PL (sans les deux premières lignes)
PL.Interior.ColorIndex = xlNone 'supprime les éventuelles couleurs dans la plage PL
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NC = UBound(TV, 2) 'definit le nombre de colonnes NC du tableau des valeurs TV
NL = UBound(TV, 1) 'definit le nombre de lignes NL du tableau des valeurs TV
For J = 1 To NC 'boucle 1 : sur toutes les colonnes J du tableau des valeurs TV
For I = 3 To NL 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV
For K = 1 To Len(TV(I, J)) 'boucle 3 : sur le nombre de caractères K du mot ligne I colonne J de TV
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
'agit en fonction du code ASC du caractère de la boucle 3 (certains caractères génèrent une erreur car ils n'ont pas de code ASC)
Select Case Asc(Mid(TV(I, J), K, 1))
Case 32, 48 To 57, 65 To 90, 97 To 122 'cas correspondant à l'alphabet (majuscules et minuscule et aux numéros de 0 à 9)
'rien ne se passe
Case Else 'tous les autres cas
O.Cells(I, J).Interior.ColorIndex = 3 'colore la cellule de rouge
T = T + 1 'incrémente le total T
Exit For 'sort de la boucle 3
End Select 'fin de l'action en fonction du code ASC du caractère de la boucle 3
If Err <> 0 Then 'condition : si une erreur a été générée
O.Cells(I, J).Interior.ColorIndex = 3 'colore la cellule de rouge
T = T + 1 'incrémente le total T
Exit For 'sort de la boucle 3
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Next K 'prochain caractère de la boucle 3
Next I 'prochaine ligne de la boucle 2
O.Cells(1, J).Value = T 'renvoie le total T dans la cellule ligne 1 colonne J
T = 0 'réinitialise T
Next J 'prochaine colonne de la boucle 1
End Sub