- ベストアンサー
エクセルで同じセルにある文字列を任意の位置から別のセルに移したい
はじめまして。エクセルのセルについて教えてください。 下記のような規則性の無い文字列を別のセルに取り出したいのですがどのようにしたらよいのか解りません。 <元々の文字列> FR001/ws frame.flat £100.00 PN1234-ss oval st george £80.00 BT0123-ss square st george cross £126.25 この文字列を3つのセルに分けたいのです。 一番左側はwsやssで終わっている文字列、一番右側は£から右全部 中央のセルはそれ以外の文字列です。 出来るだけ詳しく教えていただけると助かります。 どうぞよろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.2のham_kamoです。 mshr1962さんの数式はとてもスマートですね。私の書き方は非常に泥臭くさかったです。 区切りとなる文字列が2つあるなら、置換してからFINDすればいいとか、エラーが出ないように対象文字列にあえて検索文字列をくっつけるなど、大変参考になりました。 えっと、そしてcorontaさんのご質問ですが、 LEFT(文字列,a)は、文字列の左からa文字を取り出す関数です。 RIGHT(文字列,a)は、文字列の右からa文字を取り出す関数です。 MID(文字列,a,b)は、文字列のa番目の文字からb文字を取り出す関数です。 LEN(文字列)は文字列の長さを返す関数です。 FIND("a",文字列)は、文字列から"a"という文字列を探して、その位置を返す関数です。検索文字列がないときはエラーになります。 それを踏まえて解説します。 ●2番目の文字列 C1 =MID(A1,LEN(B1)+2,FIND("£",A1)-LEN(B1)-3) は、元の文字列A1の「LEN(B1)+2」番目から「FIND("£",A1)-LEN(B1)-3」文字を取りだしています。 ・LEN(B1)+2について B1にはwsもしくはssで切り出した文字列が入っており、 FR001/ws frame.flat £100.00 の場合は「FR001/ws」なので、LEN(B1)は8となります。 したがって、LEN(B1)+2とすると空白をとばして、次の「frame~」の文字列の開始位置となります。 ・FIND("£",A1)-LEN(B1)-3について これが2番目の文字列の文字数になりますが、まず FIND("£",A1) で、元の文字列の最初から£までの文字数が求められます。 そして、B1で取りだした文字列は含まれないので、その文字数を引きます。これが -LEN(B1) の部分ですが、実際はB1で取りだした文字列+次の空白の分で-LEN(B1)-1しないといけません。 さらに、£記号及びその手前の空白は含めないので、その分-2します。上のとあわせて-LEN(B1)-3となります。こうすることで、2番目の文字列の文字数を計算しています。 ●3番目の文字列 D1 =RIGHT(A1,LEN(A1)-FIND("£",A1)+1) は、元の文字列(A1)の右から、「LEN(A1)-FIND("£",A1)+1」文字を取りだしています。これは3番目の文字列の長さを指定していることになります。 3番目の文字列の長さは、全体の長さから、£記号の手前の空白までの文字列を引けば求まります。 文字列全体の長さはLEN(A1)です。 £までの文字数は、£の位置 FIND("£",A1) で求まります。したがって£の手前の空白までの文字数は、FIND("£",A1)-1 となります。 そうすると、3番目の文字列の文字数は、 LEN(A1)-(FIND("£",A1)-1) → LEN(A1)-FIND("£",A1)+1 となります。
その他の回答 (4)
- mu2011
- ベストアンサー率38% (1910/4994)
力技ですが次の方法は如何でしょうか。 (1)編集→置換 検索文字 ws△(△はスペース) 置換文字 ws: (2)編集→置換 検索文字 ss△(△はスペース) 置換文字 ss: (3)編集→置換 検索文字 △£(△はスペース) 置換文字 :£ (4)対象列を選択し、データ→区切り位置→次へ→区切り文字でその他にチェックを付け、コロン「:」を入力→完了 各コードについては、全角/半角を合わせて下さい。
- mshr1962
- ベストアンサー率39% (7417/18945)
見たところ初めのws,ssの次は最初の半角スペースですが ws,ssより前に半角スペースは出てきますか?それがないなら B1=LEFT(A1,FIND(" ",A1)-1) 半角スペースが出る可能性がある場合は B1=LEFT(A1,FIND("ss",SUBSTITUTE(A1,"ws","ss")&"ss")+1) C1とD1は#2のかたと同じです。
補足
早速のご回答ありがとうございました。 今やってみましたがきちんとできました。 今後他の文字列にも応用したいのでこの関数のご説明をお願いしたいのですがよろしいでしょうか? 大変お手数お掛け致しますがどうぞよろしくお願い致します。
- ham_kamo
- ベストアンサー率55% (659/1197)
かなり強引な方法ですが、なんとか数式を作ってみました。 A1に文字列が入っているとして、B1~D1に3分割します。 B1 =LEFT(A1,MAX(IF(ISERROR(FIND("ws",A1)),0,FIND("ws",A1)),IF(ISERROR(FIND("ss",A1)),0,FIND("ss",A1)))+1) C1 =MID(A1,LEN(B1)+2,FIND("£",A1)-LEN(B1)-3) D1 =RIGHT(A1,LEN(A1)-FIND("£",A1)+1) 少しでもイレギュラーなパターンがあったら、正常に表示されないと思いますが…。誰かもっとスマートなやり方を教えてほしいところです。 ユーザ定義関数を作ってしまえば楽なんですけどね。
補足
早速のご回答ありがとうございました。 やってみましたが教えていただいた関数できちんとできました。 #3の方にもご質問させて頂いたのですがC1とD1の関数を他にも応用したいので出来るだけかみくだいてご解説いただけたら有難いのですが… 大変お手数お掛け致しますがどうぞよろしくお願い致します。
- happy_dog
- ベストアンサー率29% (98/329)
うぉ、これは難しい 一度、csvかtxtで保存して、空白セルで区分け で区切りたいところに縦線を動かして読み込みなおし が一手と思われる
お礼
お忙しい所とても解りやすくご解説頂きまして本当にありがとうござました。お陰様で理解できました。