TL;DR — 列や行を 丸ごと 挿入・削除するのは、シフトの仕方が一通りしかないので安全です。部分的 な 範囲を挿入・削除した瞬間 —
Range("B2:D3").Insert— 正当な方向が二つあるので、どちらかを言わなけ ればなりません。InsertならShift:=xlShiftDownかxlShiftToRight、DeleteならxlShiftUpかxlShiftToLeftです。Shiftを省くと Excel は範囲の形から 推測 し、その推測が外れると、エラーも出 さずに隣のセルを間違った方向へずらします。
Sub OpenGapForNote()
' 2x3 のブロックを下へ押して場所を空ける - 方向を明示し、Excel に推測させない
Range("B2:D3").Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbove
End Sub
Sub CloseGap()
Range("B2:D3").Delete Shift:=xlShiftUp ' 下のブロックを引き上げて隙間を埋める
End Sub
これは、列全体 や 行全体 に使うのと同じ
Insert と Delete です — ただ、行や列の全体ではなく部分的な範囲に向けているだけです。この部分的なケ
ースが見えると、全体像がしっくりきます。行や列の全体に対する操作は、シフトの方向が強制される 特別で安
全なケース にすぎないのです。それ以外のあらゆる場面で、方向は選択であり、バグが棲むのはその選択の中で
す。
この記事で学べること
- 考え方の軸 — 部分的な範囲には正当なシフト方向が二つあるので、どちらかを選ばなければならない
- なぜ行や列の全体は「そのまま動く」のか — シフトが強制され、間違えようがない
- 一番多いバグ —
Shiftを省いて、Excel に範囲の形から推測させてしまう - 正確な定数 — Insert には
xlShiftDown/xlShiftToRight、Delete にはxlShiftUp/xlShiftToLeft - 部分的な挿入が正しいとき、そして本当は行全体が欲しかったとき
考え方の軸:行・列の全体でなければ、そこに決定がある
列を丸ごと挿入すれば、Excel にできることは一つだけ — 列を右へ押しやることです。行を丸ごと挿入すれば、行
を下へ押しやることしかできません。一方向、曖昧さなし — だからこそ Columns("C").Insert は何も尋ねてこ
ないのです。
部分的な範囲は、それを壊します。B2:D3 を挿入してくれと Excel に頼むと — データの真ん中に居座る 2 列 ×
3 行のブロックです — 場所を空けるために何かが動かなければなりませんが、何が でしょう。下のセルが下へず
れることもできるし、右のセルが右へずれることもできます。どちらも正当です。だから Range.Insert と
Range.Delete は Shift 引数を取り、その唯一の仕事はその問いに答えることです。部分的な範囲が一般のケ
ース、行・列の全体は、答えが強制される退化したケースです。
最も大事なルール:部分的な範囲では必ず Shift を渡す
Shift を省くと、Excel は拒みません — 範囲の形から 推測 します。おおまかに言うと、横より縦に長い範囲
は水平にシフトし、縦より横に長い範囲は垂直にシフトし、正方形の範囲はコイン投げです。この推測は、精神に
おいては文書化されておらず、実務においては当てになりません。そしてそれがあなたの意図と食い違うと、隣接
するセルが間違った方向へずれ、列がずれてしまいます — 静かに、エラーも出さずに。
Range("B2:D3").Insert ' 形にもとづく推測 - 潜在的なバグ
Range("B2:D3").Insert Shift:=xlShiftDown ' 明示的 - 毎回きっかりこの通りに動く
ルールは無条件です。どんな部分的な範囲でも、方向を指定する。 形にもとづくヒューリスティックは、常に
明示的であることでスイッチを切る「バグ発生装置」だと思ってください。定数は覚えておく価値があります。
Insert と Delete で違うものを使うからです。
| 操作 | セルの移動方向 | 定数 |
|---|---|---|
Insert |
下 | xlShiftDown |
Insert |
右 | xlShiftToRight |
Delete |
上 | xlShiftUp |
Delete |
左 | xlShiftToLeft |
もう一つの定数の罠。xlDown と xlToRight は Range.End が 移動 に使う XlDirection の値です — シフ
トの定数では ありません。Shift:=xlDown を Insert に渡すと、一部のバージョンでは値がたまたま一致し
て動いてしまいますが、意図としては誤りです。xlShift... の系統を使い、コードが意味する通りを語らせまし
ょう。
なぜ行・列の全体に対する操作が安全なケースなのか
ここで報われます。Columns("C").Insert は実のところ「たまたま列全体である範囲を挿入する」であり、列全体
は右にしかシフトできません — だから間違えるべき Shift の決定はなく、部分的な行の引き裂きも起こりようが
ありません。これこそ、行・列の全体に対する操作が信頼できる既定である、そのすべての理由です。
- 列や行を丸ごと動かしたいですか?
Columns(...)/Rows(...)を使います。Shiftは不要、参照はきれい に調整され、何も引き裂かれません。 - ブロック の中 に隙間を空けたり閉じたりする必要がありますか?
Range(...).Insert/.Deleteを、明示 的なShift:=付きで 使います。
部分的な範囲の削除は、列の削除と同じ #REF! の危険をはらみます。セルが消え、それを指していた数式が壊れ
ます。そして CopyOrigin はここでも、列に対するのとまったく同じように働きます — 挿入されたブロックは、あ
なたが別途指定しない限り、上または左のセルの書式を受け継ぎます。
部分的な挿入が本当に正しいとき
頻度について正直になりましょう。たいていの場合、「セルを挿入する」は行全体の仕事が姿を変えたものです。リ ストにレコードを追加しているなら、すべての列が揃ったままになるよう、行全体を動かしたいはずです — 一部の 列だけを下へずらす部分的な挿入は、まさにあなたが避けようとしているそのずれそのものです。
部分的な挿入と削除がその居場所を得るのは、本当に 矩形の 編集においてです — フォームのラベル付きブロッ
クを下へずらして新しいフィールドの場所を空ける、取り除いたサブテーブルが残した隙間を閉じる、行と列が意
味の単位ではない格子状のレイアウトを組み替える。そうした場合には、ブロックこそが主役であり、Shift の方
向は本物の設計上の選択です。それ以外のあらゆる場面では、まず行全体か列全体に手を伸ばしましょう — そのほ
うがきれいで、参照に安全で、あなたに推測を求めることが決してありません。
ExcelMaster の活用
部分的な範囲の挿入と削除は、鋭い道具です。Shift の方向は必須で、逆にしやすく、Excel に任せると静かに失
敗します — そして Delete の側は、列の削除と同じように数式を壊すことがあります。
ExcelMaster には、編集内容をそ
のまま伝えられます — 「このブロックを下へ押して、新しいフィールドの場所を空けて」 — すると、本当に必要な
のは行全体かどうかを判断し、形の推測に頼るのではなく明示的な Shift:=xlShiftDown(または
xlShiftToRight)を書き、周りの書式に合うよう CopyOrigin を設定し、参照を壊しかねない部分的な Delete
には印を付けます。ブックとコードはあなたの手元に残ります。
よくある質問
VBA でセルを挿入するには?
範囲に対して Insert を呼び、方向を明示します。Range("B2:C4").Insert Shift:=xlShiftDown は下のセルを
下へ動かして場所を空け、Shift:=xlShiftToRight は右のセルを右へ動かします。部分的な範囲では必ず Shift
を渡してください — それがないと、Excel は範囲の形から方向を推測します。
Shift 引数は何をするもので、なぜ渡さなければならないの?
Shift は、場所を空ける(Insert)あるいは隙間を閉じる(Delete)ために、周りのセルをどちらへ動かすか
を Excel に伝えます。部分的な範囲には正当な方向が二つあるので、選ぶのはあなたです。省くと Excel は、範囲
が縦長か横長かで選びます — その推測が意図と食い違うと、隣のセルを静かに間違った方向へずらします。
セルを挿入することと、列を丸ごと挿入することの違いは?
列全体は一方向(右)にしかシフトできないので、Columns("C").Insert に方向は不要で、レイアウトを引き裂く
こともありません。部分的な範囲は二方向にシフトできるので、Range(...).Insert には明示的な Shift が要
ります。レコードを追加するためにセルを挿入しようとしているなら、ほぼ間違いなく本当に欲しかったのは行全体
です。
VBA でセルを削除して上または左へシフトするには?
下のセルを上へ引き上げるには Range("B2:C4").Delete Shift:=xlShiftUp、右のセルを左へ引き寄せるには
Shift:=xlShiftToLeft を使います。列の削除と同じく、取り除かれたセルを参照していた数式は #REF! に崩れ
るので、先に依存する側を確認しましょう。
xlDown と xlShiftDown、どちらを使うべき?
xlShiftDown を使いましょう。xlDown と xlToRight の定数は XlDirection に属し、Range.End の移動の
ためのもので、Insert/Delete の Shift 引数のためのものではありません。xlShift... の系統を使えば意
図が明確になり、単に値が同じだというだけの定数に頼らずに済みます。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-15。
関連ガイド: VBA 列の挿入 · VBA 列の削除 · VBA 行の挿入 · VBA Range · VBA Cells
