VBA:UsedRangeで表を範囲指定したときの挙動について

IT知識

エクセルVBAでUsedRangeプロパティを使うサンプルと挙動についての解説。
UsedRangeプロパティの挙動がおかしいときの対処方法についても解説する。

UsedRangeを使うとシート上で使われているセル範囲を選択できる。
これを使ってシンプルな表であれば範囲指定できる。

シート上の表範囲を選択するためのマクロを作成

次のようなVBAマクロを作るとシート上の表範囲を選択してくれる。

' UsedRangeで表範囲指定
Sub TestUsedRange()
    Dim ur As Range
    
    Set ur = ActiveSheet.UsedRange
    ur.Select
    
End Sub

表を作ってUsedRangeの挙動をチェックする

まずは、次のようなシートの左上(A1)を基点とする表を作って確認する。

マクロ実行後、きちんと表範囲のみ選択された。

表の基点を左上から離してみても問題なく範囲選択できた。

表の外側のセルに何かデータが入っている場合はどうか?
そのセルを含む矩形の表範囲が選択される。

UsedRangeのドキュメントには、「指定したワークシートの使用範囲を表すRangeオブジェクトを返します」となっているためこの範囲指定は正しいようだ。

表が複数あるシートの場合も同様に使用範囲を含む矩形範囲が選択された。

シートをあちこち編集しているとUsedRangeの挙動がおかしくなる

UsedRangeを使ったマクロで色々と試していて気づいた。
シートのセルをあちこち編集していると挙動がおかしくなる時があるのだ。

先ほどの2つの表の片方を文字のみ消してみる。
罫線があるため選択されている。ここまでは問題ない。

次に罫線を消してマクロを実行してみる。
なぜか先ほど罫線があった場所が選択されてしまっている!

セルの文字も罫線も消したのにあるものとして扱われているようだ。
UsedRangeを使う場合、こうしたおかしな挙動があることに注意しなければならない。

試しに怪しいと思われる複数列を範囲選択(下図の場合H~J列を選択)して、右クリック > 削除 してみた。

なぜか問題なく表選択できるようになった。

何度か試したが、UsedRangeでセルデータが無いのに範囲選択がうまくいかない場合、行ごと削除、または列ごと削除が有効なようだ。

コメント

タイトルとURLをコピーしました