web-dev-qa-db-ja.com

姓からの最初の2文字と姓からの最初の2文字の組み合わせ

ユーザー名のスプレッドシートがあります。

姓と名は、列Aの同じセルにあります。

姓の最初の2文字(最初のWord)と姓の最初の2文字(2番目のWord)を連結する式はありますか?

例えばJohn DoeJoDoになります。

私は試した

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

しかし、これは結果として私にJoDoeを与えます。

9
prweq

はい;それぞれの人が姓と名のみを持ち、これが常にスペースで区切られていると仮定すると、以下を使用できます。

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

あなたが提供したのはそれだけなので、私はこれらの仮定に基づいてこの答えを立てることしかできませんでした。

それともスペースを含めたい場合は、次のようにします。

=LEFT(A1,2)&" "&MID(A1,SEARCH(" ",A1)+1,2)
15
PeterH

さらに詳しく説明すると、これは姓の最初の2文字と姓の最初の2文字を返すソリューションですが、もミドルネームを表します。

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

enter image description here

式の主要部分を提供してくれた @ Kyleに感謝します

11
BruceWayne

これは別の方法です...

Screenshot of worksheet

  • 名前
  • B - =CONCATENATE(LEFT(A1,2),LEFT(RIGHT(A1,(LEN(A1)-FIND(" ",A1))),2))
9
Stese

まず最初に、 PeterHの答え が最も簡単で理解しやすいと言いたいです。 (私の好みはFIND()の代わりにSEARCH()を使うことです - 2つ少ない文字をタイプすることはRSIを避けるのを助けます;-))

MID()LEFT()RIGHT()のいずれも使用せず、代わりに名前の不要な部分を削除するためにREPLACE()を使用するという代替の回答は、次のとおりです。

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

説明:

内側のREPLACE(A1, FIND(" ",A1)+3, LEN(A1), "")は姓の3番目の文字以降の文字を削除し、外側のREPLACE(inner_replace, 3, FIND(" ",A1)-2, "")は最初の名前の3番目の文字からスペースまでの文字を削除します。


補遺1:

上記の式は、単一のミドルネームを許可するように調整することもできます。

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

FIND(" ",A1)IFERROR(FIND(" ",A1,FIND(" ",A1)+1), FIND(" ",A1))に置き換えることによって。

FIND(" ", A1, FIND(" ",A1)+1)は、(最初​​のスペースの後のスペースの検索を開始することによって)2番目のスペースを見つけるか、そうでなければエラーになります。
IFERROR(find_second_space, FIND(" ",A1))は、2番目のスペースがなければ最初のスペースを見つけます。


この(長い)バージョンでは、ミドルネームをいくつでも使用できます。

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

この場合、FIND(" ",A1)FIND("§", SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))に置き換えられます。

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))はスペースの数を数えます。
SUBSTITUTE(A1, " ", "§", count_of_spaces)は最後のスペースを§に置き換えます。
FIND("§", last_space_replaced_string)は最初の§を見つけます。これは最後のスペースを見つけるのと同じです。

§は、もちろん、フルネーム文字列に存在しないことが保証されている任意の文字に置き換えることができます。より一般的で安全な代替方法は、CHAR(1)を使用することです。)


もちろん、 BruceWayneの回答 は、ミドルネームをいくつでも使用できる最も簡単で理解しやすいソリューションです。 まあそれはそうでした。 other answer を投稿するまで、つまり;-)


補遺2:

以下のようにIFERROR()関数内にラップすることで、すべての解決策を単一の名前のみの場合(4文字の結果が必要な場合)に対応するように適応させることができます。

=IFERROR(solution, alternate_formula)

上記は一般的なケース式であり、特定のソリューションに対してより効率的な変更を加えることが可能な場合があることに注意してください。例えば、単一の名前の場合の要件が最初の2文字と最後の2文字を結合することであるならば、 PeterH's answer はこのようにもっと効率的に適応させることができます。 :

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


一文字のファーストネームまたはイニシャルの場合を考慮に入れるために(スペースまたはドットが2番目の文字として受け入れられないと仮定して)、以下のものが任意の解決策と共に使用され得る。

=SUBSTITUTE(SUBSTITUTE(solution, " ", single_char), ".", single_char))

単一の文字は、ハードコードされているか、または名前から計算されることに注意してください。 (またはスペースまたはドットを削除するには""を使用してください。)


最後に、あなたが本当にフルネームが1文字だけの場合に対応する必要があるなら(!)単一の名前のみの式を別のIFERROR()でラップするだけです。 (もちろん、代替式はその特別なケースを処理しないと仮定します。)


補遺3:

最後に、最後に(いいえ、本当に* ;-))複数の連続したスペースや前後のスペースに対応するには、A1の代わりにTRIM(A1)を使用してください。


*私は、T氏のように、読者のための演習として、一文字の姓の場合を残します。

ヒント:=solution &IF(MID(A1,LEN(A1)-1,1)=" ", single_char, "")

5
robinCTS

この答え に基づいて、これはミドルネームをいくつでも使えるエレガントな解決策です:

=LEFT(A1,2)&LEFT(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))),LEN(A1))),2)

説明:

SUBSTITUTE(A1, " ", REPT(" ",LEN(A1)))は、Word間のスペースを、文字列全体の長さに等しい数のスペースで置き換えます。任意の大きな数値ではなく文字列の長さを使用すると、式が任意の長さの文字列に対して機能することが保証され、効率的に機能することがわかります。

RIGHT(space_expanded_string, LEN(A1))は、たくさんのスペースで始まる一番右のWordを抽出します。*

TRIM(space_prepended_rightmost_Word)は右端のWordを抽出します。

LEFT(rightmost_Word, 2)は、右端のWord(姓)の最初の2文字を抽出します。


*注意:ユーザ名の末尾にスペースが含まれる可能性がある場合は、SUBSTITUTE()の最初の引数、すなわちA1TRIM(A1)に置き換える必要があります。単語間の先頭のスペースと複数の連続したスペースは、A1を使用して正しく処理されます。


あなたの試みを直す

試みられた解決策を詳しく見ると、最初のWordの最初の2文字(つまり最初の名前)との最初の2文字を連結するための実用的な数式に非常に近いように見えます。 2番目存在する場合は単語。

ユーザー名にミドルネームが含まれている場合、修正された式は姓からではなく最初のミドルネームから最初の2文字を誤って取得することになります(あなたの意図が実際にラストネームから抽出することを前提とします)。

また、すべてのユーザー名がファーストネーム、またはファーストネームとラストネームのいずれかのみで構成されている場合は、式は不必要に複雑で単純化できます。


数式がどのように機能するかを確認して修正するには、次のように、数式が適切であればより簡単です。

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


これがどのように機能するのかを理解するために、最初にA1にスペースが含まれていない場合(つまり、名前が1つしか含まれていない場合)に何が起こるかを見てください。検索文字列がターゲット文字列に見つからない場合、IFERROR()#VALUE!エラーを返すので、すべてのFIND()関数は第2引数に評価されます。

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

MID()の3番目の引数はゼロと評価されるため、関数は""を出力し、式の結果は単一の名前の最初の2文字になります。


2つの名前があるとき(つまり、1つのスペースがあるとき)を見てください。 1番目と3番目のIFERROR()関数は最初の引数に評価されますが、FIND(" ", SUBSTITUTE(A1," ","",1))は最初の引数を削除した後に別のスペースを検索しようとしているため、2番目の引数は2番目の引数に評価されます。

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

明らかに、MID()は2番目のWord(つまり姓)をそのまま返し、式の結果は姓の最初の2文字とそれに続くallの姓の文字になります。


完全を期すために、少なくとも3つの名前がある場合も検討しますが、式を修正する方法は今ではかなり明白になるはずです。今回は、すべてのIFERROR()関数が最初の引数に評価されます。

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

前の場合よりもやや不明瞭ですが、MID()は正確に全体の2番目のWord(つまり、最初のミドルネーム)を返します。したがって、式の結果は、名の最初の2文字とそれに続く最初のミドルネームのすべての文字です。


明らかに、修正はLEFT()出力の最初の2文字を得るために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
)


上で述べた単純化はLEFT(MID(…,…,…), 2)MID(…,…,2)に置き換えることです。

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

または一行で:

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

これは基本的に PeterHの解決方法 が単一の名前でも動作するように修正されています(この場合、結果は名前の最初の2文字になります)。


注:入力した場合、実際にはきれいな数式は正しく機能します。

2
robinCTS