- ベストアンサー
エクセル セル内改行を別セル抽出
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
添付図のように、Sheet1のA1からのデータをSheet2のA1から書き出します。改行は1セルに1回としています。 変換の手順は、 (1)区切りコード(CHAR(10))で前後に分ける。 (2)横に展開する。 (3)Sheet2では、2列右に進むごとにSheet1への参照を1列増やす 座標変換になります。 算式はセルA1とセルB1の2つがセットです。(aokiiさんの式を使わせてもらいました) セルA1:=IFERROR(LEFT(OFFSET(Sheet1!$A1,0,(COLUMN()-1)/2),FIND(CHAR(10),OFFSET(Sheet1!$A1,0,(COLUMN()-1)/2))),"") セルB1:=IFERROR(MID(OFFSET(Sheet1!$A1,0,INT((COLUMN()-1)/2)),FIND(CHAR(10),OFFSET(Sheet1!$A1,0,INT((COLUMN()-1)/2))),1000),"") 長い算式になってしまいました。ご辛抱を。回答をコピーしてください。2つのセル単位で右方向に必要分コピーし、行方向に必要分増やしてください。未入力対応しています。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
#2です。 VBAでやってみた。 質問者の場合に合わせて、下記コードを部分修正できるようならやってみたら。 Split関数利用が目新しいだけで、あとはVBA的には初等的平凡。 例データ Sheet1 A1:B3 各セルには、どのセルも、2回のセル内改行とした (見た目3行です)。 "11 aa xxx" "22 bb yyy" "33 cc zzz" "44 dd uuu" "55 ee vvv" "66 ff www " 標準モジュールに Sub test01() ' 留意事項 'Sheet1の行数 任意 'Sheet1の列数 任意 ただし各行で同列数とする。 'Sheet1のセルの改行数 一定であること Dim s As Variant Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet3") lr = sh1.Range("A100000").End(xlUp).Row cr = Cells(2, 1000).End(xlToLeft).Column 'MsgBox lr & " " & cr '----- jj = 1 'Sheet3のA列へ For i = 1 To lr For J = 1 To cr s = Split(sh1.Cells(i, J), Chr(10)) 'MsgBox i & "行" & J & "列 " & "改行後行数" & UBound(s) + 1 For u = 0 To UBound(s) '0から始まる 'MsgBox i & "行" & jj & " 列 " & s(u) sh2.Cells(i, jj) = s(u) jj = jj + 1 'Sheet2で次列へ Next u Next J jj = 1 'Sheet3のA列へ Next i End Sub 実行結果 Sheet3 11 aa xxx 22 bb yyy 33 cc zzz 44 dd uuu 55 ee vvv 66 ff www 「Sheet1の各セルの改行数は一定であること」を、「バラバラもあり得る」、とすると、結果を(列的に)シートにどう出してよいか迷う。
お礼
ありがとうございます!対応いただき助かりました。非常に参考になりました。次からVBAをもっと学習したいと思います!
- imogasi
- ベストアンサー率27% (4737/17069)
質問者のれべるでは、エクセル関数でということだろうか。 基データがセル内改行が2行なら下記で出来そうだが、それを超えると、式が複雑になりすぎて、やる気が出ない。 VBAでやるなら、コード行数は増えるにしても可能だろうと思う。 Sheet1のA,B列の例 2列3行分の例示 シートセル範囲をコピーして貼り付けると、変な様子になるが、状態は判りますね。質問の通りで、1せる行分増やしただけ。 "11 <--個の箇所でセル内改行あり。以下同様。 aa" "22 bb" "33 cc" "44 dd" "55 ee" "66 ff" ーーー Sheet2に行って A1セル =MID(Sheet1!A1,1,FIND(CHAR(10),Sheet1!A1)-1) B1セル =MID(Sheet1!A1,FIND(CHAR(10),Sheet1!A1)+1,LEN(Sheet1!A1)-FIND(CHAR(10),Sheet1!B1)) C1セル =MID(Sheet1!B1,1,FIND(CHAR(10),Sheet1!B1)-1) D1セル =MID(Sheet1!B1,FIND(CHAR(10),Sheet1!B1)+1,LEN(Sheet1!B1)-FIND(CHAR(10),Sheet1!B1)) 基データの行セル数だけ式複写。 結果 Sheet2のA1:D3 11 aa 22 bb 33 cc 44 dd 55 ee 66 ff
- aokii
- ベストアンサー率23% (5210/22062)
Sheet1のA1セルを分割する場合は以下の式をSheet1のC1セルとD1セルに、それぞれ、入れてみて下さい。 Sheet1のC1セルに入れる式 =LEFT(A1,FIND(CHAR(10),A1)) Sheet1のD1セルに入れる式 =MID(A1,FIND(CHAR(10),A1),1000)
お礼
ありがとうございます。私のレベルでも理解できました。次回作るときに参考にしたいと思います!
お礼
ありがとうございます!正直VBA自体もよく理解していなかったのですが、ちょっと数値を変えてみたらできました!すごいですね、助かりました。