Combinaison des deux premières lettres du prénom et des deux premières lettres du nom de famille

9

J'ai une feuille de calcul des noms d'utilisateur.

Le prénom et le nom se trouvent dans la même cellule de colonne A.

Existe-t-il une formule qui concatène 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 JoDoecomme résultat.

prweq
la source
2
Lecture essentielle: Les programmeurs des faussetés croient aux noms
StackOverthrow
L'une des réponses fait-elle l'affaire? (Si tel est le cas, pouvez-vous le signaler comme réponse en cliquant sur la coche à gauche du message.)
BruceWayne

Réponses:

15

Oui; en supposant que chaque personne n'a qu'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 baser 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 toujours inclus:

=LEFT(A1,2)&" "&MID(A1,SEARCH(" ",A1)+1,2)
PeterH
la source
2
@prweq no probs, acceptez-le comme correct si cela fonctionne pour vous
PeterH
Solution la plus simple et la plus facile à comprendre. (Eh bien, sauf pour utiliser à la FIND()place de SEARCH();-)) Puisque vous supposez qu'il y a toujours un séparateur d'espace, votre deuxième formule peut être simplifiée pour=LEFT(A1,2)&MID(A1,SEARCH(" ",A1),3)
robinCTS
4
@RajeshS je sais. C'est pourquoi ma réponse commence parassuming each person only has a First and Last name
PeterH
2
Les programmeurs de mensonges croient aux noms ; pas qu'il serait judicieux de gérer tous ces cas dès le départ si votre logiciel n'a pas une portée internationale
Aaron
1
Je suggère TRIM(LEFT(A1,2))juste au cas où leur prénom n'a qu'une seule lettre, mais il peut être assez facile de vérifier manuellement ces cas spéciaux.
Engineer Toast
11

Et pour compléter les choses, voici une solution qui renverra les deux premiers caractères du prénom et les deux premiers caractères du nom de famille, mais tient également compte des prénoms.

=LEFT(A1,2)&LEFT(MID(A1,FIND("~~~~~",SUBSTITUTE(A1," ","~~~~~",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1)),2)

entrez la description de l'image ici

Merci à @Kyle pour l'essentiel de la formule

Bruce Wayne
la source
1
Vous m'avez battu ;-) (Il était minuit et j'ai besoin de dormir - je prévoyais d'ajouter cela à ma réponse par la suite.) Une légère amélioration de votre formule serait d'utiliser un seul ~au lieu de quatre. Si vous craignez qu'un Tilda puisse être utilisé dans le cadre d'un nom (!) Ou, plus probablement, accidentellement tapé, utilisez simplement un caractère qui n'apparaît sur aucun clavier. Je préfère utiliser §. est un autre bon.
robinCTS
@BruceWayne ,, votre Formule est plus compétente ,,, car elle accède uniquement à Firts & Last name ignore le deuxième prénom ,,, Up voté ☺
Rajesh S
@RajeshS Qu'en est-il des personnes avec des noms espagnols , comme l'ancien pilote de F1 Fernando Alonso Díaz qui a 1 prénom, 2 noms de famille et aucun deuxième prénom? (Ou même le roi Felipe Juan Pablo Alfonso de Todos los Santos de Borbón y de Grecia ?)
Chronocidal
2
@Chronocidal maintenant nous descendons le trou du lapin de ce que les programmeurs pensent des noms
BruceWayne
1
@robinCTS - Bon appel! J'ai obtenu la formule d'une autre réponse (éditée dans), et je n'ai pas vraiment creusé trop profondément. Merci pour les conseils!
BruceWayne
9

C'est une autre façon ...

Capture d'écran de la feuille de calcul

  • Un nom
  • B - =CONCATENATE(LEFT(A1,2),LEFT(RIGHT(A1,(LEN(A1)-FIND(" ",A1))),2))
Stese
la source
Vous pouvez aller encore plus loin et supprimer toutes ces colonnes supplémentaires en les fusionnant=CONCATENATE(LEFT(A1,2),LEFT(RIGHT(A1,(LEN(A1)-FIND(" ",A1))),2))
PeterH
Ouais, je l'ai fait quelques instants après!
Stese
ouais j'ai remarqué que vous avez modifié la réponse, Nice Answer!
PeterH
5

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 RSI ;-))

Une autre réponse que ni utilise MID(), LEFT()ni RIGHT(), mais utilise REPLACE()à la place pour supprimer les parties indésirables du nom est la suivante:

=REPLACE(REPLACE(A1,FIND(" ",A1)+3,LEN(A1),""),3,FIND(" ",A1)-2,"")

Explication:

L'intérieur REPLACE(A1, FIND(" ",A1)+3, LEN(A1), "")supprime les caractères du troisième caractère du nom de famille, tandis que l'extérieur supprime les caractères du troisième caractère du prénom jusqu'à et y compris l'espace.REPLACE(inner_replace, 3, FIND(" ",A1)-2, "")


Addendum 1:

La formule ci-dessus peut également être adaptée pour permettre un seul 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 démarrant la recherche de l'espace après le premier espace) ou des erreurs dans le cas contraire. trouve le premier espace s'il n'y a pas de deuxième espace.
IFERROR(find_second_space, FIND(" ",A1))


Cette version (de longue haleine) permet un nombre illimité 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. remplace le dernier espace par . trouve le premier qui équivaut à trouver le dernier espace.
SUBSTITUTE(A1, " ", "§", count_of_spaces)§
FIND("§", last_space_replaced_string)§

(Le §pourrait, bien sûr, être remplacé par n'importe quel caractère garanti de ne pas exister dans la chaîne du nom complet. Une alternative plus générale et plus sûre serait d'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 illimité de prénoms. Et bien ça l'était. Jusqu'à ce que je poste mon autre réponse , c'est ;-)


Addendum 2:

Toutes les solutions peuvent être adaptées pour répondre au cas d'un seul nom (s'il y a une exigence pour un résultat à quatre caractères) en les enveloppant dans une IFERROR()fonction comme ceci:

=IFERROR(solution, alternate_formula)

Notez que ce qui précède est une formule de cas générale, et il pourrait être possible d'apporter une modification plus efficace à une solution spécifique. Par exemple, si l'exigence dans le cas d'un nom unique est de joindre les deux premières lettres avec les deux dernières lettres, la réponse de PeterH peut être plus efficacement adaptée de cette manière:

=LEFT(A1,2)&MID(A1,IFERROR(SEARCH(" ",A1)+1,LEN(A1)-1),2)


Pour permettre la casse d'un prénom d'une seule lettre ou d'une initiale (en supposant qu'un espace ou un point n'est pas acceptable comme deuxième caractère), ce qui suit peut être utilisé 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 vous avez vraiment besoin de prendre en charge le cas où le nom complet est un seul caractère (!), Enveloppez simplement la formule à nom unique avec une autre IFERROR() . (En supposant, bien sûr, que la formule alternative ne s'occupe pas de ce cas spécial.)


Addendum 3:

Enfin, enfin (non, vraiment * ;-)) pour répondre à plusieurs espaces consécutifs et / ou en tête / en fin, utilisez TRIM(A1)plutôt A1.


* Je vais laisser le cas pour une seule lettre nom de famille, comme MT, comme un exercice pour le lecteur.

Allusion: =solution &IF(MID(A1,LEN(A1)-1,1)=" ", single_char, "")

robinCTS
la source
1
Comme toujours, vos réponses semblent provenir d'un guide d'utilisation avancé d'Excel! Ce serait la réponse la plus votée si vous l'aviez publiée plus tôt!
PeterH
@PeterH Merci pour le complément. Je ne suis tombé sur la question qu'une fois qu'elle a atteint la liste des questions de Hot Network, donc j'étais un peu en retard à la fête ;-)
robinCTS
2

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 le ou les espaces entre les mots par des espaces dont le nombre est égal à la longueur de la chaîne entière. L'utilisation de la longueur de chaîne plutôt que d'un nombre arbitrairement élevé garantit que la formule fonctionne pour n'importe quelle chaîne de longueur et signifie qu'elle le fait efficacement.

RIGHT(space_expanded_string, LEN(A1))extrait le mot le plus à droite précédé d'un tas d'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 de fin, vous devez remplacer le premier argument de SUBSTITUTE(), c'est A1-à- dire par TRIM(A1). Les espaces de tête et plusieurs espaces consécutifs entre les mots sont traités correctement avec A1.


Réparer votre tentative

En examinant de plus près votre tentative de solution, il semble que vous étiez très proche d'une formule de travail pour concaténer les deux premières lettres du premier mot (c'est-à-dire le prénom) et les deux premières lettres du deuxième mot s'il existait.

Notez que si un nom d'utilisateur devait contenir des prénoms, la formule corrigée prendrait incorrectement les deux premières lettres du premier prénom au lieu du nom de famille (en supposant que votre intention est en effet de les extraire du nom de famille).

De plus, si tous les noms d'utilisateur ne sont constitués que d'un prénom ou d'un prénom et d'un nom, la formule est inutilement compliquée et peut être simplifiée.


Pour voir comment fonctionne la formule et ainsi la corriger, il est plus facile si elle est raffiné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 comment cela fonctionne, regardez d'abord ce qui se passe quand A1ne contient aucun espace (c'est-à-dire qu'il ne contient qu'un seul nom). Toutes les IFERROR()fonctions évaluent leur deuxième argument car FIND()retourne une #VALUE!erreur si la chaîne de recherche n'est pas trouvée dans la chaîne cible:

=
LEFT(A1,2) &
MID(
  A1,
  LEN(A1) + 1,
  LEN(A1)
  -LEN(A1)
)

Le troisième argument de est MID()évalué à zéro, la sortie de la fonction ""et le résultat de la formule sont donc les deux premiers caractères du nom unique.


Regardez maintenant quand il y a exactement deux noms (c'est-à-dire qu'il y a exactement un espace). Les première et troisième IFERROR()fonctions évaluent leurs premiers arguments mais la seconde évalue leur deuxième argument car FIND(" ", SUBSTITUTE(A1," ","",1))tente de trouver un autre espace après avoir supprimé le premier, et seulement un:

=
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 est les deux premiers caractères du prénom suivi de tous les caractères du nom de famille.


Par souci d'exhaustivité, nous examinerons également le cas où il y a au moins trois noms, bien qu'il devrait être assez évident maintenant de corriger la formule. Cette fois, toutes les IFERROR()fonctions évaluent leurs premiers arguments:

=
LEFT(A1,2) &
MID(
  A1,
  FIND(" ",A1) + 1,
  FIND(" ", SUBSTITUTE(A1," ","",1))
  - FIND(" ",A1)
)

Il est légèrement moins clair qu'il ne l'était dans le cas précédent, mais MID()renvoie exactement le deuxième mot entier (c'est-à-dire le premier prénom). Ainsi, le résultat de la formule est les deux premiers caractères du prénom suivi de tous les caractères du premier deuxième prénom.


De toute évidence, le correctif est d'utiliser LEFT()pour obtenir les deux premiers caractères de la MID()sortie:

=
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 est à remplacer LEFT(MID(…,…,…), 2)par MID(…,…,2):

=
LEFT(A1,2) &
MID(
  A1,
  IFERROR(FIND(" ",A1), LEN(A1)) + 1,
  2
)

ou sur une seule ligne:

=LEFT(A1,2)&MID(A1,IFERROR(FIND(" ",A1),LEN(A1))+1,2)

Il s'agit essentiellement de la solution de PeterH modifiée pour fonctionner également avec des noms uniques (auquel cas, le résultat n'est que les deux premiers caractères du nom).


Remarque: Les formules prettifiées fonctionnent réellement si elles sont entrées.

robinCTS
la source