• ベストアンサー

エクセルでこんな並べ替えできますか?

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以上ありますし、列の数も場合により変ります。 よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。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)

noname#204879
noname#204879
回答No.6

[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)
回答No.5

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

noname#204879
noname#204879
回答No.4

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)
回答No.3

関数でもできる問題と思うので 例データ 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)
回答No.1

マクロでこんな感じでどうですか? ただし空白セルがあると停止します。行列とも何行でも対応できるはずですが・・・。 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

関連するQ&A

専門家に質問してみよう