Manik a une feuille de calcul qui, dans la colonne A, a des valeurs de texte au format « mikeDAVIS », où le prénom de la personne est en minuscules et le nom de famille est en majuscules. Il aimerait diviser les noms en deux colonnes distinctes, selon le cas du texte.

Cela peut être accompli en utilisant une formule pour une macro. Quelle que soit l’approche que vous utilisez, la clé est de déterminer où le texte passe des minuscules aux majuscules. Cela ne peut être fait qu’en examinant chaque caractère de la chaîne. Donc, si vous souhaitez utiliser une approche formule, vous devrez utiliser une formule matricielle. La formule matricielle suivante renvoie le nom de tout ce qui se trouve dans la cellule A1:

=MID(A1,MATCH(1,(CODE(MID(A1,ROW($1:$255),1))>=65)

* (CODE(MID(A1,ROW($2:$255),1))<90),)+1,255)

N’oubliez pas, puisqu’il s’agit d’une formule matricielle, vous devez l’entrer en appuyant sur Ctrl + Maj + Entrée. Il renvoie tout ce qui se trouve dans la cellule en commençant par la première lettre majuscule trouvée. Ainsi, dans « mikeDAVIS », il renverrait « DAVIS » et dans « mikeDavis », il renverrait « Davis ». En supposant que vous utilisez la formule matricielle dans la cellule B1, vous pouvez ensuite déterminer le prénom en utilisant ce qui suit:

=SUBSTITUTE(A1,B1,"")

Il s’agit d’une formule régulière, pas d’une formule matricielle.

Il existe de nombreuses formules matricielles similaires qui peuvent accomplir à peu près la même tâche. Par exemple, cette formule matricielle renverra le prénom (tous les caractères jusqu’au premier caractère majuscule) de tout ce qui se trouve dans la cellule A1:

=LEFT(A1,MAX((CODE(MID(A$1,ROW(INDIRECT("1:"& LEN(A1))),1))>96)*ROW(INDIRECT("1:"&LEN(A1)))))

Vous pouvez ensuite utiliser la même formule régulière (celle qui utilise la fonction SUBSTITUTE) pour dériver le nom de famille.

Si vous souhaitez utiliser une approche macro pour trouver les noms, tout ce que vous avez à faire est de trouver une formule qui renverra l’emplacement de la première lettre majuscule dans le texte. Le code suivant renvoie ce « point de changement » dans le texte:

Function GetFirstUpper(MyCell As Range) As Integer     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetFirstUpper = 99     Else         GetFirstUpper = i     End If End Function

Pour utiliser la fonction, supposons que le nom soit dans la cellule A1. Vous pouvez trouver le prénom et le nom en utilisant ces formules dans votre feuille de calcul:

=LEFT(A1,GetFirstUpper(A1)-1)

=MID(A1,GetFirstUpper(A1),LEN(TRIM(A1))-GetFirstUpper(A1)+1)

Si vous préférez que votre macro renvoie les noms réels, vous pouvez utiliser le suivant pour tout renvoyer avant la première lettre majuscule:

Function GetFirstName(MyCell As Range) As String     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetFirstName = sCellValue     Else         GetFirstName = Left(sCellValue, i - 1)

End If End Function

Pour utiliser la macro, tout ce que vous avez à faire est d’utiliser ce qui suit dans une cellule de feuille de calcul. (Cela suppose que la chaîne de texte à évaluer se trouve dans la cellule A1.)

=GetFirstName(A1)

Une variation mineure de la macro vous permettra de récupérer de la même manière le nom de famille, qui est supposé être tout en commençant par la première lettre majuscule rencontrée.

Function GetLastName(MyCell As Range) As String     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetLastName = sCellValue     Else         GetLastName = Mid(sCellValue, i)

End If End Function

Si vous préférez, vous pouvez combiner les macros en une seule fonction qui, en fonction de ce que vous spécifiez, renvoie le prénom ou le nom:

Function GetName(MyCell As Range, sWanted As String) As String     Dim sCellValue As String     Dim i As Integer

Application.Volatile     sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetName = sCellValue     Else         If LCase(sWanted) = "first" Then             GetName = Left(sCellValue, i - 1)

Else             GetName = Mid(sCellValue, i)

End If     End If End Function

Pour utiliser cette fonction combinée, il vous suffit de spécifier le nom que vous voulez:

=GetName(A1, "First")

Le mot « First » passé en paramètre de cette manière renvoie le prénom (tout avant la première lettre majuscule). Toute autre chaîne passée comme deuxième paramètre (comme « Last » ou « xxx » ou « Rest » ou même «  ») entraîne le renvoi du nom de famille.

_Note: _

Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.

lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur].

ExcelTips est votre source pour une formation Microsoft Excel rentable.

Cette astuce (9089) s’applique à Microsoft Excel 97, 2000, 2002 et 2003. Vous pouvez trouver une version de cette astuce pour l’interface ruban d’Excel (Excel 2007 et versions ultérieures) ici:

lien: / excelribbon-Splitting_Cells_by_Case [Division des cellules par cas].