Home » ExcelVBA Rangeオブジェクト » Endプロパティ » Range("A1").End(xlDown).Rowはデータがないとき・1行しかデータがないときに何を返すのか

Range("A1").End(xlDown).Rowはデータがないとき・1行しかデータがないときに何を返すのか

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

データの入力されている最終行を表すRangeオブジェクトを取得する、
  Range("A1").End(xlDown)
というオブジェクト式は、Excel VBA(Visual Basic for Applications)の、定番のコードのひとつです。

ここで利用しているRangeオブジェクトのEndプロパティがあるるため、Excel VBAではFor~Nextループの出番が、他のプログラミング言語よりも多いといえます。

もしも、Range.Endプロパティが存在していなければ、For~Next文より汎用的なDo~Loop文に頼らざるを得なくなっていたはずです。

Range(

キーワード単位まで分解すると、上図のように図解できるオブジェクト式「Range("A1").End(xlDown)」が、一体何を返すのかを、Excel上の動きと関連づけて理解できていないと、はまってしまうこともあります。

「range("a1").end(xldown).row データが存在しない場合の戻り値」
「excel マクロ range("a1").end(xldown).rowにて1行のみの場合の戻り値に最大行が返される」
といった検索キーワードは、そのような、はまってしまった方によるものでしょう。

[スポンサードリンク]

Range("A1").End(xlDown).Selectをテストしましょう

オブジェクト式
  Range("A1").End(xlDown).Row
の戻りが何なのか、自信がないという方は、
  Range("A1").End(xlDown).Select
を、条件を変えながら、何度か実行してみましょう。

まずは、A1:A10セルにデータを入力した状態で、
  Range("A1").End(xlDown).Select
を実行して、A10セルが選択されることを確認しましょう。そして、
ExcelでA1セルがアクティブセルだったときに、ショートカットキー[Ctrl]+[↓]を押すと、やっぱりA10セルが選択されることも確認しましょう。

RangeオブジェクトのEndプロパティは、[Ctrl]+矢印キーで選択できるのと同じセルを表すRangeオブジェクトを取得するプロパティだということを、強くイメージしましょう。

続いて、A3:A10のデータを削除して、
  Range("A1").End(xlDown).Select
を実行すると、A2セルが選択されることと、
ExcelでA1セルがアクティブなときショートカットキー[Ctrl]+[↓]を押すと、やっぱりA2セルが選択されることを確認しましょう。

そして、A2セルのデータを削除して、A1セルにだけデータが入力されているときに、
  Range("A1").End(xlDown).Select
を実行したときに、どのセルが選択されるか、
ExcelでA1セルがアクティブなときショートカットキー[Ctrl]+[↓]を押すとどうなるかを確認しましょう。

つまり、
「excel マクロ range("a1").end(xldown).rowにて1行のみの場合の戻り値に最大行が返される」
ということです。

これを回避するために、オブジェクト式
  Cells(Rows.Count, "A").End(xlUp).Select
で選択したり、
  Cells(Rows.Count, "A").End(xlUp).Row
で行番号を取得したり、といったことが行われるわけです。

Range("A1").End(xlDown).SelectやRange("A1").End(xlDown).Rowの意味

ちなみに、オブジェクト式「Range("A1").End(xlDown).Select」を図解すると以下のとおりです。

Range(

オブジェクト式「Range("A1").End(xlDown).Row」を図解すると以下のとおりです。

Range(

[スポンサードリンク]

Home » ExcelVBA Rangeオブジェクト » Endプロパティ » Range("A1").End(xlDown).Rowはデータがないとき・1行しかデータがないときに何を返すのか

TrackBack:1

TrackBack URL
最終行番号を取得するRange("A1").End(xlDown).Rowでオーバーフロー from インストラクターのネタ帳
Range("A1").End(xlDown).Rowでオーバーフローする理由などについて解説しています。

Home » ExcelVBA Rangeオブジェクト » Endプロパティ » Range("A1").End(xlDown).Rowはデータがないとき・1行しかデータがないときに何を返すのか

Copyright © インストラクターのネタ帳 All Rights Reserved.

.