はじめに
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の範囲となります。
図では、C4セルとE8セル以外は何も使っていませんが、この長方形がUsedRangeの範囲です。
「使用している範囲」であって、「使用しているセル」ではないため、このようになります。
2. セルに書式が設定されている場合
先ほどの範囲から、C4セル~D10セルに罫線を引くと、「使用している範囲」は、C4セル~E10セルになります。
ここまでは普通の動作であって、期待通りです。
最終行や最終列で罫線を引くと不思議なことが
3.2の状態から、C列の11行目から最終行(1048576行)まで罫線で囲う場合
最終行まで罫線を引いているにも関わらず、範囲は、C1セル~E10セルになります。
私が期待していたのは、C4セル~E1048576セルなのです。
今回の範囲では、以下の通りになります。
- 先頭が使用していないはずの、C1セル~E3セルをUsedRangeの範囲に含みます。
- 最終は、罫線を記載して使用しているはずのC11セル~E1048576セルをUsedRangeの範囲に含みません。
すべての行に罫線を引くと、使用されていない判断する仕様なのでしょうか?
最終行の罫線を削除すると
4.3の状態から最終行の緯線を消す場合
C1セル~E1048576セルの範囲がUsedRangeの範囲になります。
これはまだ想像可能なと思います。一度使用したセルはその値を変えても使用していないセルはならず、UsedRangeの範囲は変わらないため想定通りです。
罫線を途中から引いたら
5.2の状態から、C列の15行目から最終行(1048576行)まで罫線で囲う場合
C1セル~E14セルの範囲がUsedRangeの範囲になります。
15行目~1048576行は罫線が記載されてますがUsedRangeの範囲なりません。
最終行まで罫線を引くと引いていなかったと判断する不思議です。
列方向は?
列方向も行方向と同じ動作になりました。
方向性は同じということですね。
SpecialCells(xlLastCell)の動作は?
SpecialCells(xlLastCell)は、最終セルを取得することができます。
今回1~5の動作でUsedRangeの最後のセルになりました。
これも方向性は同じということですね。
おわりに
今回見つけたこの動作は、試しにExcel 2016 (32bit)版でも同様でした。
今まで気づきませんでしたが、これって既知なのでしょうか?
それともScript作成方法に誤りがあったのでしょうか?
わかりませんが、いずれにせよ、気を付けないといけないなと思いました。