• ベストアンサー

エクセル 行と列入れ替え

エクセルで隣り合う二つのセルを一単位として 行と列を入れ替えるにはどうすればいいでしょうか。 例えば、   A B C D E F 1 U V W X Y Z を   A B 1 U V 2 W X 3 Y Z のように一括に処理する方法があれば教えて下さい。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一例です。 仮に元データをsheet1として、sheet2に抽出します。 (1)sheet2のA1に=OFFSET(Sheet1!$A$1,0,(ROW(A1)-1)*2)、B1に=OFFSET(Sheet1!$A$1,0,(ROW(A1)-1)*2+1)を入力 (2)sheet2のA1:B1を選択して、下方向にコピー

pk88
質問者

補足

教えていただいた方法で解決しました。 逆の処理として縦から横への返還がどうしても分からないので 教えていただけないでしょうか。   A B 1 U V 2 W X 3 Y Z →   A B C D E F 1 U V W X Y Z はどうすればいいでしょうか。

その他の回答 (7)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.8

マクロでやれば Sub test01() Dim sh1, sh2 Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") r = sh1.Range("IV1").End(xlToLeft).Column For i = 1 To r i2 = Int((i - 1) / 2) + 1 j2 = ((i - 1) Mod 2) + 1 sh2.Cells(i2, j2) = sh1.Cells(1, i) Next i End Sub ーー 例データ Sheet1 A1-N1に1-14を入れる。 上記を実行 結果 Sheet2 A1:B7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 関数でも同じ計算問題(VBAの式の裏返し) Sheet2のA1で =INDEX(Sheet1!$A$1:$N$1,1*(ROW()-1)*2+COLUMN()) B1に式を複写 A1:B1を下方向に式を複写 結果 上記と同じ。

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.7

ANo.2 様の方法に習った場合、・・・・ (1)sheet2のA1に     =OFFSET(Sheet1!$A$1,INT((COLUMN(A1)-1)/2),MOD(COLUMN(A1)-1,2))    を入力します。 (2)sheet2のA1を選択して、左方向にコピーします。

pk88
質問者

お礼

ご回答ありがとうございました。 解決しました。 理解しやすかったOFFSETを用いた方法で当面の処理はやってみます。 マクロを用いた方法は直ぐには理解できなかったのですが、 理解できたらとても有用そうなのであとで試してみたいと思います。 三つのセルを一単位とする場合は、 =OFFSET(Sheet1!$A$1,INT((COLUMN(A1)-1)/3),MOD(COLUMN(A1)-1,3)) とすればいいんですよね。

回答No.6

少し汎用的なマクロを作ってみました。 Sub Macro1() '------------------------------------------------------------------------ 'A1,B1,A2,B2,A3,B3 'のように横一列になったデータを 'A1,B1 'A2,B2 'A3,B3 'のようにマトリックス整形する '------------------------------------------------------------------------ Dim rng As Range '選択領域を格納します Dim a() As String '1行の値列を格納します Dim n As Integer '列数を格納します Dim x As Integer, y As Integer '選択域の左上位置を格納します Set rng = ActiveWindow.RangeSelection n = rng.Columns.Count '選択域の列数を取得します If n Mod 2 = 1 Then MsgBox "選択列数は2の倍数にしてください" Exit Sub End If If rng.Rows.Count > 1 Then MsgBox "1行以上選択しないでください" Exit Sub End If x = rng.Column y = rng.Row ReDim a(n - 1) '変数のサイズを列数分確保します For i = 1 To n a(i - 1) = rng(1, i) 'i列の値を取得します Cells(y, x + i - 1).Value = "" 'i列の内容を消去します Next For i = 1 To n / 2 Cells(y + i - 1, x) = a(2 * i - 2) Cells(y + i - 1, x + 1) = a(2 * i - 1) Next Range(Cells(y, x), Cells(y + n / 2 - 1, x + 1)).Select End Sub Sub Macro2() '------------------------------------------------------------------------ 'A1,B1 'A2,B2 'A3,B3 'のように行列表示になったデータを 'A1,B1,A2,B2,A3,B3 'のように1行に集約する '------------------------------------------------------------------------ Dim rng As Range '選択領域を格納します Dim a() As String '1行の値列を格納します Dim n As Integer '行数を格納します Dim x As Integer, y As Integer '選択域の左上位置を格納します Set rng = ActiveWindow.RangeSelection If rng.Columns.Count <> 2 Then MsgBox "選択列数は2列にしてください" Exit Sub End If n = rng.Rows.Count '選択域の行数を取得します x = rng.Column y = rng.Row ReDim a(2 * n - 1) '変数のサイズを列数分確保します For i = 1 To n a(2 * i - 2) = rng(i, 1) 'i行の値を取得します a(2 * i - 1) = rng(i, 2) Cells(y + i - 1, x).Value = "" 'i行の内容を消去します Cells(y + i - 1, x + 1).Value = "" Next For i = 1 To n Cells(y, x + 2 * i - 2) = a(2 * i - 2) Cells(y, x + 2 * i - 1) = a(2 * i - 1) Next Range(Cells(y, x), Cells(y, x + 2 * n - 1)).Select End Sub

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.5

一例です。 Sub Macrox()   col_offset = 0   Range("A1").Select   Do Until ActiveCell.Value = ""     ActiveCell.Resize(1, 2).Select     Selection.Cut     ActiveCell.Offset(col_offset, col_offset * -2).Select     ActiveSheet.Paste     Application.CutCopyMode = False     ActiveCell.Offset(col_offset * -1).Select     col_offset = col_offset + 1     ActiveCell.Offset(0, col_offset * 2).Select   Loop   Range("A1").Select End Sub

pk88
質問者

お礼

みなさまありがとうございます。 パソコンに疎いので全てをすぐには理解できませんでしたが 参考にさせていただきます。 当面はOFFSET関数を用いた方法で処理してみます。 縦から横への返還も今後必要になってきますが 自分でやってみます。 どうしても分からなかったらまたお伺いするかもしれませんが よろしくお願いいたします。 それまではしばらく回答を開けておきます。 ありがとうございました。

  • qualheart
  • ベストアンサー率41% (1451/3486)
回答No.4

以下のマクロを登録し実行してみてください。 Sub Macro1() n = 1 Do Until Cells(1, n * 2) = "" Cells(n, 1).Value = Cells(1, n * 2 - 1) Cells(n, 2).Value = Cells(1, n * 2) n = n + 1 Loop Range(Cells(1, 3), Cells(1, n * 2)).Delete End Sub 2列セットの右側セル(2の倍数の列の上段セル)が空白である時点で処理を終了しますので、途中に空白セルがないことを前提にしています。 ちなみに値のみの入れ替えなので、セル書式等はコピーされません。 セル書式を含めて移動したい場合は、カット→ペースト処理に変えれば簡単にできます。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

「置換」と「オートフィル」を使う方法です。 (1)、下記のように、セル参照式を絶対参照で入力 A2に、=$C$1 B2に、 =$D$1 (2)、Excelのオプションで「R1C1参照形式を使用する」に設定 =R1C3 =R1C4 (3)、数式を文字列にする = を # に書換える #R1C3 #R1C4 (4)、A2をフィルコピー #R1C3 #R1C4 #R1C4 #R1C5 #R1C6 #R1C7 #R1C8 (5)、B2をフィルコピー #R1C3 #R1C4 #R1C4 #R1C5 #R1C5 #R1C6 #R1C6 #R1C7 #R1C7 #R1C8 #R1C8 #R1C9 (6)、A、B列を選択 (7)、編集メニューの「置換」で # を = に「すべて置換」 (8)、必要なら「形式を選択して貼り付け」の「値」で貼り付ける。 (9)、Excelのオプションを元の設定に戻す。 といった手順を試してください。

  • come2
  • ベストアンサー率32% (594/1811)
回答No.1

補足です 入れ替わってないように見えるのですが    A B C 1 A1 B1 C1 2 A2 B2 B3 これがどうなればいいのでしょうか?

pk88
質問者

補足

早速の回答ありがとうございます。 横一列に並んだ文字を隣り合う二つのセルを一単位として縦に並べる方法(その逆も)を知りたいです。 具体例を用いると次のようにしたいです。 A1B1C1D1E1F1G1H1・・・ → A1B1 C1D1 E1F1 G1H1 ・・・ 質問の仕方が悪かったですね・すみません・・・。 

関連するQ&A