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

次は、B2を表の開始セル、列数を5、B12を処理範囲の終端として呼び出す例です。ボタンやショートカットに割り当てて使うことを想定しています。
依存プロシージャ
このコードは次の自作プロシージャに依存します。上のコードブロックに含めているので、そのまま貼り付ければ動作します。
GetSelectionCell:選択中のセルを取得する部品です。詳しくは GetSelectionCell を参照してください。
応用・注意点
削除は Delete(xlUp) で行うため、消した行の下にある行が上に詰まります。表の列数(ColCount)ぶんだけを対象にしているので、表の外にある内容は動きません。
EndCell を渡しておくと、選択範囲がその行以降まで広がっていても、最終行の一つ手前までで削除を打ち切ります。合計行や備考欄など、表の下にある固定行を巻き込まないための安全策として使えます。
StartCell と EndCell は、必ず名前定義(名前付き範囲)で渡してください。行を削除するとセルのアドレスは上へずれます。Range("B12") のような固定アドレスで渡すと、一度削除した時点で EndCell が別のセルを指してしまい、処理範囲の判定が壊れます。名前定義にしておけば、挿入・削除に追従して名前が同じ論理セル(表の最終行など)を指し続けるため、繰り返し実行しても安全です。特に EndCell はアドレス直指定を避けてください。
開始行より上(見出し行など)を選択しているときは何もしません。誤操作で見出しを消してしまう事故を防げます。
複数行を選択して実行すると、その範囲すべてが一度に削除されます。連続した明細行をまとめて消したいときに便利です。
反対に、選択した行の上に行を挿入する部品は InsertRowSelectCell_Table で紹介しています。行の追加と削除をセットで用意しておくと、明細表の編集がボタン操作だけで完結します。
サンプルブック(ダウンロードして試せます)
コードの詳しい動きは上のコードブロックとテストコードのとおりですが、まず動かして試したい場合は、下記のサンプルマクロブックをダウンロードして、シート上のボタンを押すだけで削除の動作を確認できます。このサンプルには行の挿入・削除の両方のボタンが含まれているので、動画で見た動きをそのまま手元で再現できます。
サンプルブックの中身(シートとボタンの配置)は次のとおりです。

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

下のボタンからサンプルブックをダウンロードできます。
まとめ
DeleteRowSelectCell_Table を使えば、表の中で選択した行を、表の列数ぶんだけ削除して上に詰められます。処理範囲を指定して固定行を守りつつ、複数行の一括削除にも対応しているので、見積書や明細表の行削除ボタンとしてそのまま使える部品です。
