VBAで行を移動する方法|Insert/Destinationで挿入・上書きする

今回の目標

この記事では、一行を移動して挿入・上書きする方法や、複数行を移動して挿入・上書きする方法を解説します。

目標リスト

  • 一行を移動して挿入・上書きできるようになる
  • 複数行を移動して挿入・上書きできるようになる

行を切り取って別の位置に挿入する

基本形と挙動

行を切り取って別の位置に挿入する場合、Rows オブジェクトの Cut メソッドで、指定した行を切り取れます(複数の行も指定可能です)。
切り取った状態で、Rows オブジェクトの Insert メソッドを使用すると指定した行に挿入することができます。

Rows("切り取り元の行").Cut
Rows("挿入先の行").Insert

注意点

注意点が2つあります。これを忘れてしまうと実行時エラーや想定外の処理をしてしまいます。

1. 切り取る行と挿入する行は異なる行を指定する

切り取り元と挿入先の行範囲が重なっていると、[実行時エラー 1004] が発生します。 複数行を切り取る場合も、挿入先に元の行範囲と重なる行が1つでも含まれていると同様にエラーになります。

2. Insert メソッドの前に Cut メソッドを使用する

Cut メソッドを使用せずに、Insert メソッドのみ使用すると空の行が挿入されます。
行を切り取る場合は、Cut メソッドを忘れず使用してください。

一行を切り取って別の行へ挿入する

Rows オブジェクトの Cut メソッド及び、Insert メソッドを使用します。
下のサンプルコードでは、5行目のレコードを切り取って、2行目に挿入します。

サンプルコード

Sub CutInsertRows1()
    '5行目を切り取る(まだデータは移動しない)
    Rows("5").Cut
    '5行目を2行目に挿入する
    Rows("2").Insert
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

複数行を切り取って別の行へ挿入する

Rows オブジェクトの Cut メソッドを使用する際、複数行を指定すると複数の行を切り取ることができます。 なお、挿入先は、上端になる行だけを指定します。
下のサンプルでは、4~5行目を1行目に移動します。

サンプルコード

Sub CutInsertRows2()
    '4~5行目を切り取る(まだデータは移動しない)
    Rows("4:5").Cut
    '4~5行目を1行目に挿入する
    Rows("1").Insert
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

[実行時エラー1004] この選択は適切ではありません について

切り取り元と挿入先の行範囲が重なると、[実行時エラー 1004] が発生します。 複数行を切り取る場合も、挿入先に元の行範囲と重なる行が1つでも含まれていれば同様にエラーになります。

サンプルコード1(エラーが発生します)

切り取り元と挿入先が同じ行の場合、実行時エラー1004 が発生します。 下のサンプルでは、切り取り元を2行目、挿入先も2行目を指定したため、エラーが発生します。
Sub CutInsertRows1_BAD()
    Rows("2").Cut
    Rows("2").Insert
End Sub
【実行結果】
(下の画像のようになります)
プログラム実列後の画像

サンプルコード2(エラーが発生します)

切り取り元が複数の行の時、その指定範囲内に挿入先を指定すると、実行時エラー1004 が発生します。 下のサンプルでは、2行目から4行目を切り取って、挿入先の行を3行目に指定したため、エラーが発生します。 ※2行目から4行目を切り取ったため、挿入先の行を、2,3,4行目のいずれかにするとエラーとなる
Sub CutInsertRows2_BAD()
    Rows("2:4").Cut
    Rows("3").Insert
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

行を切り取って、移動先の行に上書きする

基本形と挙動

行を切り取って別の行に上書きして移動する場合、Rows オブジェクトの Cut メソッドに Destination 引数を指定することで、切り取り元と貼り付け先の行を指定します(複数の行を指定可能です)。 Destination に指定した行には、切り取った行の内容が上書きされるため、貼り付け先の元のデータは削除され、行数は増減しません。

Rows("切り取り元の行").Cut Destination:=Rows("貼り付け先の行")

一行を切り取って別の行に上書きする

Rows オブジェクトで行範囲を指定して Cut メソッドと Destination 引数を使用します。 下のサンプルでは、2行目のレコードを切り取って、4行目に上書きしています。

サンプルコード

Sub CutDestinationRows1()
    Rows("2").Cut Destination:=Rows("4")
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

複数行を切り取って別の行に上書きする

複数行を切り取って別の行に上書きする場合も同様に、Rows オブジェクトで行範囲を指定して Cut メソッドと Destination 引数を使用します。 下のサンプルでは、3~4行目を切り取り、2~3行目に上書きしています。

サンプルコード

Sub CutDestinationRows2()
    Rows("3:4").Cut Destination:=Rows("2:3")
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

[実行時エラー 1004]切り取り領域と貼り付け領域のサイズが違う

切り取り元の行数より、貼り付け先の行数が少ない場合、[実行時エラー 1004] が発生します。
例えば、切り取り元の行が2~3行目のとき、貼り付け先の行を4行目のみ指定するとエラーとなります。 この例の場合、貼り付け先の行を4~5行目にするとエラーが解消できます。

サンプルコード

Sub CutDestinationRows_BAD()
    'Rows("2:3").Cut Destination:=Rows("4:5") なら、OK
    Rows("2:3").Cut Destination:=Rows("4")
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

Rows の代わりに Range を使用する

基本形と挙動

Rows を使用せず、Range でも行の切り取りができます。
Rows と同様に、Cut メソッドおよび Insert メソッドで行を切り取って挿入できます。 Cut メソッドに Destination 引数を指定することで、行を切り取って上書きできます。

データ切り取り後、移動先へ挿入する

Range の Cut メソッドおよび、Insert メソッドで行を切り取って挿入できます。 下のサンプルコードでは、5行目のレコードを2行目に挿入します(CutInsertRows1プロシージャと同じ出力結果となります)。

サンプルコード

Sub CutInsertRange_R()
    Range("5:5").Cut
    Range("2:2").Insert
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

データ切り取り後、移動先の行に上書きする

Range の Cut メソッドと、Cut メソッドの Destination 引数を指定することで行を切り取って上書きできます。 下のサンプルでは、3~4行目を切り取り、2~3行目に上書きしています(CutDestinationRows2プロシージャと同じ出力結果になります)。

サンプルコード

Sub CutDestinationRange_R()
    Range("3:4").Cut Destination:=Range("2:3")
End Sub
【実行結果】
(下の画像のようになります)
プログラム実行後の画像

関連リンク

ページの先頭へ