• 締切済み

エクセル VBA 複雑な行列入れ替えコピー

VBAを使って複雑な行と列を入れ替えをしたいのですが?どなたか伝授していただけませんでしょうか?    A    B    C 1 (1) 2 (2) 3 (3) 4 (1) 5 (2) 6 (3)  ・  ・  ・ 1,000行以上あります。 これを   A    B    C 1 (1)    (2)    (3) 2 (1)    (2)    (3) 3 (1)    (2)    (3)      ・      ・      ・ という風にしたのですが・・・・ お分かりになる方よろしくお願いします。

みんなの回答

  • vba_2007
  • ベストアンサー率100% (1/1)
回答No.5

'(1)からはじまる文字列をA列に '(2)からはじまる文字列をB列に '(3)からはじまる文字列をC列に 'それ以外をD列に移動させる '念のため初期のA列情報をH列にバックアップしておく Option Option Explicit Sub main()   Dim i As Long   Dim A As String   Dim B As String   Dim C As String   Dim D As String   Dim E As String      'A列のデータ分だけループをまわす   With Excel.Application.ActiveSheet     For i = 1 To .Range("$A$65536").End(xlUp).Row       '初期化       A = ""       B = ""       C = ""       D = ""       E = ""       'A列のコピー元の行       A = "A" & i       'B~Eは、最終使用行+1(=コピー先となる空白行)       B = "B" & .Range("$B$65536").End(xlUp).Row + 1       C = "C" & .Range("$C$65536").End(xlUp).Row + 1       D = "D" & .Range("$D$65536").End(xlUp).Row + 1       E = "E" & .Range("$E$65536").End(xlUp).Row + 1              'A列の先頭3文字によってコピー先を振り分ける       'ただし、B1~E1が空白の場合でも、.End(xlUp).Row が 1 になってしまうので、       'その場合のみアドレス直指定で対処       If Mid(.Range("A:A").Cells(i, 1).Value, 1, 3) = "(1)" Then         If Range("B1") = "" Then           Range(A).Copy Range("B1")         Else           Range(A).Copy Range(B)         End If       ElseIf Mid(.Range("A:A").Cells(i, 1).Value, 1, 3) = "(2)" Then         If Range("C1") = "" Then           Range(A).Copy Range("C1")         Else           Range(A).Copy Range(C)         End If       ElseIf Mid(.Range("A:A").Cells(i, 1).Value, 1, 3) = "(3)" Then         If Range("D1") = "" Then           Range(A).Copy Range("D1")         Else           Range(A).Copy Range(D)         End If       '(1)~(3)のどれでもない場合は、E列にコピー       Else         If Range("E1") = "" Then           Range(A).Copy Range("E1")         Else           Range(A).Copy Range(E)         End If       End If     Next   End With      'A列をG列にバックアップ   Range("A:A").Copy Range("G:G")   'A列を削除   Range("A:A").Delete   MsgBox "Program End" End Sub

回答No.4

'3行ずつがセットになっていて2行目、3行目を1行目と同じ行の '列方向持ってくるというだけなら。 Sub 処理() Dim oSh As Worksheet Dim i As Long, j As Long Dim pLastRow As Long Dim pMod As Long Set oSh = Sheets("Sheet1") 'Sheet1には実際使っているシート名を入れる。 With oSh pLastRow = .Range("A" & .Rows.Count).End(xlUp).Row For i = 1 To pLastRow pMod = i Mod 3 Select Case pMod Case 0 .Range("C" & i - 2) = .Range("A" & i) Case 1 'そのまま Case 2 .Range("B" & i - 1) = .Range("A" & i) End Select Next i For i = pLastRow To 1 Step -1 If .Range("B" & i) = "" Then .Rows(i & ":" & i).Delete End If Next i End With Set oSh = Nothing End Sub

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

こんな感じで Sub test() Dim i, ii, iii Dim a a = Range("a1", Cells(Rows.Count, 1).End(xlUp).Address) Range("a1", Cells(Rows.Count, 1).End(xlUp).Address).ClearContents iii = 1 For i = 1 To UBound(a, 1) / 3 For ii = 1 To 3 Cells(i, ii) = a(iii, 1) iii = iii + 1 Next ii Next i End Sub エラー処理、アレンジはご自分で

  • hisappy
  • ベストアンサー率46% (184/392)
回答No.2

A列に並んでいるデータを単純に3つずつ並べなおすのと データの内容によって移動先が変化するのかで VBAの組み方もかわってきますが… 後者ならこんな感じでしょうか。 フローなコーディング版。 for(A1~Aの最終行)  セル内容判定   1番:B列に移動。   2番:C列に移動。   3番:D列に移動。 end for A列削除。 実際にはB、C、Dの各列での現在行管理が必要です。 エラーなデータが存在していた場合の処理も 場合によっては必要でしょう。

ryoryo1979
質問者

お礼

ありがとうございます! 素人なのでもう少し詳しく教えていただけないでしょうか? すいませんが宜しくお願い致します。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

B1 =INDIRECT("$A"&(ROW()-1)*3+(COLUMN()-1)) でD1まで右にフィルコピー。 B1~D1選択で下にフィルコピー。 B~D列コピー・B1をクリックし形式を選択して貼り付けで値を選択。 と言う方法もあります。

ryoryo1979
質問者

お礼

ありがとうございます! 素人なのでもう少し詳しく教えていただけないでしょうか? すいませんが宜しくお願い致します。