データの入力されている最終行を表すRangeオブジェクトを取得する、
Range("A1").End(xlDown)
というオブジェクト式は、Excel VBA(Visual Basic for Applications)の、定番のコードのひとつです。
ここで利用しているRangeオブジェクトのEndプロパティがあるるため、Excel VBAではFor~Nextループの出番が、他のプログラミング言語よりも多いといえます。
もしも、Range.Endプロパティが存在していなければ、For~Next文より汎用的なDo~Loop文に頼らざるを得なくなっていたはずです。
キーワード単位まで分解すると、上図のように図解できるオブジェクト式「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("A1").End(xlDown).Row」を図解すると以下のとおりです。
Home » Excel VBA Rangeオブジェクト » Endプロパティ » Range("A1").End(xlDown).Rowはデータがないとき・1行しかデータがないときに何を返すのか