VBA

【VBA初心者向け】セル、行、列を挿入するInsertメソッドの使い方

記事内に商品プロモーションを含む場合があります

このページでわかること

行、列、セルにVBAで挿入する方法がわかります。

覚えること
  1. 【Rowsオブジェクト or Columnsオブジェクト or Rangeオブジェクト】.Insert(Shift, CopyOrigin)
  2. 行の挿入
    1行だけ:Rows(行番号).Insert
    複数行:Range(“行番号:行番号”).Insert
  3. 列の挿入
    一列だけ:
     Columns(列番号).Insert
     Columns(“列のアルファベット”).Insert
    複数行:
     Columns(“列のアルファベット:列のアルファベット”).Insert
  4. 行・列とセルで考え方が違う
    行・列は引数のShiftは使わない
    セルは引数のShiftは必須
  5. 引数CopyOriginは書式をコピーする方向を指定する
    省略すれば左もしくは上のセルの書式をコピー

こんにちは、hokkyokunです。
VBAを使う方は必須のスキルです。

案外慣れた人も知らない使い方あるかもしれませんどうぞ

構文

構文:【Rowsオブジェクト or Columnsオブジェクト or Rangeオブジェクト】.Insert(Shift, CopyOrigin)

引数は二つです。
Shift:挿入後どちら方向に移動するか
 xlDown:下に移動
 xlToRight:右に移動
CopyOrigin:挿入後のセルのフォーマットをどちらのセルを参照にするかを決めます。
 xlFormatFromRightOrBelow:挿入したセルの下もしくは右のセルの書式を参照する
 xlFormatFromLeftOrAbove:挿入したセルの上もしくは左のセルの書式を参照する

とりあえずの使い方(ここだけ読めば使い方OK)

行の挿入

1行だけ:Rows(行番号).Insert
複数行:Range("行番号:行番号").Insert

例えば挿入する行が

10行目→Rows(10).Insert
10行目から12行目→Range(“10:12”).Insert
10行目と15行目と16行目→Union(Rows(10), Range(“15:16”)).Insert

Rowsの場合は番号指定に「”」はいらないですが、Rangeの場合は「”」が必要なので注意してください。

飛び飛びで行を指定したい場合はUnionを使ってそれぞれの行を指定してつなげることが出来ます。
Union(セル範囲,セル範囲,セル範囲, ……)と無限につなげられます。

挿入した行の書式はデフォルトの場合、その上の行と同じになります。
指定の方法後述いたします。

列の挿入

一列だけ:Columns(列番号).Insert
     Columns("列のアルファベット").Insert
複数行:Columns("列のアルファベット:列のアルファベット").Insert

例えば挿入する列が

5列目→Columns(5).Insert または Columns(“E”).Insert
5列目から7列目→Columns(“E:G”).Insert または Range(Columns(5), Columns(7)).Insert
5列目と7列目から9列目→Union(Columns(5), Range(Columns(7), Columns(9))).Insert
          またはUnion(Columns(“E”), Columns(“G:I”)).Insert

Columnsは番号で指定もできますし、アルファベットで指定も出来ます(その際、「”」を付けます)

複数列をしている場合、行のように「5:7」みたいなかたちが取れません。
「E:G」みたいな形で指定することになります。

番号で指定したいときは Range(Columns(5), Columns(7))みたいな形で指定する必要があります。

挿入した列の書式はデフォルトの場合、その左の列と同じになります。
指定の方法後述いたします。

セルの挿入

セルの挿入は少し面倒です。
引数Shiftで挿入の方向を指定してください。

単独、複数両方:Range(セル範囲).Insert Shift:=xlDown または xlToRight

例えばセルを下に移動させる場合
B8→Range(“B8”).Insert shift:=xlDown
B8からB10まで→Range(“B8:B10”).Insert shift:=xlDown
B8とB10→Union(Range(“B8”), Range(“B10”)).Insert shift:=xlDown

RangeはCellsでも大丈夫です。
数値で扱いたい場合はCellsを使い、
直感的に位置を把握したいならRangeの方がいいかと思います。

変数で操作するならCellsの方が楽です。

引数Shiftは必ず指定するようにしましょう。
入れなくても動きますが、下にずれるのか右にずれるのか表や挿入するセル範囲により変わってきます。
意図しない動き方をする場合がありますので注意しましょう。

引数について

上記でとりあえず実務で使う方法はほぼできるんじゃないかと思います。
次に引数についての考え方を整理したいと思います。

Shiftは行・列の挿入か、セルの挿入かで考え方が変わる

結論申し上げます。
行・列挿入はShift一切関係ありません。
全く考えなくていいです。
一方、セルの挿入は必須です。

実験してみます。

こんな感じで表を作ったとします。

Sub test1()
ActiveSheet.Rows(11).Insert shift:=xlToRight

End Sub

Sub test2()
ActiveSheet.Rows(11).Insert shift:=xlDown

End Sub

test1とtest2でプログラミングを動かしてみました。

どちらも同じ結果です。
同じ結果なので省略してまとめてお見せします。
下記のようになります。

CopyOrigin は書式のずれが気になるようであれば使いましょう。

CopyOriginは挿入した行・列・セル範囲の書式を
その範囲の左もしくは上と一緒にするか、
右もしくは下と一緒にするか指定することが出来ます。
デフォルトは左もしくは上と一緒にするです。

もしマクロを書いていてずれが気になるようであれば引数で入れてみるといいかもしれないです。
コード量を抑えることも出来ますし。

実験してみます。

下記のような表を作ったとし、
7行目は「文字列」
8行目は「数値」
9行目は「パーセント」という書式になっています。

ここで8行目に行を挿入し、CopyOriginを変えて変化を観察してみます。

引数を指定し、xlFormatFromRightOrBelowの場合

Sub 行挿入xlFormatFromRightOrBelow()

ActiveSheet.Rows(8).Insert copyorigin:=xlFormatFromRightOrBelow

End Sub

引数を指定し、xlFormatFromLeftOrAboveの場合

Sub 行挿入xlFormatFromLeftOrAbove()

ActiveSheet.Rows(8).Insert copyorigin:=xlFormatFromLeftOrAbove

End Sub

引数を指定しない場合

Sub 行挿入_引数無し()

ActiveSheet.Rows(8).Insert

End Sub

知っておくと便利ですが、
NumberFormatLocalとかを使って指定するのでも充分対応はできると思います。
頻繁に挿入する場合や、コード量を減らして、メンテナンスしやすくしたいのであれば一考ください。

まとめ