1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Excel VBA 第8回 UsedRange、SpecialCells(xlLastCell)の不思議な動作

Last updated at Posted at 2020-07-13

はじめに

UsedRangeは、使用済みセルの範囲を取得することができます。
私は、セルのループ処理を実施する場合、UsedRangeを多用します。
というのも、ループ処理において、プログラミングのミスで無限ループに入ってしまうことを恐れ、ループ処理をする場合、UsedRangeで、その範囲だけループすることが多いです。

今回は、UsedRangeの動作で、初めて気づいた個人的には不思議な内容について、まとめます(紹介したいわけではなく、あくまで自分への備忘です)。
同じことが、SpecialCells(xlLastCell)でも発生するようです。

今回実施する内容

最終行や最終列まで罫線を引く場合、UsedRangeの範囲が最終行や最終列にならないことがあります。
そういったケースで分かった内容をまとめます。

ソースコード(Git Hub)

環境

OS:Windows 10 JP
Excel: Excel 2019 (64bit)

参考

UsedRange プロパティ (Excel)
MicrosoftのOffice VBA リファレンスのUsedRangeの説明です。

用語

なし

UsedRangeの動作について

UsedRangeの説明

参考に記載した、UsedRangeの説明をみると、以下の通りです。

指定したワークシートの使用されている範囲を表すrange オブジェクトを返します。 読み取り専用です。

UsedRangeを使ってみる

「使用されている範囲」というのがあいまいですが、この範囲は、Excelの上下や左右のスクロールバーの大きさにもでてきますし、それなりになじみがあるかと思います。
また、色々なサイトでもUsedRangeは紹介されていますので、その点でも「使用されている範囲」は、想像可能と思いますが、ちょっとだけ紹介します。

1. セルに値が入っている場合

UsedRangeの範囲.jpg

セルに値が入っている場合、図のように、値の入っている先頭のセルと値の入っている最後のセルを囲った範囲がUsedRangeの範囲となります。

図では、C4セルとE8セル以外は何も使っていませんが、この長方形がUsedRangeの範囲です。
「使用している範囲」であって、「使用しているセル」ではないため、このようになります。

2. セルに書式が設定されている場合

UsedRangeの範囲2.jpg

先ほどの範囲から、C4セル~D10セルに罫線を引くと、「使用している範囲」は、C4セル~E10セルになります。

ここまでは普通の動作であって、期待通りです。

最終行や最終列で罫線を引くと不思議なことが

3.2の状態から、C列の11行目から最終行(1048576行)まで罫線で囲う場合

UsedRangeの範囲3.jpg

最終行まで罫線を引いているにも関わらず、範囲は、C1セル~E10セルになります。
私が期待していたのは、C4セル~E1048576セルなのです。
今回の範囲では、以下の通りになります。

  • 先頭が使用していないはずの、C1セル~E3セルをUsedRangeの範囲に含みます。
  • 最終は、罫線を記載して使用しているはずのC11セル~E1048576セルをUsedRangeの範囲に含みません。

すべての行に罫線を引くと、使用されていない判断する仕様なのでしょうか?

最終行の罫線を削除すると

4.3の状態から最終行の緯線を消す場合

UsedRangeの範囲4.jpg

C1セル~E1048576セルの範囲がUsedRangeの範囲になります。
これはまだ想像可能なと思います。一度使用したセルはその値を変えても使用していないセルはならず、UsedRangeの範囲は変わらないため想定通りです。

罫線を途中から引いたら

5.2の状態から、C列の15行目から最終行(1048576行)まで罫線で囲う場合

UsedRangeの範囲5.jpg

C1セル~E14セルの範囲がUsedRangeの範囲になります。
15行目~1048576行は罫線が記載されてますがUsedRangeの範囲なりません。
最終行まで罫線を引くと引いていなかったと判断する不思議です。

列方向は?

列方向も行方向と同じ動作になりました。
方向性は同じということですね。

SpecialCells(xlLastCell)の動作は?

SpecialCells(xlLastCell)は、最終セルを取得することができます。
今回1~5の動作でUsedRangeの最後のセルになりました。
これも方向性は同じということですね。

おわりに

今回見つけたこの動作は、試しにExcel 2016 (32bit)版でも同様でした。
今まで気づきませんでしたが、これって既知なのでしょうか?
それともScript作成方法に誤りがあったのでしょうか?
わかりませんが、いずれにせよ、気を付けないといけないなと思いました。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?