1. はじめに
Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。
その「ゆるさ」は、初心者にとっては優しさであり、
一方で実務では 「正しく動いているように見える不具合」を生みやすい原因にもなります。
本記事では、
Excel VBAでよく使われがちな UsedRange が、
なぜ実務で信用できないのかを整理します。
2. UsedRangeとは
UsedRange は、使われことのあるセル範囲 を表すプロパティです。
Dim rng As Range
Set rng = ActiveSheet.UsedRange
一見すると、
- データがある範囲だけを取得できる
- 最終行・最終列の取得に便利
という、理想的な処理に見えます。
3. 実務で使われがちな理由
UsedRange が使われがちな理由は明確です。
- コードが短い
- 意図が分かりやすい
- 動いているように見える
lastRow = ActiveSheet.UsedRange.Rows.Count
この1行で「最終行が取れた気」になります。
しかし、ここに大きな落とし穴があります。
4. UsedRangeは「見た目」ではない
UsedRange が参照しているのは、
Excelが「使われたことがある」と判断している範囲
です。
これは、
- 現在データがあるかどうか
- 表示されているかどうか
とは関係がありません。
5. よくある事故パターン
5-1. 一度でも値が入ったセルは残る
A1:A10 にデータ入力 → A1:A10 を全削除
この状態でも、
ActiveSheet.UsedRange
は A1:A10 を含んだまま になります。
5-2. 書式設定だけでも「使用済み」になる
- 背景色
- 罫線
- フォント変更
これらを一度でも設定すると、
そのセルは UsedRange に含まれます。
5-3. 意図しない最終行・最終列になる
lastRow = ActiveSheet.UsedRange.Rows.Count
この値が、
- 実際のデータ行数
- 画面で見える行数
と 一致する保証はありません。
6. 再計算や保存で挙動が変わることもある
さらに厄介なのは、
- ファイルを開き直した
- 再計算された
- 保存された
といった操作で、
UsedRange の範囲が 変化することがある 点です。
同じコードでも、実行タイミングで結果が変わる
これは、実務では致命的です。
7. まとめ
UsedRangeは便利そうに見える。
しかし過去の使用履歴に左右され、実行のたびに結果が変わる可能性がある。
重要なのは、
- UsedRangeに依存しない設計をする
- 明示的に範囲を決める
- 最終行・最終列の定義を先に決める
という 設計意識です。