- ベストアンサー
エクセルでこんな並べ替えできますか?
A,B,C,D列に次のような文字列が入っていたとします。 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D2 これをどこかの列に次のように並べ替えたいのですが。 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3 実際は各行が100以上ありますし、列の数も場合により変ります。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。Wendy02です。 式でしたら、このようになります。 =OFFSET($A$1,INT((ROW(A1)-1)/4),MOD(ROW(A1)-1,4)) マクロでしたら、このようにしたら良いです。 他のシートにも移すことは可能です。なお、上書きも可能ですが、隣の列にあるものは削除しません。 '<標準モジュール推奨> '---------------------------------------------- Sub ColumnPaste() Dim r1 As Range Dim r2 As Range Dim rng As Range Dim c As Range Dim i As Long Dim ar() As Variant On Error Resume Next Set r1 = Application.InputBox("コピーする左端上のセルを選んでください。", "コピー", "$A$1", Type:=8) If r1 Is Nothing Then Exit Sub Set r2 = Application.InputBox("ペーストするセルを選んでください。", "ペースト", "$G$1", Type:=8) If r2 Is Nothing Then Exit Sub On Error GoTo 0 Set rng = r1.CurrentRegion For Each c In rng ReDim Preserve ar(i) ar(i) = c.Value i = i + 1 Next c Application.Goto r2 Application.ScreenUpdating = False r2.Cells(1).Resize(UBound(ar()) + 1).Value = WorksheetFunction.Transpose(ar()) Application.ScreenUpdating = True Set r1 = Nothing: Set r2 = Nothing : Set rng = Nothing End Sub '----------------------------------------------
その他の回答 (5)
[No.4回答]への補足、 》 N1: =OFFSET(A$1,L1,M1) 名前 table を使用しているのに、「A$1」などとアドレスを用いたのは画竜点睛を欠いたかも知れません。上式中の A$1 は、INDIRECT(CELL("address",table)) に置き換えてください。つまり… N1: =OFFSET(INDIRECT(CELL("address",table)),L1,M1)
- imogasi
- ベストアンサー率27% (4737/17069)
VBAで最少限に短くすると、標準モジュールに Sub test01() Dim cl As Range Dim r As Range Set r = Application.InputBox("範囲指定", Type:=8) s = InputBox("出力シート名") i = 1 For Each cl In r Worksheets(s).Cells(i, "A") = cl i = i + 1 Next End Sub
1.元データ範囲に名前(例えば)table を付ける 2.セル L1、M1、N1 に次式を入力 L1: =INT((ROW(1:1)-1)/COLUMNS(table)) M1: =IF(MOD(ROW(1:1),COLUMNS(table)),MOD(ROW(1:1),COLUMNS(table))-1,COLUMNS(table)-1) N1: =OFFSET(A$1,L1,M1) 3.範囲 L1:N1 を下方にズズーッと複写
- imogasi
- ベストアンサー率27% (4737/17069)
関数でもできる問題と思うので 例データ 4列の例にします。 Sheet1のA1:D100に 1 2 3 4 5 6 7 8 9 10 11 12 ・・・・ Sheet2のA1に =INDEX(Sheet1!$A$1:$D$100,INT((ROW()-1)/4)+1,MOD((ROW()-1),4)+1) と入れて、下方向に式を複写する。 ●上記式の「4」を実際の列数に応じて変えてください。 ●$D$100のDも列数に応じて変えてください。 ●100も元データの最下行の行番号数に応じて変えてください。
- char_cat
- ベストアンサー率45% (22/48)
マクロでこんな感じでどうですか? ただし空白セルがあると停止します。行列とも何行でも対応できるはずですが・・・。 Sub Macro1() ' Range("A1").Select Do Until Selection = "" ActiveCell.Offset(0, 1).Range("A1").Select Do Until Selection = "" ActiveCell.Offset(1, 0).Rows("1:1").EntireRow.Select Selection.Insert Shift:=xlDown ActiveCell.Offset(-1, 1).Range("A1").Select Range(Selection, Selection.End(xlToRight)).Select Selection.Cut Destination:=ActiveCell.Offset(1, -1).Range("A1:C1") ActiveCell.Offset(1, 0).Range("A1").Select Loop ActiveCell.Offset(1, -1).Range("A1").Select Loop End Sub