(マクロ)カット&ペーストを列毎に繰り返したい

このQ&Aのポイント
  • Excelのマクロを使用して、列ごとにデータをカットして別の列にペーストする作業を自動化したいです。
  • 現在のマクロでは無限ループになってしまうため、正しく動作するように修正する方法を知りたいです。
  • 実現したいイメージは、B列から順にデータをカットし、A列の最終行の下にペーストすることを、各列ごとに50列目まで繰り返すことです。
回答を見る
  • ベストアンサー

(マクロ)カット&ペーストを列毎に繰り返したい

下のように、A列から50列目までデータが入力されています。 各列、データは上から順に詰まっている状態です。 C列のように1つもデータが入力されていない列もあります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z003 Z004 Z002 Z005 ------------------------------------------ これを、「B列から順にデータをカットして、A列最終行の下にペーストする」という作業を、各列毎に50列目まで繰り返したいと思っています。 完成イメージは下記のようになります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z002 Z003 Z004 Z005 ------------------------------------------ 下記のようにマクロを組みましたが、無限ループになっているのか、強制終了となってしまいます。 どういうふうにマクロを組めばいいのでしょうか? 宜しくご教授お願いいたします。 Sub ADD() Dim i, j As Long For j = 2 To 50 '列番号指定 'B列1行目から順にセルが空白でなければカットする。 i = 1 Do While Cells(i, j).Value <> Empty Cells(i, j).Select Selection.Cut 'A列の最終行の1つ下の行に貼り付ける。。 Range("A1").Select Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select ActiveSheet.Paste i = i + 1 Loop Next End Sub

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! 横からお邪魔します。 Sub test() Dim i, j As Long For j = 2 To Cells(1, Columns.Count).End(xlToLeft).Column For i = 1 To Cells(Rows.Count, j).End(xlUp).Row If Cells(i, j) <> "" Then Cells(i, j).Cut Destination:=Cells(Rows.Count, 1).End(xlUp).Offset(1) End If Next i Next j End Sub 列数が50列と決まっているのであれば > For j = 2 To Cells(1, Columns.Count).End(xlToLeft).Column の行を > For j = 2 To 50 に訂正してください。 ※ このコードですと、質問にあるように001・002・003・004・005 の順ではなく、005・004の順が逆になりますが・・・ こんな感じで良いのでしょうか?m(_ _)m

myn735
質問者

お礼

ありがとうございます!完璧でした!

その他の回答 (3)

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.4

文字通り、列毎に繰り返します。 Sub test() Dim i As Long For i = 2 To Cells(1, Columns.Count).End(xlToLeft).Column   If Cells(1, i) <> "" Then     Range(Cells(1, i), Cells(Rows.Count, i).End(xlUp)).Cut Destination:=Cells(Rows.Count, 1).End(xlUp).Offset(1)   End If Next End Sub

myn735
質問者

お礼

ありがとうございます!解決できました。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

>Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select では、A1のセルから、A列の最終行の1つ下までの範囲を範囲選択してしまいます。 Selection.End(xlDown).Offset(1, 0).Select です。 御提示のコードでは、B1→B2→C1・・という順序になってしまうので、行方向に対して最初にループすればよろしいかと思います。 Sub ADD() Dim i As Long, j As Long, r As Long 'B列の最終行を求める r = Range("B" & Rows.Count).End(xlUp).Row For i = 1 To r For j = 2 To 50 '列番号指定 Do While Cells(i, j).Value <> Empty 'B列1行目から順にセルが空白でなければカットする。 Cells(i, j).Select Selection.Cut 'A列の最終行の1つ下の行に貼り付ける。。 Range("A1").Select Selection.End(xlDown).Offset(1, 0).Select ActiveSheet.Paste Loop Next Next End Sub

myn735
質問者

お礼

ご回答ありがとうございます!マクロ動きました! 私の質問で、処理前のデータの状態がわかりずらくて大変申し訳なかったのですが、 処理前のデータは、A列から50列目まで下のような形でデータが入っております。 ------------------------------------------ A列  B列  C列 ・・・ Z    Z    Z   Z         Z           Z   ------------------------------------------ 上の例ですと、A列は2行目まで、B列は1行目まで、C列は3行目までデータが入っていますが、実際は、各列ともに何行目までデータが入っているか不明なのです(但し、A列には必ず何行かデータが入っています)。 というわけでして、ご教授いただいた、 r = Range("B" & Rows.Count).End(xlUp).Row ですと、B列より他の列の方がデータの行数が多い場合には上手くいきませんでした。。 試行錯誤で、 r = Cells(Rows.Count, j).End(xlUp).Row などとしてみましたが、エラーとなってしまいました。。 お手数おかけしますが、こちら、ご教授頂けたらと思います。 どうぞよろしくお願いいたします。

回答No.1

Range("A1").Select およびその下の Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select がそもそも間違っていませんか? 目的に沿うようにするのであれば、例えば Range("A65536").Select Range(Selection, Selection.End(xlUp).Offset(1, 0)).Select として実行してみてください。

myn735
質問者

お礼

早々のご回答ありがとうございました!ご指摘どおりでした。ありがとうございます。

関連するQ&A

  • カット&ペーストのマクロ(エクセル)

    Sub test()  R = Selection.Row  C = Selection.Column   Range(Cells(R , C), Cells(R + 100, C)).Select   Selection.Cut   Cells(R + 1, C).Select   ActiveSheet.Paste End Sub 上記マクロは、アクティブセルから100行下までの範囲で"切り取り"を実行し、一行下のセルに"貼付け"を行います。 上記の処理を、複数のセルが選択されている時は、複数回カット&ペーストが行われるように変更したいのですが。 (選択されるセルは必ず同一列内の連番になります) (選択内で一番上のセルとその上のセルは連続したままになり、選択内で一番下のセルとその下のセルも同様になります) A1 a A2 b A3 c A4 d A5 e A6 f A7 g A8 h A9 i 上記でA3:A6を選択して実行すると、以下の結果になります。 A1 a A2 b A3 c A4 A5 d A6 A7 e A8  A9 f A10 g A11 h A12 i 最初のマクロをどのように変えればいいでしょうか?

  • このマクロ、どこがおかしいですか?

    i5とj5のセルの文字が同じ場合はセル同士を結合して一つ下の行へ行き、i5とj5のセルに何も書かれていないときはそのまま一つ下の列へ行き、行った先のセルでも同じように処理(i6とj6のセルの文字が同じ場合はセル同士を結合して一つ下の行へ行き、i6とj6のセルに何も書かれていないときはそのまま一つ下の列へ行き)を繰り返し、と言うことをi33とj33のセルまで続けたいと思っています。 Sub よろしくお願いします() Dim i As Integer For i = 5 To 33 Cells(i, 9).Select If Cells(i, 9).Value = Cells(i, 10).Value Then Range(Cells(i, 9), Cells(i, 10)).Merge Selection.Offset(i + 1).Select ElseIf Cells(i, 9).Value = "" Then Selection.Offset(i + 1).Select Next i End If End Sub と書いたのですが、『Nextに対応するForがありません』と言われてしまいます。どうすれば思い通りにできるでしょうか? 極めて初心者で、伝わりにくい点があるかもしれません。よろしくお願いします。

  • エクセルマクロで行を変えて千回カット&ぺースト

    下記のコードでB,C,D・・・と行を1,000回変えて同じ作業をしたいのですが、どのようにしたらよいか分かりません。 どなたかお詳しい方アドバイスをお願いします。 Range("A18:A32").Select Selection.Cut Destination:=Range("B3:B17") ←B,C,D・・と変えてカットしたい。 Rows("18:32").Select Selection.Delete Shift:=xlUp Range("A18:A32").Select Selection.Cut Destination:=Range("C3:C17") Rows("18:32").Select Selection.Delete Shift:=xlUp Range("A18:A32").Select Selection.Cut Destination:=Range("D3:D17") Range("D3:D17").Select End Sub

  • マクロについて

    マクロ初心者です。 下記の操作をマクロで行いたいのですがうまくいかないのでどうすればうまくマクロが作動するのか教えて頂ければと思います。4の操作までは正しく作動しましたが5以降に困っています。。。 どなたかお願いしますmm (1) A列にフィルターをかけて[??????}を含むものを選択 (2). 1に.該当するもB列のDataを値のみ数値と値のClear (3) 2の後に再びA列で[??????]を含まないものを選択 (4)  3に該当するA列のDataを数値と値のClear (5)  4の操作で空白となったセルに=上のセルという計算式の指示を出す (6) すべて値貼り付けをし、空白のセルを削除する ※Dataの行数は毎回作業時に変更があります。 ※Dataは数値だけではなく文字列も含んでいます 失敗したマクロ--------------------------------------------- Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:="=*[??????]*", Operator:=xlAnd Columns("B:B").Select Selection.ClearContents Selection.AutoFilter Field:=1, Criteria1:="<>*[??????]*", Operator:=xlAnd Columns("A:A").Select Selection.ClearContents For i = 3 To [A65536].End(xlUp).Row If Cells(i, "A") = "" Then Cells(i - 1, "A").Copy Cells(i, "A") Next i End Sub -----------------------------------------------------------

  • マクロについて

    マクロ初心者です。 下記の操作をマクロで行いたいのですがうまくいかないのでどうすればうまくマクロが作動するのか教えて頂ければと思います。4の操作までは正しく作動しましたが5以降に困っています。。。 どなたかお願いしますmm (1) A列にフィルターをかけて[??????}を含むものを選択 (2). 1に.該当するもB列のDataを値のみ数値と値のClear (3) 2の後に再びA列で[??????]を含まないものを選択 (4)  3に該当するA列のDataを数値と値のClear (5)  4の操作で空白となったセルに=上のセルという計算式の指示を出す (6) すべて値貼り付けをし、空白のセルを削除する ※Dataの行数は毎回作業時に変更があります。 ※Dataは数値だけではなく文字列も含んでいます 失敗したマクロ--------------------------------------------- Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:="=*[??????]*", Operator:=xlAnd Columns("B:B").Select Selection.ClearContents Selection.AutoFilter Field:=1, Criteria1:="<>*[??????]*", Operator:=xlAnd Columns("A:A").Select Selection.ClearContents For i = 3 To [A65536].End(xlUp).Row If Cells(i, "A") = "" Then Cells(i - 1, "A").Copy Cells(i, "A") Next i End Sub -----------------------------------------------------------

  • VBA 右端列の削除

    このたび初めて質問させていただきます。 周囲にVBAを扱うひとがいないため、初歩的(たぶん?)な質問をさせてください。 以下のようなマクロを記録したのですが、一部を編集したいと考えております。 Columns("F:H").Select Selection.Insert Shift:=xlToRight Columns("A:B").Select Selection.Cut Range("F1").Select ActiveSheet.Paste Columns("J:J").Select→J列固定ではなく右端の列と設定したい。 Selection.Cut Range("H1").Select ActiveSheet.Paste Columns("A:B").Select Selection.Delete Shift:=xlToLeft Columns("J:J").SelectをJ列固定ではなく右端の列を1列設定し切り取りがしたいのです。Range("A2").End(xlToRight).Select ActiveCell.Offset(-1,0).End(xlDown).Select と書き換えてみたのですが、うまく作動しませんでした。 どなたか教えていただけませんでしょうか?

  • マクロの編集方法を教えて下さい。

    自分で記録したマクロを親切な方に編集してもらいました。実行スピードが格段に速くなったのですが、さらに処理したい項目が出来たので、別に記録してコピー、適切な箇所に挿入したのですが、実行時エラーが出ます。どう直していいのか分かりません。分かる方教えて下さい。 Sub Incert12() Dim wRow As Long Dim i As Integer Dim tbl(1 To 12, 1 To 1) As Integer wRow = Range("A65536").End(xlUp).Row Rows(CStr(wRow) & ":" & CStr(wRow + 11)).Insert Range(Cells(wRow + 1, "B"), Cells(wRow + 11, "B")).FormulaR1C1 = "=R[-1]C" '↑(1)これの代わりにB列を12行全て結合したい For i = 1 To 12 tbl(i, 1) = i Next i Range(Cells(wRow, "C"), Cells(wRow + 11, "C")).Value = tbl '↑(2)これに加えてA列に以下の処理も加えたい 'ActiveCell.Offset(-2, -8).Range("A1").Select 'ActiveCell.FormulaR1C1 = "=R[-1]C+1" 'ActiveCell.Select 'Selection.AutoFill Destination:=ActiveCell.Range("A1:A12"), Type:= _ ' xlFillDefault 'ActiveCell.Range("A1:A12").Select '↓(3)F列ではなく、FからK列までにしたい。 Cells(wRow + 12, "F").AutoFill Range(Cells(wRow, "F"), Cells(wRow + 12, "F")) 'これが私が作ったマクロ。(2行目に問題ありとの事) 'ActiveCell.Offset(-1, 5).Range("A1:F1").Select 'Selection.AutoFill Destination:=ActiveCell.Range("A1:F13"), Type:= _ ’ xlFillDefault 'ActiveCell.Range("A1:F13").Select Cells(wRow, 1).Select End Sub 以上(1)~(3)を直したいのです。どなたかよろしくお願い致します。

  • excelマクロについて

    下記のマクロを実行したときに、Sheets("提供データ")のD列の7327行目はブランクなのに、Sheets("jyoken")のa列の7326行目に計算式がコーピされるのはなぜでしょうか。 ちなみにSheets("jyoken")のa列の2行目に=提供データ!D3という計算式 が入っています。 Sheets("jyoken")のa列の7326行目には計算式がコーピしないようにするにはどこを修正すればよいのでしょうか教えてください。 Sub 式複写() Dim gyo, burank ActiveWorkbook.PrecisionAsDisplayed = False Sheets("提供データ").Select Range("a2").Select gyo = 2 burank = "" Do gyo = gyo + 1 burank = Worksheets("提供データ").Cells(gyo, 4).Text Loop While burank <> "" ' Sheets("jyoken").Select Range("A2").Select Selection.Copy Range(Cells(3, 1), Cells(gyo - 1, 1)).Select '複写先 ActiveSheet.Paste End Sub

  • エクセルのVBA

    AB列に複数行データがありB列の条件でその行のABのデータ を抽出し特定の場所に貼り付けたいのですが貼付け場所が 任意に選択できません。今はデータの無いA列から貼り付けていますが できればD列の1行目か2行目から貼り付ける方法を教えてください。 また今のコードでは貼付けたいデータの順番が下のデータからになってしまいます。 これも元のデータ順にしたいのでよろしくお願いします。 今使っているコードは下記の通りです。 For i = Cells(Rows.Count, 2).End(xlUp).Row To 1 Step -1 If Cells(u, 2) < "96" And Cells(u, 2) <> "0" And Cells(u, 2) <> " " Then Range(Cells(u, 1), Cells(u, 2)).Select Selection.Copy Range("A1").End(xlDown).Offset(1, 0).Activate Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If Next

  • EXCELマクロについて

    条件 シート名提供データE列の3行目からデータが入っています。    ブランク以外のデータをコピーしてシート名WorkのC列の2行目から貼り付けたいので下記のマクロを書いていますがおかしい所 はないのでしょうか。教えてください。 いまいちCellsの使い方がわかりません。 出来たら下記の意味を教えてください。 brank = Worksheets("提供データ").Cells(gyo, 5).Text Range(Cells(3, 5), Cells(gyo, 5)).Select Sub 貼付() Dim gyo, brank Sheets("提供データ").Select Range("e3").Select gyo = 2 Do gyo = gyo + 1 brank = Worksheets("提供データ").Cells(gyo, 5).Text Loop While brank <> "" Range(Cells(3, 5), Cells(gyo, 5)).Select Selection.Copy Sheets("work").Select Range("c2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub

専門家に質問してみよう