取得方法(End,CurrentRegion,SpecialCells,UsedRange)最終更新日:2019-10-08最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)エクセルの表をマクロVBAで扱う時は、データ部分の先頭から最終行までの、開始列から最終列まで処理する事が多いでしょう。開始行や開始列は、ほとんどの場合、見出し行や見出し列の次からになります。単純な話として、1行目に見出しがあれば、2行目から1列目に見出しがあれば、2列目からでは、ここで、最終行や最終列は、どのように判断したら良いでしょうか。列数は固定の場合が多いと思われますが、データ行数は決まった行数ではない事が普通です。最終行はどのように取得すればよいでしょうか。以下の表で説明します。マクロでは、A2~A11まで処理したいですよね。この行数が増えても、マクロは変更すること無く使えるようにしたいです。↓これで、A11に移動できます。1).End(xlDown)になります。↓ではA6セルになってしまいます。↑とやれば、A11に移動できます。1).End(xlUp)になります。Rows.Countは、シートの行数になります。2007以降なら1048576です、2003なら65536です。シートのA列の最終行から、上に向かって、Ctrl+↑で移動している訳です。このEndは、Rangeオブジェクトのプロパティです。1).End(xlUp)これは、最期のセルを表しています、つまり最期のセルのRangeオブジェクトになります。1).End(xlUp).Rowこのように、.Rowを指定します。これで、データの最後の行数を取得できます。この、.Rowは、Rangeオブジェクトのプロパティで、その行位置を返します。上記例なら、11が返されます。1).End(xlDown).Rowは11と同じだと言う事です。1).End(xlUp).Rowこれは、定型文として丸暗記して下さい。1).End(xlUp).Rowこれを使用します。手動のCtrl+↑でも同じですが、可視セル(見えているセル)の最終行となってしまいます。このような場合は、全行表示およびフィルタの絞り込みを解除してから最終行の取得をしてください。そのような方法ができない場合は、下記の別の方法を使用してください。最終行取得と同様の考えで、最終列の取得も行います。Columns.Count).End(xlToLeft).Column最終行取得と合わせて、良く使われていますので覚えておいてください。上記のような手法が使えないような表の場合があります。以下の表で説明します。最終列は見出し行の2行目で判断すれば良いでしょう。Columns.Count).End(xlToLeft).Columnしかし、最終行の取得方法が、今までの方法ではうまく行きません。マクロVBAで処理するなら、10行目までか、12行目までになるでしょう。2).End(xlUp).Rowこれでは、9になってしまいます。3).End(xlUp).Rowこれなら、10になりますが、そもそも何列目に最終行のデータが入っているかが不明です。・CurrentRegion・SpecialCells(xlCellTypeLastCell)・UsedRange・Findメソッドこれらを使用します。CurrentRegionCurrentRegionプロパティを使用して最終行を取得する場合です。WithCurrentRegionは、アクティブセル領域を返します。最初のコードは、アクティブセル領域の最後のセルの行位置を取得しています。次のコードは、アクティブセル領域の開始行位置とアクティブセル領域の行数を足しています。CurrentRegionなので、途中に空白行(何も入っていない行)がある場合は、そこまでの行になってしまいます。SpecialCells(xlCellTypeLastCell)SpecialCellsプロパティを使用して最終行を取得する場合です。Cells.SpecialCells(xlCellTypeLastCell).RowSpecialCells(xlCellTypeLastCell)は、シートの最終セルを返します。シートの使っているセルの最終位置を取得しています。上の表なら、12となります。(表範囲以外には何のデータもはいっていないとしてです。行高を規定高から変更しているだけでも、その行まで範囲に入ってしまいます。シートの下の方で行高だけを変更していても、その行まで範囲に含まれてしまうという事です。従って、注意しないと大きな範囲を処理するVBAとなってしまい、処理速度のとても遅いマクロになってしまいます。UsedRangeUsedRangeプロパティを使用して最終行を取得する場合です。WithUsedRangeは、指定されたワークシートで使われたセル範囲を返します。使われたセル範囲の開始行位置と使われたセル範囲の行数を足しています。UsedRangeは、シートの指定が必須となります。以下の注意点を良く確認してください、使うには少々注意が必要です。行高を規定高から変更しているだけでも、その行まで範囲に入ってしまいます。行を非表示行にしていても、その非表示行が範囲に含まれてしまいます。シートの下の方で行高だけを変更していても、罫線を引いていても、非表示にしていても、これら、規定の状態から変更しているだけで、その行まで範囲に含まれてしまうという事です。従って、注意しないと大きな範囲を処理するVBAとなってしまい、処理速度のとても遅いマクロになってしまいます。※注意してくださいUsedRangeについて間違った解説を載せているサイトを見かけます。VBA」でググってトップの方に表示されるようなサイトでも以下のVBAコードがでている場合がありますです。ActiveSheet.UsedRange.Rows.countこれで最終行の取得としているのです。これでは、上記の表の場合、11となってしまいます。未使用の行が先頭にある場合は、その行数が含まれなくなってしまうのです。FindメソッドRangeオブジェクトのFindメソッドを使います。Findメソッドは、VBAでセル範囲内の条件に当てはまるセルを検索するものです。Findメソッドは、Rangeオブジェクトのメソッドで、ワークシート操作の「検索と置換」の「検索」の機能をVBAで使うものです。入っているセルを見つけようという事です。あらゆる文字("*")を下から上へ(xlPrevious)へ探しています。行方向なので(xlByRows)、列なら(xlByColumns)になります。CellsはUsedRangeでも良いです。非表示行も対象となりますので汎用性はあります。複数の表(別々の連続セル範囲)があるシートでは、表を指定することはできません。このような場合はCurrentRegionを使ってください。Findメソッドは指定オプションがシート操作とリンクしている点については注意してください。エクセルは表計算ソフトです、つまり縦横の表を扱います、データは横に項目があり、縦に項目に対するデータが入っている事が一般的です。そのデータ行数は決まった行数ではない事が普通です。第6回.表の先頭から最終行まで繰り返す(ForとEnd(xlUp).Row)エクセルの表は、横の項目はあまり変更はないものですが、縦のデータ数、つまり行数は常に変わるものです。前回のように、固定の回数しか繰り返せないのでは困ります。データ数に応じて、最終行まで繰り返す方法が必要です。Rangeの使い方:最終行まで選択を例にRangeの使い方・書き方について、データ最終行まで選択する場合を例に説明します、Rangeの書き方なので、RangeオブジェクトではなくRangeプロパティの解説という事になります。最近続けざまに、以下のようなコードを見かけました。エクセル顧客管理の記事からのスピンオフ記事になります。取得方法(End,CurrentRegion,SpecialCells,UsedRange)このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。取得方法このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。