3本目 「セルのブロック選択と削除」を学ぶ
それでは今日も元気にやっていきましょー!
今回はセルの消去を学びます。まずは今回のお題から。
出題
準備
出題に沿ったサンプルデータを準備しました。
(ファイルはこちらから)
NO行を13、14・・と追加して行ったり、データ列をデータ4、データ5・・
と増やし更新していっても、それに対応した表の中身部分だけが削除されるようにマクロを組みます。
宣言強制の自動挿入
標準モジュールを作る前に、一つ設定します。
Option Explicit(宣言の強制)を標準モジュール作成時に自動挿入するようにします
環境設定
→ オプションが開く
→ 変数の宣言が必要です。に✅
→ OK
右クリックから標準モジュールをいつも通り作成してみます。
無事、自動挿入されました!次回からが楽ちんです。
回答
回答していく前に、基礎知識として必ず押さえたいポイントが2つあります。
- CurrentRegion
- offset
- ClearとClearContents
です。
CurrentRegionとは
選択範囲を自動的に拡大して、 現在の領域全体が含まれるようにします。
現在の選択範囲は、空白の行と空白の列の任意の組み合わせで囲まれた範囲です。
つまり空白行、列で区切られるまで風呂敷を広げに広げたような領域です。
さっきのサンプルファイルで使ってみます。
Range("A1")のCurrentRegionを選択できました!
たとえば、ここからNo9の列の内容を消して再度実行してみると
選択範囲がだいぶ狭まっていることが分かります。これは黄色で塗りつぶしている空白行・空白列でA1の属するブロックが遮られているからです。これはB2のCurrentRegionでも同じ領域となりますし、B6のような空白セルでも同じ領域となります。つまり、このグレーで選択された領域内のセルであれば、どのセルを選ぼうとCurrentRegionで得られる領域は同じになるのです。
変化に対応してセル範囲を指定できる。素晴らしい機能です!しかし、困りました。
よくみると見出し行、見出し列も選択されています。このまま削除すると見出しが消えてしまいます。一行と一列、範囲ごとを斜め下に少しお引っ越ししてもらいたいですね・・・
offset
そこでoffsetの出番です!これは指定した範囲をそのままサイズでずらすために利用します。
Range.Offset(RowOffset, ColumnOffset)
下にずらしたいなら、RowOffsetと書いているところに正の値を
上にずらすなら負の値を入れてください。
右にずらすなら、ColumnOffsetに正の値を、左なら負の値を入れます。
ここでは見出し行、見出し列のところを一つずつずらしたいので
~~~~.offset(1,1) となります。ずらしてみましょう(No9のところは元に戻してね)
よし!ずれました、範囲の大きさそのままで並行移動しているため、一行一列余分に範囲選択される結果となります。しかし、これは対した問題ではありません。というのも、このグレーの範囲は、CurrentRegionで拾ってきた範囲ですので、あぶれた一行一列の中身は、必ずすべて空白列・空白行となるからです。
あとは、このままDeleteボタンをぽちっとおしたいところです。がもちろんそれも自動化します。
ClearとClearContentsの使い方
ここではこの二つの機能を比較するため、書式の削除まで確認するために、以下のように塗りつぶしてください。
結論から言うと両者の違いは以下の通りです。
ClearContentsで消せるもの
数式と文字のみを削除します。(書式等はそのまま残る)
Clearで消せるもの 要するに全部消す
全体(数式・文字・書式・コメント全て)をクリアします。
ではまず一番よく使うClearContentsから。(要注意!消す前に違うシートに複製しておいてください。マクロで操作した内容に対し、「もとに戻す」機能はつかえません)
ちゃんと書式を残して消せました。ここまででお題自体はクリアーです!
ですがClearしたついでにClearも使ってみると・・
うわあ!がっつり骨までもってかれました。とふざけていないで総括へ
学んだこと総括
セル領域をいわば一つのブロックとして指定できるCurrentRegion
範囲を縦横斜めにサイズそのままで並行移動できる、offset
二つ組み合わせれば柔軟な範囲指定が可能!
文字だけ消したいときはClearContents
がっつり骨ごともってきたいときは破壊神Clear