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?

知らないと怖いExcelVBAの穴10~信用できないUsedRange~

Last updated at Posted at 2026-01-08

1. はじめに

Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。

その「ゆるさ」は、初心者にとっては優しさであり、
一方で実務では 「正しく動いているように見える不具合」を生みやすい原因にもなります。

本記事では、
Excel VBAでよく使われがちな UsedRange が、
なぜ実務で信用できないのかを整理します。

2. UsedRangeとは

UsedRange は、使われことのあるセル範囲 を表すプロパティです。

VBA
Dim rng As Range
Set rng = ActiveSheet.UsedRange

一見すると、

  • データがある範囲だけを取得できる
  • 最終行・最終列の取得に便利

という、理想的な処理に見えます。

3. 実務で使われがちな理由

UsedRange が使われがちな理由は明確です。

  • コードが短い
  • 意図が分かりやすい
  • 動いているように見える
VBA
lastRow = ActiveSheet.UsedRange.Rows.Count

この1行で「最終行が取れた気」になります。

しかし、ここに大きな落とし穴があります。

4. UsedRangeは「見た目」ではない

UsedRange が参照しているのは、

Excelが「使われたことがある」と判断している範囲

です。

これは、

  • 現在データがあるかどうか
  • 表示されているかどうか

とは関係がありません。

5. よくある事故パターン

5-1. 一度でも値が入ったセルは残る

A1:A10 にデータ入力 → A1:A10 を全削除

この状態でも、

VBA
ActiveSheet.UsedRange

A1:A10 を含んだまま になります。

5-2. 書式設定だけでも「使用済み」になる

  • 背景色
  • 罫線
  • フォント変更

これらを一度でも設定すると、
そのセルは UsedRange に含まれます。

5-3. 意図しない最終行・最終列になる

VBA
lastRow = ActiveSheet.UsedRange.Rows.Count

この値が、

  • 実際のデータ行数
  • 画面で見える行数

一致する保証はありません

6. 再計算や保存で挙動が変わることもある

さらに厄介なのは、

  • ファイルを開き直した
  • 再計算された
  • 保存された

といった操作で、
UsedRange の範囲が 変化することがある 点です。

同じコードでも、実行タイミングで結果が変わる

これは、実務では致命的です。

7. まとめ

UsedRangeは便利そうに見える。
しかし過去の使用履歴に左右され、実行のたびに結果が変わる可能性がある。

重要なのは、

  • UsedRangeに依存しない設計をする
  • 明示的に範囲を決める
  • 最終行・最終列の定義を先に決める

という 設計意識です。

1
0
0

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?