プロが教えるわが家の防犯対策術!

エクセルについて、
縦に並んだデータをn個ずつ横に並べる関数、もしくは方法はありませんか?
大量なデータを扱うので、コピー&ペースト以外のやり方でお願いします。

例)n=3のとき
1
2
3
4
5
6
7
8
9
10

1 4 7 10
2 5 8
3 6 9

A 回答 (5件)

 今仮に、データーがSheet1のA2~A11の範囲に存在していて、n=3で、Sheet2のA2~D4の範囲に並べ替えた結果を表示させるものとします。



 まず、Sheet2のA2セルに次の関数を入力して下さい。

=IF(or(ROWS($2:2)>3,(COLUMNS($A:A)-1)*3+ROWS($2:2)>COUNT(Sheet1!$A:$A)),"",INDEX(Sheet1!$A$2:$A$11,(COLUMNS($A:A)-1)*3+ROWS(A$2:A2)))

 次に、Sheet2のA2セルをコピーして、Sheet2のA3~A4の範囲に貼り付けて下さい。
 次に、Sheet2のA2~A4の範囲をコピーして、同じ行のB列から右方に貼り付けて下さい。

 以上です。

 尚、Sheet1!$A$2:$A$11の部分に関してですが、データーが存在している最終行の指定は、実際の最終行よりも下の行を指定しても構いません。
 例えば、Sheet1!のA2~A11の範囲にデーターが存在している場合でも、Sheet1!$A$2:$A$999等と指定しても構いません。($A$2の方は必ず最初のデーターが存在しているセルに合わせて下さい)
    • good
    • 0
この回答へのお礼

ありがとうございました。
大変参考になりました。

お礼日時:2011/04/24 16:19

お示しのデータがシート1のA1セルから下方に入力されているとします。


並べ替えた表をシート2に表示させるとしてA1セルにはnの値を例えば3などと入力します。
A2セルには次の式を入力して下方にオートフィルドラッグしたのちに右横方向にもオートフィルドラッグします。

=IF(OR(ROW(A1)>$A$1,INDEX(Sheet1!$A:$A,MOD(ROW(A1)-1,$A$1)+1+(COLUMN(A1)-1)*$A$1)=0),"",INDEX(Sheet1!$A:$A,MOD(ROW(A1)-1,$A$1)+1+(COLUMN(A1)-1)*$A$1))
    • good
    • 0

添付図参照



C1: =OFFSET($A$1,ROW(A1)-1+(COLUMN(A1)-1)*3,)
「エクセルについて」の回答画像3
    • good
    • 0

昨日は逆の質問が出ていた。


これは計算問題なのだ
エクセルの式はセルの値を求めたいセルに計算式を入れるのだ。
(VBAであれば自由なので、こんなのは苦労しないが。)
そして式を入れるセルの行と列はROW(),COLUMN()関数で得られることを知っておく必要がアル。
其れで1,2例で計算式を考えて、式を一般化すればいいのだ。
たとえば2行2列であれば1列目で3個は使い果たし2列1行目が4番目、2行目はその次(+1)の5だ。
一般にn行、m列では、(m-1)*3は左列で使ってしまっているから、そのn個あとがこのセルに来るべきだ。
それをINDEX関数で元の1列データから持ってくる
例データ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
今回は同一シートでやって見る。またD1セルから右列に出してみる。
また縦行数は、4行でやってみる。
D1に
=INDEX($A$1:$A$100,(COLUMN()-3-1)*4+ROW())
これを第4行目目まで(D1:D4)にしきを複写。
そしてD1:D4を右方向に式複写。
式の-3はD列から始めているから入れる必要があるもの。
結果
1591317
2610140
3711150
4812160
0を出さないようにするには
(COLUMN()-3)*4+ROW()が、データ数(データが数値の場合は)COUNT(A1:A100)より大なら空白というIF関数をかぶせる。
    • good
    • 0

こんにちは!


すでに回答は出ていますので、参考程度で・・・
VBAでやってみました。Sheet1のデータをSheet2に表示するようにしています。

画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので
↓のコードをコピー&ペーストしてマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

尚、Sheet2は使用していないという前提です。
Sheet1のデータは1行目からあるとしています。

Sub test() 'この行から
Dim i, j As Long
Dim ws1, ws2 As Worksheet
Set ws1 = Worksheets("sheet1") '←Sheet名は実際のSheet名に!
Set ws2 = Worksheets("sheet2")
j = InputBox("行数を入力してください。")
ws2.Cells.Clear
For i = 1 To ws1.Cells(Rows.Count, 1).End(xlUp).Row
If ws2.Cells(i, 1).Row Mod j = 0 Then
ws2.Cells(i, 1) = j
Else
ws2.Cells(i, 1) = ws2.Cells(i, 1).Row Mod j
End If
ws2.Cells(i, 2) = WorksheetFunction.RoundDown(ws2.Cells(i + j - 1, 2).Row / j, 0)
Next i
For i = 1 To ws2.Cells(Rows.Count, 1).End(xlUp).Row
ws2.Cells(ws2.Cells(i, 1), ws2.Cells(i, 2) + 2) = ws1.Cells(i, 1)
Next i
ws2.Columns("A:B").Delete (xlToLeft)
End Sub 'この行まで

こんな感じではどうでしょうか?m(__)m
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!