J'ai un tableur de noms d'utilisateur.
Les noms et prénoms sont dans la même cellule de la colonne A
.
Existe-t-il une formule permettant de concaténer les deux premières lettres du prénom (premier mot) et les deux premières lettres du nom de famille (deuxième mot)?
Par exemple, John Doe
devrait devenir JoDo
.
J'ai essayé
=LEFT(A1)&MID(A1,IFERROR(FIND(" ",A1),LEN(A1))+1,IFERROR(FIND(" ",SUBSTITUTE(A1," ","",1)),LEN(A1))-IFERROR(FIND(" ",A1),LEN(A1)))
mais cela me donne JoDoe
comme résultat.
Oui; en supposant que chaque personne a seulement un prénom et un nom, et que celui-ci est toujours séparé par un espace, vous pouvez utiliser ce qui suit:
=LEFT(A1,2)&MID(A1,SEARCH(" ",A1)+1,2)
Je ne pouvais fonder cette réponse que sur ces hypothèses, car c’est tout ce que vous avez fourni.
Ou si vous souhaitez qu'un espace soit encore inclus:
=LEFT(A1,2)&" "&MID(A1,SEARCH(" ",A1)+1,2)
Et pour finir, voici une solution qui renverra les deux premiers caractères du prénom et les deux premiers caractères du nom de famille, but , également pour les prénoms.
=LEFT(A1,2)&LEFT(MID(A1,FIND("~~~~~",SUBSTITUTE(A1," ","~~~~~",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1)),2)
Tout d’abord, je voudrais dire que la réponse de PeterH est la plus simple et la plus facile à comprendre. (Bien que ma préférence soit d'utiliser FIND()
au lieu de SEARCH()
- taper deux caractères de moins aide à éviter le RSI ;-))
Une autre réponse qui n'utilise ni MID()
, LEFT()
ni RIGHT()
, mais utilise plutôt REPLACE()
pour supprimer les parties non désirées du nom est la suivante:
=REPLACE(REPLACE(A1,FIND(" ",A1)+3,LEN(A1),""),3,FIND(" ",A1)-2,"")
Explication:
La REPLACE(A1, FIND(" ",A1)+3, LEN(A1), "")
intérieure supprime les caractères à partir du troisième caractère du nom de famille, tandis que la REPLACE(inner_replace, 3, FIND(" ",A1)-2, "")
extérieure supprime les caractères du troisième caractère du prénom jusqu'à et y compris l'espace.
Addendum 1:
La formule ci-dessus peut également être adaptée pour permettre l'utilisation d'un deuxième prénom:
=REPLACE(REPLACE(A1,IFERROR(FIND(" ",A1,FIND(" ",A1)+1),FIND(" ",A1))+3,LEN(A1),""),3,IFERROR(FIND(" ",A1,FIND(" ",A1)+1),FIND(" ",A1))-2,"")
en remplaçant FIND(" ",A1)
par IFERROR(FIND(" ",A1,FIND(" ",A1)+1), FIND(" ",A1))
.
FIND(" ", A1, FIND(" ",A1)+1)
trouve le deuxième espace (en lançant la recherche de l'espace après le premier espace) ou commet une erreur.IFERROR(find_second_space, FIND(" ",A1))
trouve le premier espace s'il n'y a pas de second espace.
Cette version (longue) permet de créer un nombre quelconque de prénoms:
=REPLACE(REPLACE(A1,FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+3,LEN(A1),""),3,FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))-2,"")
Dans ce cas, FIND(" ",A1)
est remplacé par FIND("§", SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))
.
LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
compte le nombre d'espaces.SUBSTITUTE(A1, " ", "§", count_of_spaces)
remplace le dernier espace par §
.FIND("§", last_space_replaced_string)
trouve le premier §
, ce qui revient au même que la recherche du dernier espace.
(Le §
peut, bien sûr, être remplacé par tout caractère dont la chaîne du nom complet n’est pas garantie. Une alternative plus générale, plus sûre, consisterait à utiliser CHAR(1)
.)
Notez que, bien sûr, la réponse de BruceWayne est la solution la plus simple et la plus facile à comprendre qui permet un nombre quelconque de noms intermédiaires. Eh bien c'était. Jusqu'à ce que je poste mon autre réponse , c'est ;-)
Addendum 2:
Toutes les solutions peuvent être adaptées pour le cas d'un seul nom (si un résultat à quatre caractères est requis) en les encapsulant dans une fonction IFERROR()
de la manière suivante:
=IFERROR(solution, alternate_formula)
Notez que ce qui précède est une formule de cas général et qu’il serait peut-être possible d’apporter une modification plus efficace à une solution spécifique. Par exemple, si l'exigence d'un nom unique est de joindre les deux premières lettres aux deux dernières lettres, La réponse de PeterH peut être adaptée plus efficacement de cette manière:
=LEFT(A1,2)&MID(A1,IFERROR(SEARCH(" ",A1)+1,LEN(A1)-1),2)
Pour tenir compte du cas d’une lettre unique ou d’un premier prénom (en supposant que l’espace ou le point ne soit pas acceptable comme deuxième caractère), les solutions suivantes peuvent être utilisées avec n’importe quelle solution:
=SUBSTITUTE(SUBSTITUTE(solution, " ", single_char), ".", single_char))
Notez que le caractère unique peut être codé en dur ou calculé à partir du nom. (Ou utilisez ""
pour supprimer l'espace ou le point.)
Enfin, si vousvraimentdevez prendre en compte le cas où le nom complet est composé d'un seul caractère (!), Enroulez simplement la formule avec un seul nom avec autreIFERROR()
. (En supposant, bien sûr, que la formule alternative ne traite pas de ce cas particulier.)
Addendum 3:
Enfin, enfin (non, vraiment* ;-)) pour gérer plusieurs espaces consécutifs et/ou avant/fin, utilisez TRIM(A1)
au lieu de A1
.
* Je laisserai le cas pour une seule lettre nom de famille, comme M. T., comme exercice pour le lecteur.
Indice:
=solution &IF(MID(A1,LEN(A1)-1,1)=" ", single_char, "")
Sur la base de cette réponse , voici une solution élégante qui fonctionne avec n’importe quel nombre de prénoms:
=LEFT(A1,2)&LEFT(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))),LEN(A1))),2)
Explication:
SUBSTITUTE(A1, " ", REPT(" ",LEN(A1)))
remplace les espaces entre mots par des espaces dont le nombre est égal à la longueur de la chaîne entière. L'utilisation de la longueur de la chaîne plutôt que d'un nombre arbitrairement grand garantit que la formule fonctionne pour toute chaîne de longueur et signifie qu'elle le fait efficacement.
RIGHT(space_expanded_string, LEN(A1))
extrait le mot le plus à droite, suivi de plusieurs espaces.*
TRIM(space_prepended_rightmost_Word)
extrait le mot le plus à droite.
LEFT(rightmost_Word, 2)
extrait les deux premiers caractères du mot le plus à droite (nom de famille).
* Avertissement: s'il est possible qu'un nom d'utilisateur contienne des espaces, il faut remplacer le premier argument de SUBSTITUTE()
, c'est-à-dire A1
, par TRIM(A1)
. Les espaces de début et les espaces consécutifs multiples entre les mots sont gérés correctement avec A1
.
En examinant de plus près votre solution tentée, il semble que vous soyez sur le point de concilier les deux premières lettres du premier mot (c'est-à-dire le prénom) et les deux premières lettres dudeuxièmeWord s'il existait.
Notez que si un nom d'utilisateur devait contenir des prénoms, la formule corrigée prendrait à tort les deux premières lettres du premier prénom au lieu du nom de famille (en supposant que votre intention est bien de les extraire du nom de famille).
De plus, si tous les noms d’utilisateur se composent uniquement d’un prénom, d’un prénom et d’un nom de famille, la formule est inutilement compliquée et peut être simplifiée.
Pour voir comment la formule fonctionne et la corriger, il est plus facile si elle est simplifiée, comme ceci:
=
LEFT(A1,2) &
MID(
A1,
IFERROR(FIND(" ",A1), LEN(A1)) + 1,
IFERROR(
FIND(" ", SUBSTITUTE(A1," ","",1)),
LEN(A1)
)
- IFERROR(FIND(" ",A1), LEN(A1))
)
Pour comprendre son fonctionnement, voyons d’abord ce qui se passe lorsque A1
ne contient aucun espace (c’est-à-dire qu’il ne contient qu’un seul nom). Toutes les fonctions IFERROR()
évaluent leurs deuxièmes arguments puisque FIND()
renvoie une erreur #VALUE!
si la chaîne de recherche est introuvable dans la chaîne cible:
=
LEFT(A1,2) &
MID(
A1,
LEN(A1) + 1,
LEN(A1)
-LEN(A1)
)
Le troisième argument de MID()
est évalué à zéro. La fonction génère donc ""
et le résultat de la formule correspond aux deux premiers caractères du nom unique.
Voyons maintenant s’il ya exactement deux noms (c’est-à-dire qu’il ya exactement un espace). Les première et troisième fonctions IFERROR()
évaluent leurs premiers arguments, mais le second évalue son second argument, car FIND(" ", SUBSTITUTE(A1," ","",1))
tente de trouver un autre espace après avoir supprimé le premier et le seul:
=
LEFT(A1,2) &
MID(
A1,
FIND(" ",A1) + 1,
LEN(A1)
- FIND(" ",A1)
)
Clairement, MID()
renvoie le deuxième mot (c'est-à-dire le nom de famille) dans son intégralité, et le résultat de la formule correspond aux deux premiers caractères du prénom, suivis de tout les caractères du nom de famille.
Par souci d’exhaustivité, nous examinerons également le cas où il ya au moins trois noms, bien que la façon de corriger la formule soit assez évidente. Cette fois, toutes les fonctions IFERROR()
évaluent leurs premiers arguments:
=
LEFT(A1,2) &
MID(
A1,
FIND(" ",A1) + 1,
FIND(" ", SUBSTITUTE(A1," ","",1))
- FIND(" ",A1)
)
C’est un peu moins clair que dans le cas précédent, mais MID()
renvoie exactement la totalité de la seconde Word (c’est-à-dire le premier prénom). Ainsi, le résultat de la formule correspond aux deux premiers caractères du prénom, suivis de tous les caractères du premier prénom.
Évidemment, le correctif consiste à utiliser LEFT()
pour obtenir les deux premiers caractères de la sortie de MID()
:
=
LEFT(A1,2) &
LEFT(
MID(
A1,
IFERROR(FIND(" ",A1), LEN(A1)) + 1,
IFERROR(
FIND(" ", SUBSTITUTE(A1," ","",1)),
LEN(A1)
)
- IFERROR(FIND(" ",A1), LEN(A1))
),
2
)
La simplification que j'ai mentionnée ci-dessus consiste à remplacer LEFT(MID(…,…,…), 2)
par MID(…,…,2)
:
=
LEFT(A1,2) &
MID(
A1,
IFERROR(FIND(" ",A1), LEN(A1)) + 1,
2
)
ou sur une ligne:
=LEFT(A1,2)&MID(A1,IFERROR(FIND(" ",A1),LEN(A1))+1,2)
Ceci est essentiellement la solution de PeterH modifiée pour fonctionner également avec des noms uniques (dans ce cas, le résultat correspond uniquement aux deux premiers caractères du nom).
Remarque: Les formules préparées fonctionnent si elles sont entrées.