こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel 複数列を1列にする方法

列の終わりがバラバラなのですが、複数列を1列にしたいのです。
手作業ではなく、簡単にできる方法はないでしょうか?
手でコピペするには列がかなり多く、画面におさまりきらない長い列なのできっちりコピペできたか不安があります。
また、よそへ提出する書類になるのでなるべく手作業を省くのが目的です。
ぴったり隙間なくくっつかなくてかまいません。複数セル空白が入ってもかまいません。

Excelに不慣れですが、上司にこういうことできないの?と言われて困っています。
ご存知の方教えていただけますでしょうか?
よろしくお願いいたします。

投稿日時 - 2017-04-08 12:45:04

QNo.9315009

すぐに回答ほしいです

質問者が選んだベストアンサー

シート1(元)からシート2で1列にするとして
シート2のA1の数式を
=OFFSET(シート1!$A$1,MOD(ROW()-1,8),INT((ROW()-1)/8))
とすれば8行毎に、隣の列の値をコピーできます。
最期にシート2のA列をコピーして、形式を選択して貼り付けで値とすれば置き換わります。
※1.値の無いセルは0が表示されます。もしコピーするのが文字列だけの場合なら数式の最後に &"" を付ければ空白になります。
※2.数式中の8の部分が、移動する列の最大行に変更してください。

投稿日時 - 2017-04-08 13:20:10

お礼

ありがとうございます!コピペで使わせていただきました。大変助かりました。皆様回答頂きましたが、一番はやく回答頂いたのでmshr1962さんをBAとさせていただきます。

投稿日時 - 2017-04-17 15:19:21

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

Sub test01()
Set Sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
r = Array(1, 3, 4, 6) 'A,C,D,F列の例の場合 統合する対象列の列番号でを列挙
llr = 2 '統合の中間段階の最後行
For c = 0 To UBound(r) '各列の繰り返し
lr = Sh1.Cells(10000, r(c)).End(xlUp).Row '各列の最下行の行番号
Sh1.Range(Cells(2, r(c)), Cells(lr, r(c))).Copy sh2.Cells(llr, "A")
llr = llr + lr - 1
Next c
End Sub
仮定は各列10000行以下
各列には一番上に1行の見出しがある。
Sheet1の各行ー>Sheet2のA列に統合。
関数の回答より文字数が少ない。
よくデータテストをしてから使うこと。

投稿日時 - 2017-04-08 17:29:58

ANo.4

>手でコピペするには列がかなり多く、画面におさまりきらない長い列なのできっちりコピペできたか不安があります。
質問の画像ではA列からC列までの3列ですが実際の列数は何列ですか?
また、抜き出す列の行数は質問の画像のように各列で空欄のセルが中間に無いと考えて良いのですか?
尚、稀に行と列を誤って表現する人がいますので確認します。
A、B、C、Dと上に表示されているのが列記号で、左に上から1、2、3、4と表示されているのが行番号です。
従って、「列が多い」と言うのは「列記号の数が多い」と言うことなので認識を再確認してください。

提示の画像で3列(A、B、C)を対象に最大1000行を処理し、E列へ抜き出す数式です。(Excel 2013で検証、Excel 2007以降のバージョンで再現可能)
E1=IFERROR(INDEX(OFFSET(A$1,0,0,MAX(INDEX(N(NOT(ISBLANK(A$1:A$1000)))*ROW(A$1:A$1000),0))),ROW(A1)),IFERROR(INDEX(OFFSET(B$1,0,0,MAX(INDEX(N(NOT(ISBLANK(B$1:B$1000)))*ROW(B$1:B$1000),0))),ROW(B1)-MAX(INDEX(N(NOT(ISBLANK(A$1:A$1000)))*ROW(A$1:A$1000),0))),IFERROR(INDEX(OFFSET(C$1,0,0,MAX(INDEX(N(NOT(ISBLANK(C$1:C$1000)))*ROW(C$1:C$1000),0))),ROW(C1)-MAX(INDEX(N(NOT(ISBLANK(A$1:A$1000)))*ROW(A$1:A$1000),0))-MAX(INDEX(N(NOT(ISBLANK(B$1:B$1000)))*ROW(B$1:B$1000),0))),"")))
E1セルを下へ必要数コピーします。
数式を見てもどのような論理になっているか理解できないかも知れません。
Excelの高度な使い方を学習して理解できるようになってください。

回答No.2のマクロの方が理解し易いと思いますので併せて学習すると良いでしょう。

>Excelに不慣れですが、上司にこういうことできないの?と言われて困っています。
「私にはできません。」と答える勇気も必要です。
仕事の効率化に第三者の知恵を無料で求めるのは如何なものでしょうか?

投稿日時 - 2017-04-08 14:55:45

お礼

回答をありがとうございました。
>仕事の効率化に第三者の知恵を無料で求めるのは如何なものでしょうか?
これについては、大変心苦しく思っております。集計する内容を把握しているのは私だけ、また案件の内容によって外部に出せない状況でした。
せめて私のできる範囲で別ジャンルでお答えするなどできればと思っております(自己満足ですが・・・)

投稿日時 - 2017-04-17 16:13:38

ANo.3

完全自動化ではないけど、次のようなのは如何でせう?
以下は Sheet2 における作業です。
1.「終わりがバラバラな」列の最大行数を見付けておく(此処では列Aの 8)
2.セル A1 に次式を入力
 ̄ ̄ =OFFSET(Sheet1!A$1,MOD(ROW(A1)-1,8),(ROW(A1)-1)/8)
3.そのセルを下方にズズーッとセル A24 (←8x3) までオートフィル
4.列A全体を選択して[コピー]→[値の貼り付け]を実行
5.列A全体を選択したままで、Ctrl+G 「エイヤッ!」と叩き付け
6.[セル選択]を実行
7."定数"に目玉入れの後、“数値”のみにチェックを残し、その他の全チェックを外して、[OK]をクリック
8.[ホーム]→[セル <削除>]→"上方向にシフト"→[OK]

投稿日時 - 2017-04-08 14:22:28

お礼

詳しい手順をありがとうございました・・・!
なんとか提出が間に合ったようです、皆様のおかげです。

投稿日時 - 2017-04-17 15:21:48

ANo.2

マクロになります。
i = 1
For 列 = 1 To 255
For 行 = 1 To Cells(65536, 列).End(xlUp).Row
Sheets("sheet2").Cells(i, 1) = Sheets("sheet1").Cells(行, 列)
i = i + 1
Next
Next

または、
http://officetanaka.net/excel/function/tips/tips66.htm

投稿日時 - 2017-04-08 13:20:25

お礼

回答ありがとうございます!
もしかして隙間もできずに収集できたのかもしれません。。。でも難しくて私には無理でした;;お時間割いていただきありがとうございます!!

投稿日時 - 2017-04-17 15:20:44