InsertRowSelectCell_Table|表で選択行の上に行を挿入する
- yuji fukami
- 4 日前
- 読了時間: 5分
この部品でできること
InsertRowSelectCell_Table は、シート上の表において、いま選択しているセルの行の上に一行を挿入するExcel VBAの汎用プロシージャです。
選択中のセルの行を基準に、その上へ一行を挿入する
挿入した行に、数式・書式・入力規則を引き継ぐ(空欄の数式列も上の行から数式をコピー)
表の一番上の行を選択して挿入したときは、書式や数式を下の行からコピーする
表の範囲外(開始行より上や、指定した最終行以降)を選択しているときは何もしない
挿入した行全体を戻り値として返す
下の動画は、実際の動作デモンストレーションです。この動画では行の挿入・行の削除の両方を実演しています(削除側の部品は後述します)。
このデモは、実際に「使用見積書作成サポーター」という販売ツールの中で、明細行を増やす仕組みとして使っている部品です。ボタン一つで、選択した行の上に体裁の整った行が増えるようにしています。
使いどころ
見積書・注文書などの明細表で、選択した位置に行を追加したいとき
単純な行挿入だと数式がコピーされないため、数式ごと引き継いで行を増やしたいとき
表の範囲を決めておき、その範囲内でだけ行挿入を許可したいとき(見出しやフッターを壊さない)
コード
依存する GetSelectionCell / InsertRowAndCopyFormula / GetCellFromRowColCells も含めて、下記をそのままモジュールに貼り付ければ動作します。
使い方・引数
表の左上(開始セル)と列数を渡して呼び出します。選択セルの取得は関数内で行うので、呼び出し側はどのセルが選択されているかを気にする必要はありません。
StartCell(Range):表の開始セル(表の左上のセル)。行・列の基準になります
ColCount(Long):表の列数。挿入する範囲の幅(列数)です
EndCell(Range・省略可):処理範囲の最終行の一つ下のセル。これを渡すと、そのセルの行以降を選択したときは挿入せず、見出しやフッターを壊しません
大前提として、StartCell と EndCell(特に EndCell)は、必ず名前定義(名前付き範囲)で渡してください。Range("B12") のようなアドレス直指定で渡すと、一度でも行を挿入した時点でセルのアドレスがずれ、別のセルを指してしまい、以降の動作が壊れます。名前定義にしておけば、行の挿入・削除に追従して名前が同じ論理セル(表の最終行など)を指し続けるため、繰り返し実行しても正しく動きます。特に EndCell はこれが必須です。
下の図は、表の中の選択位置と、その上に行が挿入されるイメージです。選択している行の上に、書式・数式ごと新しい行が追加されます。

次は、B2を表の開始セル、列数を5、B12を処理範囲の終端として呼び出す例です。ボタンやショートカットに割り当てて使うことを想定しています。
依存プロシージャ
このコードは次の自作プロシージャに依存します。上のコードブロックにすべて含めているので、そのまま貼り付ければ動作します。
GetSelectionCell:選択中のセルを取得する部品です。詳しくは GetSelectionCell を参照してください。
InsertRowAndCopyFormula:指定セルの上に行を挿入し、数式・書式・入力規則をコピーする部品です。実際の挿入処理はここが担当します。
GetCellFromRowColCells:行基準のセルと列基準のセルから、行と列を組み合わせた一つのセルを取得する部品です。選択セルの行と表の開始列を組み合わせるために使っています。
応用・注意点
表の一番上の行を選択して挿入したときは、上に手本となる行がないため、書式や数式を下の行からコピーします(InsertRowAndCopyFormula の第4引数で切り替えています)。表の見出し直下でも体裁が崩れにくくなります。
EndCell を渡しておくと、その行以降を選択したときは挿入しません。合計行や備考欄など、表の下にある固定行を巻き込まないための安全策として使えます。
StartCell と EndCell は、必ず名前定義(名前付き範囲)で渡してください。行を挿入するとセルのアドレスは下へずれます。Range("B12") のような固定アドレスで渡すと、一度挿入した時点で EndCell が別のセルを指してしまい、処理範囲の判定が壊れます。名前定義にしておけば、挿入・削除に追従して名前が同じ論理セル(表の最終行など)を指し続けるため、繰り返し実行しても安全です。特に EndCell はアドレス直指定を避けてください。
ColCount に表の列数を渡すと、その幅だけを対象に挿入します。0を渡すと行全体が対象になりますが、表の左右に別の内容があるシートでは列数を明示するのが安全です。
戻り値は挿入した行全体(EntireRow)です。挿入直後にその行へ値を書き込むなど、続けて処理したいときに利用できます。
反対に、選択した行を削除して上に詰める部品は DeleteRowSelectCell_Table で紹介しています。行の追加と削除をセットで用意しておくと、明細表の編集がボタン操作だけで完結します。
サンプルブック(ダウンロードして試せます)
コードの詳しい動きは上のコードブロックとテストコードのとおりですが、まず動かして試したい場合は、下記のサンプルマクロブックをダウンロードして、シート上のボタンを押すだけで挿入の動作を確認できます。このサンプルには行の挿入・削除の両方のボタンが含まれているので、動画で見た動きをそのまま手元で再現できます。
サンプルブックの中身(シートとボタンの配置)は次のとおりです。

ボタンに割り当てているコードは次のとおりです。表の開始セル・終了セルを名前定義で渡す形にしています。

下のボタンからサンプルブックをダウンロードできます。
まとめ
InsertRowSelectCell_Table を使えば、表の中で選択したセルの行の上に、数式・書式・入力規則を引き継いだ一行をきれいに挿入できます。処理範囲を指定して固定行を守りつつ、表の先頭でも体裁が崩れにくいようにしているので、見積書や明細表の行追加ボタンとしてそのまま使える部品です。
