- ベストアンサー
【EXCEL】複数行を1行に
エクセルにまだまだ不慣れなもので、質問させてください。 下の図《1》のようなデータが大量にあります。CSV形式に出力したいのですが《2》のように並べ替えなければいけませんよね?(←ここら変の知識も未熟なものですみません。。) 《1》のようなデータを《2》のような並びにする事は可能でしょうか? ちなみに《1》のようなデータは、一行ずつ空白行をはさみ、下まで何百件も並んでいます。また、1データの行数もランダムです。 何か良い方法がありましたら是非ご教授下さい。よろしくお願い致します。 《1》 A B C D E F 1 ●● 2 ■■ 3 ▲▲ 4 ◎◎ 《2》 A B C D E F 1 ●● ■■ ▲▲ ◎◎ 2 3 4
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとかわった方法ですが… まずそのファイルを「CSV(カンマ区切り)形式」に保存します。 保存したファイルを正規表現の使えるテキストエディタで開きます。 置換で 「\n\n」→「丸い卵も切りようで四角」 「\n」→「,」 「丸い卵も切りようで四角」→「\n」 その後、テキストエディタを閉じます。 そのファイルをExcelで読み込めば、目指す形式に並び替えられているはずです。 ただし、ExcelでCSVファイルを読み込むときには時間がかかる場合がありますので、あわてずにやってみてください。
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 使わないかもしれませんが、マクロで考えてみました。基本的なエラー処理は含めています。 ●● ■■ ▲▲ ~改行~ ○○ □□ △△ 以下のようにCSVに出力される A B C D E F 1 ● ● ■ ■ ▲ ▲ 2 ○ ○ □ □ △ △ あくまでも、2列が条件で、変換して256列の単位を越えるものは、出力されません。また、保存される、CSVのファイル名は、元のブックの名称が使用されます。 'なるべく標準モジュールに登録してください。 '---------------------------------------------------------- 'Option Explicit Sub TransposedCSVOut() '2列-数行をまとめて、横に変換して出力する Dim tmpSht As Worksheet Dim AcSht As Worksheet Dim myRng As Range Dim myArea As Range Dim i As Long, j As Integer, k As Integer Dim Ar As Range, c As Range Dim SaveName As String '保存名は、現在のブックの名前を使用します。 'ただし、同名のCSVファイルがある場合は、枝番がつきます。 With ActiveWorkbook SaveName = Mid$(.Name, 1, InStrRev(.Name, ".") - 1) End With Application.ScreenUpdating = False Set AcSht = ActiveSheet With AcSht '2列の設定は、Resize(,2) Set myRng = .Range("A1", .Range("A65536").End(xlUp)).Resize(, 2) End With '定数すべて選択 Set myArea = myRng.SpecialCells(xlCellTypeConstants, 23) With ActiveWorkbook Set tmpSht = .Worksheets.Add(After:=.Sheets(.Worksheets.Count)) End With i = 1 '注意:空白行のない場合は、途中で中断されます。 For Each Ar In myArea.Areas With Ar '行が、128行以上では、縦横変換で256列には収まらない If Ar.Rows.Count > 128 Then If MsgBox("変換時に256列越えていますので、排出されません。" & vbCrLf & _ "OK =スキップして継続, Cancel = 中止", vbInformation + vbOKCancel + vbDefaultButton2) = vbCancel Then Application.DisplayAlerts = False tmpSht.Delete SaveName = "" Application.DisplayAlerts = True GoTo Quit End If Else If WorksheetFunction.CountA(.Cells) > 0 Then For Each c In Ar.Cells k = k + 1 c.Copy tmpSht.Cells(i, k) Next c i = i + 1 End If End If End With k = 0 Next Ar Application.CutCopyMode = False If i < 2 Then Application.DisplayAlerts = False tmpSht.Delete SaveName = "" Application.DisplayAlerts = True GoTo Quit End If tmpSht.Move '枝番付け Do While Dir(SaveName & ".csv") <> "" If InStrRev(SaveName, "_") > 0 Then SaveName = Mid$(SaveName, 1, InStrRev(SaveName, "_") - 1) End If j = j + 1 SaveName = SaveName & "_" & CStr(j) Loop 'CSV 保存 ActiveWorkbook.SaveAs SaveName, FileFormat:=xlCSV ActiveWorkbook.Close False Quit: AcSht.Select Application.ScreenUpdating = True If SaveName <> "" Then MsgBox "このブックと同じフォルダに " & SaveName & ".csv で、保存されました。", vbInformation Else MsgBox "出力に失敗しました。", vbCritical End If Set Ar = Nothing Set tmpSht = Nothing Set myArea = Nothing Set myRng = Nothing Set AcSht = Nothing End Sub '----------------------------------------------------------
お礼
マクロはこれから勉強していこうと思っております。説明して頂きましてどうもありがとう御座いました!
- aira_cles
- ベストアンサー率50% (1/2)
OFFSET関数をつかってみてはいかがでしょうか? A B C D E F G H 1 ●● 1 1 (1) (2) (3) (4) 2 ■■ 2 (5) ・ ・ ・ ・ 3 ▲▲ 3 ・ ・ ・ ・ ・ 4 ◆◆ 5 6 ○○ 7 □□ 8 △△ 9 ◇◇ 10 (1)=OFFSET($A$1,D1-1,0,1,1) (2)=OFFSET($A$1,D1,0,1,1) (3)=OFFSET($A$1,D1+1,0,1,1) (4)=OFFSET($A$1,D1+2,0,1,1) (5)=D1+5 ※全角数値が行番号、半角数字が実数値、カッコ数字が関数です。 C列はただの通し番号です。 D列は開始行番号です。今回は5行(データ4行+改行)1セットなので(5)の式で上の行+5を行います。 E~H列で実際に並び替えを行っています。 (1)~(5)の式を入力したら、あとはドラッグでそのまま下にコピーをします。(・の部分) すべて値に貼り付けなおしてから、データとして必要のないD列(開始行番号)を削除してください。 ご参考になれば幸いです。
- hirorin00
- ベストアンサー率50% (446/884)
1です。 状況がわかりました。 住所録の場合、最初にExcelで作成するときに、並びを工夫しておくと良いですね。 氏名 住所 電話 家族 1 佐藤 東京都 090-- たかし 2 上田 兵庫県 080-- まゆみ …みたいにしてはどうでしょう。 そうすればCSVで吐き出して、はがきソフトに読み込むのも簡単だと思います。
補足
申し訳ございません!最初から質問の仕方が悪かったようです。 >> 氏名 住所 電話 家族 1 佐藤 東京都 090-- たかし 2 上田 兵庫県 080-- まゆみ …みたいにしてはどうでしょう。 そうなんです。実にこのようにしたいという質問だったのです。改行で区切られたデータを一行カンマ区切りにして出力したかったのです。 ●● ■■ ▲▲ ~改行~ ○○ □□ △△ のようなテキストを ●●, ■■,▲▲ ○○,□□,△△ のような並びにすることは可能ですか?という意味でした。 解り難かったようでごめんなさい!
- Nouble
- ベストアンサー率18% (330/1783)
CSV形式への変換については他の方が回答されているのでさておき B2 B3 B4 B5 ・ ・ ・ と順に下へ並ぶデーターを B1・C1・D1・E1… と横方向へ続くデーターに並べ替えたい場合について回答しますね まず、先に他の方が述べられているように Excelでの横方向のデーターの羅列は 比較的件数が少なく設定されています。(AからIVまでの256件) それに対し縦は65536件データーを置けるようです、 なので、Bのラインから置きだす場合は255件しか置けないので 縦に並んだデーターから255件選んでコピーし 置きたい位置の右端を(この場合だとB1とかB2と加点)選択した後 そこの上で右クリックからプルダウンメニューを出して 「形式を選択して貼り付け」を選び 出てきたメニューから 右下隅の「行列を入れ替える(E)」にチェックを入れて 「OK」ボタンを押すと 縦並びが横並びに変換されて貼り付けられます。 この際にデーターの入っていないCの列のC1に1、 C2に 「=IF(MOD(C1,255)=0,1,C1+1)」 と書いた上 C2をコピーしてC65536までコピ-してみてください 1から255個までデーター個数をカウントしてくれるはずです お役に立てましたでしょうか?
》 《1》のようなデータを《2》のような並びにする事は可能でしょうか? 可能です。 でも、マクロがお出来になる方ならお茶の子だろうけど、それが出来ない私なら次のようにするかと。面倒なので、もっと簡単でスマートな方法があれば私も知りたいところ。 1.先頭行に1行の空白行を挿入して、データが2行目から始まることにする。 つまり、データはセル A2、A3、A4、… にあり、データの区切りとしての1行の空 白行が所々にある。 2.セル B1 に式 =A2="" を入力して、此れを下方に(列Aの下端のデータと同じ行ま で)ズズーッと複写 3.セル C2 に式 =IF(A2="","",IF(A1="",A2,C1&","&A2)) を入力して、此れを下方に (列Aの下端のデータと同じ行まで)ズズーッと複写 4.列B、C全体を選択して、[コピー]→[値の貼り付け]を実行 5.セル B1 のみを選択 6.[データ]→[フィルタ]→[オートフィルタ]を実行 7.セル B1 のオートフィルタ矢印(▼)をクリックして、FALSE を選択 8.セル B2 を選択して、Ctrlキーおよび Shiftキーを抑えたままで、下向き矢印(↓) キーをチョーン 9.[編集]→[行の削除]を実行して、表示されていたデータを全削除 10.ステップ6に同じ 11.(ステップ1で挿入した)先頭行を削除 12.列A、Bを削除 13.列Aを選択 14.[データ]→[区切り位置]を実行 15.“カンマやタブなどの…”に目玉を入れて[次へ]をクリック 16.“カンマ”にチェック入れ 17.Enterキーを2回叩き付け 以上の件で再質問があれば、ステップ番号および疑問点を示されたい。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >CSV形式に出力したいのですが《2》のように並べ替えなければいけませんよね? 逆の質問が時々あります。その質問者の方々は、みなさん、CSV形式のファイルだと思っていますが、似ていて違うものです。それは、CSV形式のファイルではありません。データベース・ソフトでないと出来ません。標準では、Excelでは、256列でおしまいになってしまうからです。
- hirorin00
- ベストアンサー率50% (446/884)
はじめまして CSVにするからといって、並べ方を変える必要はありません。 保存するときに、CSV形式で保存すればよいことです。 これで解決にはならないでしょうか?
補足
ご回答ありがとうございます。 住所録など、データの移し変えをする際、CSVではき出すと ○山○子,123-4567,東京都○○区,03-1234-5678 ○田○夫,456-7890,北海道○○市,011-123-4567 のように表示されるのでこのような並べ方にしなければならないと思っていました。
お礼
色々な方法があるのですね!とても参考になります。どうもありがとう御座いました!