web-dev-qa-db-ja.com

複数の入れ子になった代替関数をExcelで結合するにはどうすればよいですか?

後で連結される文字列を再フォーマットする関数を設定しようとしています。文字列の例は次のようになります。

Standard_H2_W1_Launch_123x456_S_40K_AB

ただし、「[〜#〜] s [〜#〜]」は存在せず、「40K」は「60K」またはそこにないことがありますが、「_ AB」は「_CD」または「EF」。最後に、すべての下線をハイフンに変更する必要があります。最終製品は次のようになります。

Standard-H2-W1-Launch-123x456-

次の4つの関数を実行すると、これらすべてを処理できます。

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"_AB","_"),"_CD","_"),"_EF","_")

=SUBSTITUTE(SUBSTITUTE(B2,"_40K",""),"_60K","")

=SUBSTITUTE(C2,"_S_","_")

=SUBSTITUTE(D2,"_","-")

これらを1つの関数に結合する方法をいくつか試しましたが、このレベルのExcelは比較的新しいので、迷っています。とにかくこれをすべて組み合わせて、1つのセルで1つのコマンドを次々に実行する方法はありますか?

12
samanthathyme

これらを単純に結合するには、次のようにそれらをすべて一緒に配置できます。

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"_AB","_"),"_CD","_"),"_EF","_"),"_40K",""),"_60K",""),"_S_","_"),"_","-")

(これは、7つのネストされたステートメントという古いExcelの制限に合格する可能性があることに注意してください。私はExcel 2010でテストしています


別の方法は、LeftおよびRight関数を利用することです。

これは、最後の変更データが常に存在し、8文字の長さであると想定しています

=SUBSTITUTE(LEFT(A2,LEN(A2)-8),"_","-")

これにより、同じ結果の文字列が得られます


文字列の末尾が8文字で終わるとは限らない場合は、「_ S」を検索して現在の場所を取得できます。これを試して:

=SUBSTITUTE(LEFT(A2,FIND("_S",A2,1)),"_","-")
18
Portland Runner

数式を分解するアイデアをありがとう Werner

Alt + Enterを使用すると、複雑な代替数式の各ビットを別々の行に配置できます。Enterを押すと、それらが追跡しやすくなり、自動的に整列します。

セル参照の両側のsubstitute(行の数に一致する十分な終了ステートメントがあることを確認してください。

この例のように:

=
substitute(
substitute(
substitute(
substitute(
B11
,"(","")
,")","")
,"[","")
,"]","")

になる:

=
SUBSTITUTE(
SUBSTITUTE(
SUBSTITUTE(
SUBSTITUTE(B12,"(",""),")",""),"[",""),"]","")

これはそのまま正常に機能しますが、余分な段落をいつでも手動で削除できます。

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B12,"(",""),")",""),"[",""),"]","")

名前> substitution()

[アメリカ領サモア]>アメリカ領サモア

2
Phil
  • 文字列内のSUBSTITUTE()のネストは厄介な場合がありますが、いつでも配置できます:

Screenshot formula bar

1
player0

次のアプローチを使用します。

_=SUBSTITUTE(LEFT(A2,LEN(A2)-X),"_","-")
_

ここで、Xは、あなたが後ではないものの長さを示します。そして、Xに使用します

_(ISERROR(FIND("_S",A2,1))*2)+
(ISERROR(FIND("_40K",A2,1))*4)+
(ISERROR(FIND("_60K",A2,1))*4)+
(ISERROR(FIND("_AB",A2,1))*3)+
(ISERROR(FIND("_CD",A2,1))*3)+
(ISERROR(FIND("_EF",A2,1))*3)
_

上記のISERROR(FIND("X",.,.))*xは、Xが見つからない場合は0を返し、見つかった場合はxXの長さ)を返します。技術的には、一致する可能性があるものから_A2_を右からトリミングしています。

このアプローチの利点は、「置換」がネストされていないため、どの置換(または削除)が行われているのかがより明確であることです。

1
Werner