VBAで列を移動する方法|Insert/Destinationで挿入・上書きする
今回の目標
この記事では、一列を移動して挿入・上書きする方法や、複数列を移動して挿入・上書きする方法を解説します。
目標リスト
- 一列を移動して挿入・上書きできるようになる
- 複数列を移動して挿入・上書きできるようになる
列を切り取って別の位置に挿入する
基本形と挙動
列を切り取って別の位置に挿入する場合、Columns オブジェクトの Cut メソッドで、指定した列を切り取れます(複数の列も指定可能です)。
切り取った状態で、Columns オブジェクトの Insert メソッドを使用すると指定した列に挿入することができます。
Columns("切り取り元の列").Cut
Columns("挿入先の列").Insert
注意点
注意点が2つあります。これを忘れてしまうと実行時エラーや想定外の処理をしてしまいます。
1. 切り取る列と挿入する列は異なる列を指定する
切り取り元の列と挿入先の列が重なる場合、[実行時エラー 1004] が発生します。
複数列を切り取った場合も、挿入先に元の列範囲と重なる列が1つでも含まれていると同様にエラーになります。
2. Insert メソッドの前に Cut メソッドを使用する
Cut メソッドを使用せずに、Insert メソッドのみ使用すると空の列が挿入されます。
列を切り取る場合は、Cut メソッドを忘れず使用してください。
一列を切り取って別の列へ挿入する
Columns オブジェクトの Cut メソッド及び、Insert メソッドを使用します。
下のサンプルコードでは、E列を切り取って、B列に挿入します。
サンプルコード
Sub CutInsertColumns1()
'E列を切り取る(まだデータは移動しない)
Columns("E").Cut
'E列をB列に挿入する
Columns("B").Insert
End Sub
(下の画像のようになります)
複数列を切り取って別の列へ挿入する
Columns オブジェクトの Cut メソッドを使用する際、複数列を指定すると複数の列を切り取ることができます。
なお、挿入先は、左端になる列だけを指定します。
下のサンプルでは、D~E列をA列に移動します。
サンプルコード
Sub CutInsertColumns2()
'D~E列を切り取る(まだデータは移動しない)
Columns("D:E").Cut
'D~E列をA列に挿入する
Columns("A").Insert
End Sub
(下の画像のようになります)
[実行時エラー1004] この選択は適切ではありません について
切り取り元と挿入先の列範囲が重なると、[実行時エラー 1004] が発生します。
複数列の場合も、挿入先に元の列と重なる列が1つでもあればエラーになります。
サンプルコード1(エラーが発生します)
切り取り元と挿入先が同じ列の場合、[実行時エラー1004] が発生します。 下のサンプルでは、切り取り元をB列、挿入先もB列を指定したため、エラーが発生します。Sub CutInsertColumns1_BAD()
Columns("B").Cut
Columns("B").Insert
End Sub
(下の画像のようになります)
サンプルコード2(エラーが発生します)
切り取り元が複数の列の時、その指定範囲内に挿入先を指定すると、実行時エラー1004 が発生します。 下のサンプルでは、B列からD列を切り取って、挿入先の列をC列に指定したため、エラーが発生します。 ※B列からD列を切り取ったため、挿入先の列を、B,C,D列のいずれかにするとエラーとなるSub CutInsertColumns2_BAD()
Columns("B:D").Cut
Columns("C").Insert
End Sub
(下の画像のようになります)
列を切り取って、移動先の列に上書きする
基本形と挙動
列を切り取って別の列に上書きして移動する場合、Columns オブジェクトの Cut メソッドに Destination 引数を指定することで、切り取り元と貼り付け先の列を指定します(複数の列を指定可能です)。 Destination に指定した列には、切り取った列の内容が上書きされるため、貼り付け先の元のデータは削除され、列数は増減しません。
Columns("切り取り元の列").Cut Destination:=Columns("貼り付け先の列")
一列を切り取って別の列に上書きする
Columns オブジェクトで列範囲を指定して Cut メソッドと Destination 引数を使用します。 下のサンプルコードでは、B列を切り取って、D列に上書きしています。
サンプルコード
Sub CutDestinationColumns1()
Columns("B").Cut Destination:=Columns("D")
End Sub
(下の画像のようになります)
複数列を切り取って別の列に上書きする
複数列を切り取って別の列に上書きする場合も同様に、Columns オブジェクトで列範囲を指定して Cut メソッドと Destination 引数を使用します。 下のサンプルでは、C~D列を切り取り、B~C列に上書きしています。
サンプルコード
Sub CutDestinationColumns2()
Columns("C:D").Cut Destination:=Columns("B:C")
End Sub
(下の画像のようになります)
[実行時エラー 1004]切り取り領域と貼り付け領域のサイズが違う
切り取り元の列数より、貼り付け先の列数が少ない場合、[実行時エラー 1004] が発生します。
例えば、切り取り元の列がB~C列のとき、貼り付け先の列をE列のみ指定するとエラーとなります。
この例の場合、貼り付け先の列をD~E列にするとエラーが解消できます。
サンプルコード
Sub CutDestinationColumns_BAD()
'Columns("B:C").Cut Destination:=Columns("D:E") なら、OK
Columns("B:C").Cut Destination:=Columns("D")
End Sub
(下の画像のようになります)
Columns の代わりに Range を使用する
基本形と挙動
Columns を使用せず、Range でも列の切り取りができます。
Columns と同様に、Cut メソッドおよび Insert メソッドで列を切り取って挿入できます。
Cut メソッドに Destination 引数を指定することで、列を切り取って上書きできます。
データ切り取り後、移動先へ挿入する
Range の Cut メソッドおよび、Insert メソッドで列を切り取って挿入できます。 下のサンプルコードでは、E列を切り取って、B列に挿入します(CutInsertColumns1プロシージャと同じ出力結果となります)。
サンプルコード
Sub CutInsertRange_R()
Range("E:E").Cut
Range("B:B").Insert
End Sub
(下の画像のようになります)
データ切り取り後、移動先の列に上書きする
Range の Cut メソッドと、Cut メソッドの Destination 引数を指定することで列を切り取って上書きできます。 下のサンプルでは、C~D列を切り取り、B~C列に上書きしています(CutDestinationColumns2プロシージャと同じ出力結果になります)。
サンプルコード
Sub CutDestinationRange_R()
Range("C:D").Cut Destination:=Range("B:C")
End Sub
(下の画像のようになります)
