エクセルVBA データ入力済セルの最終行番号を取得する方法

vbalastcelleyecatch

エクセルVBAのプログラム作成で、入力データをその都度蓄積していく場合など、

既にデータの入っている最終セルの位置を調べたいという時が多くあります。

こんにちは、じゅんぱ店長(@junpa33)です。

 

エクセルVBAのコード組み立てで、データ入力済のセルの最終行番号を知る必要がある場合は多くあります。

データベースシートを作る場合は必ずと言っていいと思います。

今回はこの方法について説明をしていきます。

 

エクセルVBA データ入力済セルの最終行番号を取得する方法

 

どこまでの行と列のセルにデータが入っているかを調べる作業は、

エクセルVBAコードを作成する中で、何かのプロシージャーの組み立てのパーツとして

結構、必須的に必要になってくることが多いかと思います。

 

「どこまでの行番号にデータが入っているか?」

実際に作表されたエクセルシートなら ”実際に目で見れば” 簡単に判断できます。

それは、人の目で見た場合、データ行が途中で空白行として続いていたとしても 

人が見れば、”ファジー” であっても自然と ”たぶんこうだろう” と判断できるからです。

VBAコードでその判断を下そうとすると、そうは上手くいきません。

エクセルVBAには、そんな「ファジー・多分このような」を判断する機能なんて無いからです。

シートのセルの使用状況は、時と場合で全く異なり、たとえ入力フォーマットを作成しても、セルの使用状態は十人十色状態なので、データがどこからどこまで入っているかは

「ソフト製作者が決めた定型の方法だけでは、常に正しいということはない。」ということになります。

 

「データ記述の最終行を取得する」という、解説書やサイトの中によく出てくるのは、

このケースには「これ」を、また、こういったケースには「これ」を、なんて

対応コードの構文的な「これ」が何種類も書かれていますが、

その都度、何種類かある中からバラバラと「今回はこれ」なんて使っていられません。また実務者にとっても実用的でもありません。

 

何故、何がこんなにも ”望む結果を導き出させない” 原因なのかというと、

ズバリそれは、取得対象列に含まれる「空白セル」です。

それがたとえ、「データとしての空白」であったとしてもです。

ですので実務上、

心掛けたいPOINT

データ入力の最終行を調べたい場合は、基本的な前提として出来るだけ、

「使用行を数えるのはどの列か」を「空白セル」が含まれる列を取得の列にしない。

ということが肝心です。

  • データ行の先頭に番号を付与して「空白」の無いデータ列を作るなどの対策をしましょう。
  • どうしても空白行が出来てしまう場合は、データシート上なら、行削除をしてしまう。
    テンプレートシートなら、元々のシート設計でデータシートを作成してそこからのデータ転記になるようにしておく。

ということです。

 

解説としてはこのような順序で進めて行きます。

 

行数取得のキーワード Rows.Count

 

Rows.Count とは、「Rows」中学英語で習った複数形 Row(行)の全てということです。すべての行をCount(数えて)くださいということです。

答えは、エクセルバージョン2003なら「65536」、2007以降なら「1048576」になります。

 

最終行を取得する場合、この Rows.Count は重要です。

 

Endプロパティ

 

Endプロパティによって、指定したデータ入力のある範囲の終端セルを取得選択します。

上下左右4方向の指定が出来ます。

xlUp下から上方向へEnd(xlUp)
xlDown上から下方向へEnd(xlDown)
xlToleft右から左方向へEnd(xlToleft)
xlToright左から右方向へEnd(xlToright)

 

説明を進めるための例題を示します

 

この様な表を考えます。

表の開始行は4行目から、10行目と11行目が空白行となっています。

vbalastcell001

 

入力行を上から下方向へ数えてどこまでか xlDown

 

上から下方向へ数える時に、数え始めのセルを「Cells(4,1)」または「Range(“A4”)」とします。

上から下方向へ数える

構文的には、開始セル「Cells(4,1)」.下方向です「End(xlDown)」となります。

これはセルを選択したと同じ状態ですので、次に何を知りたいかで今回は「.Row」(行番号は?)と付け足します。

ちなみに、「.value」(値は?)などを付け足すことも出来ます。

End(xlDown)コード
Sub 行数計算A()

Dim Arow As Long, Aval As Variant

Arow = Worksheets("Sheet1").Cells(4, 1).End(xlDown).Row
Aval = Worksheets("Sheet1").Cells(4, 2).End(xlDown).Value

Debug.Print "Arow " & Arow & vbCrLf & "Aval " & Aval

End Sub

実行結果

見事に「空白」セルで停止してしまいました。(結果を意図するところは20行目のはずですが・・・)

vbalastcell002

 

 

入力行を下から上方向へ数えてどこまでか xlUp

 

数え始めの開始セルは、「Cells(Rows.Count,1)」または「Range(“A” & Rows.Count)」となります。

下から上方向へ数える

構文的には先ほどの下方向へ数える時とほぼ同じです。

「下から上方向に数える」というのが一番使用頻度が多いのではと思います。そういう意味で、先ほどのRows.Countは行番号取得のキーワードになるということです。

End(xlUp)コード
Sub 行数計算B()

Dim Arow As Long, Aval As Variant

Arow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
Aval = Worksheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Value

Debug.Print "Arow " & Arow & vbCrLf & "Aval " & Aval

End Sub

実行結果

実質的に、臨んだ実行結果になったと思います。

でも、データ表の中に空白行が混ざっているのは気になります。データ番号も飛び番号になってしまっています。

vbalastcell003

 

 

空白行を削除してデータ番号を整理する方法

 

この様に空白行やデータ番号の飛び番号を放置していては、バグの原因になりかねません。

そこで、この「End(xlDown)」と「End(xlUp)」を使って空白行を削除しておきます。

空白行を削除する

空白の無い一つのデータ集合体であれば、

チェック入力行を上から下方向へ数えても、下から上方向へ数えても最終行は同じになります。

もし同じにならないのなら、空白行が存在しているということです。

さらにその場所は、上から下方向に数えた時の最終行の次の行になります。

 

空白行削除コード
Sub 行数計算C()

Dim ArowD As Long, ArowU As Long
Dim i As Long, n As Long

ArowD = Worksheets("Sheet1").Cells(4, 1).End(xlDown).Row
ArowU = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row

Debug.Print "ArowD " & ArowD & vbCrLf & "ArowU " & ArowU

    For i = 1 To ArowU

        If ArowD <> ArowU Then
            Rows(ArowD + 1).Delete
        End If

'行を削除したので、全体の行数が変化しました。再度数える必要があります。
        ArowD = Worksheets("Sheet1").Cells(4, 1).End(xlDown).Row

    Next i

 '最終行を再確認します。コード組み立て的には必要ありません。
        ArowU = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row 
Debug.Print "ArowD " & ArowD & vbCrLf & "ArowU " & ArowU

    For n = 4 To ArowD
        Cells(n, 1).Value = n - 3
    Next n

End Sub

実行結果

このコードの実行で、空白行が削除され、データ番号も連続に振り直しされました。

vbalastcell004

 

実行前の「ArowDとArowU」は異なった数値になっていましたが、

実行後は同値に変化しました。

vbalastcell005

 

注意事項

  • データ番号はリストの整理番号としての利用になりますので、データ固有のID番号とは別物としてください。

 

 

データ入力済セルの最終行番号を取得する方法 まとめ

 

最初にも言いましたが、他にも最終行を取得する方法はいくつかあります。

でも実際問題、普通に行うコード組み立てでは、覚えることも使うことも全然必須ではありません。逆に必要ないです。

 

それよりも、データの「空白行」を作らない。

出来てしまっても「削除修正」を行っておくことに心血を注いだ方がいいです。

 

ということで、ここでは、「上から下方向へ」と「下から上方向へ」を知っておいてください。

これで吉になります。

また改めて、入力セルの列方向の数え方は記事にしたいと思います。

 

エクセルVBAを最初から勉強するために

 

エラー対処はエクセルVBAでも大きな課題です。

そのためには、エクセルVBAの基本構造も十分知っておくことが必要です。

そんな基本部分から勉強するための参考記事を書いています。

 

エクセルVBAの独習を始めるためのポイントについて vbastudyeyecatchエクセルVBAを独学で習得するためのポイントは?良書との出会いは重要 基礎知識習得のためのオンライン学習講座の参考記事 Udemy1eyecatchエクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。
  今回の記事はここまでです。
最後までご覧いただき有難うございました。

 

大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方
初めてのVBAの勉強、構えなくても気軽に始められる。
vbastudy020a
vbastudy021a

電子書籍版「大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方」をamazonで見てみる

(著者)大村あつし
(出版社)技術評論社
(税込価格)1,628円(本体1,480円+税)

学習書の新しい形です。
YouTubeと完全リンクした参考書です。入門と基礎を重点的に22本の動画で解説をしています。
ちょっとした空き時間を利用してでもスマホがあれば学習ができます。
動画は優しい語り口調で、視聴者にある意味安心感を与えてくれます。動画は5分から20分間ぐらいで22本の構成です。
文章解説と動画解説の関係性は、動画解説が主で、文章解説がサポートいう使い方もできます。

 

vbaintfixeyecatch
エクセルVBA関数で、数値の整数部分だけを分離します。 整数値取得のFix関数でなくInt関数の使用の場合でも、 他の関数との組み合わせで解決することが出来ます。 こんにちは、じゅんぱ店長(@junpa33)です。 今回のテーマは、数値の整 ...
続きを読む
vbarndeyecatch
エクセルVBAのRnd関数で乱数を取得します。 実用のためにはコードに簡単な加工をする必要があります。特に乱数値の整数化とRandomizeは必須です。 6.5兆通りのパスコードの生成方法も解説しています。 こんにちは、じゅんぱ店長(@ju ...
続きを読む
vbaroundupdowneyecatch
エクセルVBA 数値の切り上げ、切り捨てをするときには注意しなければいけません。 RoundUp関数とRoundDown関数を使う時に負の数が混在していると、そのままだと誤った計算結果になることがあります。 こんにちは、じゅんぱ店長(@ju ...
続きを読む
vbaroundeyecatch
エクセルVBAでも数値を四捨五入したい時は、Round関数を利用することが多いです。 Round関数の使い方はワークシートと同様ですが、ただ大きな注意点があります。 ここではその注意点も含めて使い方の説明を行います。 こんにちは、じゅんぱ店 ...
続きを読む
vbamaxminaveeyecatch
エクセルVBAで、ワークシート関数 Max・Min・Averageを利用して最大値・最小値・平均を求めます。 「簡単で短いエクセルVBAコード組み立て」を目指す上では、ワークシート関数は強い味方です。 こんにちは、じゅんぱ店長(@junpa ...
続きを読む
vbainsteeyecatch
InStr関数・InStrRev関数は、文字列操作系の関数の中でも最重要です。 この関数により指定の文字(列)の存在位置が取得できます。 そしてそれを目盛基準として、文字列操作をすることもできます。 こんにちは、じゅんぱ店長(@junpa3 ...
続きを読む
vbareplaceeyecatch
エクセルVBAで使える関数にReplace関数があります。 Replace関数は検索の文字列を指定の文字列に置換したり、削除したり出来ます。 利用価値の高い関数です。使い慣れておきましょう。 こんにちは、じゅんぱ店長(@junpa33)です ...
続きを読む
vbaselectcaseeyecatch
エクセルVBAで、必須の条件文。 その中の一つで、Select Case 条件分岐 ステートメントの使い方を説明します。 簡単なコード、可読性の向上が特徴のステートメントです。是非、知っておきましょう。 こんにちは、じゅんぱ店長(@junp ...
続きを読む
VBAValeyecatch
エクセルVBAのVal関数の使い方についてです。 「値を文字列型から数値型へ変換する」という機能があります。 データ型が不一致の場合、プログラムエラーでコード停止が発生することが良くあります。 こんにちは、じゅんぱ店長(@junpa33)で ...
続きを読む
VBAStringeyecatch
エクセルVBA String関数の使い方についてです。 「文字を指定した数だけ並べることが出来る」という機能の関数です。 この関数を使えば簡潔なコード記述で実行することが出来ます。 こんにちは、じゅんぱ店長(@junpa33)です。 今回は ...
続きを読む
vbajoineyecatch
エクセルVBAでJoin関数の使い方について説明します。 文字列を接続する関数ですが、 配列変数で文字列を要素化した時にはこれを使います。 また「区切り文字」も自由に設定できます。 こんにちは、じゅんぱ店長(@junpa33)です。 今回は ...
続きを読む
vbamideyecstch
エクセルVBAで文字列操作は、コード作成の中でも重要な部分です。 Mid・Right・Left関数は、その操作の中で重要な働きをする関数です。 文字列を切り出すこの関数の基本部分を説明します。 こんにちは、じゅんぱ店長(@junpa33)で ...
続きを読む
vbatrimeyecatch
Trim・RTrim・LTrimは文字列の端にあるスペースを取り除きます。 ちょっとのことですが、取り込みデータにスペースが付いていることでのエラーは発見修正が結構厄介です。 注意が必要です。 こんにちは、じゅんぱ店長(@junpa33)で ...
続きを読む
vbastrcstreyecatch
エクセルVBAで、Str関数とCStr関数に使い方とその違いについて説明します。 戻り値にちょっとした違いがあります。 使い方の違いでその後のコードの進行に影響が出ることがあり、なおざりにはできません。 こんにちは、じゅんぱ店長(@junp ...
続きを読む
vbaleneyecatch
Len関数の使い方ついて説明します。 エクセルVBAでプログラミングを行う時に、テキストデータを加工処理するには必須の関数です。 非常に有用な関数ですので、是非使えるようになっておきましょう。 こんにちは、じゅんぱ店長(@junpa33)で ...
続きを読む
VBACheckBoxeyecatch
エクセルシートで使う場合の、2種類あるチェックボックスの設置と使い方の違いを解説します。 一見簡単そうですが、 単純でない使い方をしたい時は、設置方法と設定方法を工夫する必要があります。 こんにちは、じゅんぱ店長(@junpa33)です。 ...
続きを読む
VBAOptionbuttoneyecatch
エクセルで書類を作成する時、項目を選択できるようにするのがオプションボタンです。 これには2種類あり、使い方にかかわる違いもあります。 詳しいオプションボタン設置方法と使い方のコツを解説します。 こんにちは、じゅんぱ店長(@junpa33) ...
続きを読む
vbamojisousaeyecatch
エクセルVBAコードで、ファイルの保存時に名前を付けて保存について、その時の年月日を付けたい時の設定方法についてです。 保存されたファイルがたくさん増えて行く中で、ファイルの判別で年月日を付けている(付けたいと思っている)人も多いでしょう。 ...
続きを読む
vbajyufukueyecatch
今回は、同じ項目を一つにまとめるためのエクセルVBAコードを紹介します。 多数銘柄の商品を複数の店で扱っている場合、商品銘柄集計表を作るには、商品銘柄の種類だけをリストにしないといけません。 こんにちは、じゅんぱ店長(@junpa33)です ...
続きを読む
vbafolderdeleteeyecatch
今回は、不要なフォルダをサクッと削除するエクセルVBAコードを紹介します。 削除の仕方は2つあります。VBA自身の機能を使うことと、FSOの機能を使うことの2つです。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAで、不 ...
続きを読む
vbadirkilleyecatch
今回は、フォルダに保存されている要らないファイルを削除するエクセルVBAコードを紹介します。 フォルダを開いて一つずつファイル名を確認して、ではなくて、コード実行一発でササッと完了します。 こんにちは、じゅんぱ店長(@junpa33)です。 ...
続きを読む
vbachdireyecatch
エクセルVBAのステートメントで「ChDir(チェインジディレクトリ)」というのがあります。 少々地味感のあるステートメントですが、この使い方のポイントを説明いたします。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAの ...
続きを読む
vbafindeyecatch001
今回は、データの検索方法で、エクセルVBAでできるメソッドについてです。 「FindとFindNextメソッド」の使い方と最速理解のコードの組み立て方を説明したいと思います。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルの検 ...
続きを読む
今回も、エクセルVBAで利用できるワークシート関数についてがテーマです。 この記事では、データナンバーなどから、その必要な値や数値を抽出する「Vloolup関数」について使い方を説明します。 こんにちは、じゅんぱ店長(@junpa33)です ...
続きを読む
vbaindexeyecatch001
今回も、エクセルVBAで利用できるワークシート関数についてがテーマです。 この記事では、データリストから必要な値や数値を取り出してくる「Index関数」について使い方を説明します。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセ ...
続きを読む
vbamatcheyecatch001
エクセルVBAで利用できる関数についてがテーマです。 今回は、データリストから必要な値や数値を取り出してくる「Match関数」について、使い方を説明します。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAでよく使うワーク ...
続きを読む
vbahairetu3eyecatch
エクセルVBAで変数を利用するとき、二次元配列変数を知っていれば何かと便利なことがあります。 今回はそんな配列変数をより実際に近い例題で説明していきます。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAのプログラムでは、 ...
続きを読む
vbahairetu2eyecatch
エクセルVBAで配列を利用する時、それに関わる関数やステートメントを利用すれば、 より簡潔にコードを作成することが出来ます。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBA 配列を扱うときに利用できる関数とステートメント ...
続きを読む
vbahairetueyecatch
エクセルVBAで変数を利用するとき、複数の同じ型で変数を設定したいときがあります。 そんな時、出番となるのが配列変数ということです。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAの1次元配列変数の使い方を説明します。 ...
続きを読む
vbabuttoneyecatch
エクセルVBAのプログラムを実行するのに、ワークシート上に設置したボタンのクリックでワンポチっとで行いたい。 そんなボタンの簡単設置方法を紹介します。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAで、シートにマクロ(プ ...
続きを読む
vbasumeyecatch
エクセルVBAで、羅列された数値の集計作業をパパッと熟していきたいときがありますよね。 それを簡単に行える方法としてSUM関数があります。今回はこのSUM関数の使い方についてです。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセ ...
続きを読む
vbainputboxeyecatch
エクセルVBAのプログラムで、利用者からの入力データを取り込んでコードを実行していくことがあります。 その簡潔な方法としてInputBoxがあります。今回はこのInputBoxの使い方についてです。 こんにちは、じゅんぱ店長(@junpa3 ...
続きを読む
vbalastcelleyecatch
エクセルVBAのプログラム作成で、入力データをその都度蓄積していく場合など、 既にデータの入っている最終セルの位置を調べたいという時が多くあります。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAのコード組み立てで、デー ...
続きを読む
vbawithstateeyecatch
エクセルVBAのコードの組み立てでは、視認性や可読性を上げるためにできるだけ記述を簡潔にしたいところです。 Withステートメントは、そういったコード記述を簡潔にする役割があります。 こんにちは、じゅんぱ店長(@junpa33)です。 エク ...
続きを読む
vbacleareyecatch
エクセルVBAでシートを再利用するために、一度内容すべてをクリアしたい時があります。 普通は、Clearメソッドを使ってクリア操作を行いますが・・・ こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAを組み上げる中で、シート ...
続きを読む
vbaoffseteyecatch
エクセルVBAで、セルやセルの選択範囲を移動させるのにOffsetプロパティがあります。 今回の「VBA最速で理解」は、この便利な「Offsetプロパティ」の使い方について説明します。 こんにちは、じゅんぱ店長(@junpa33)です。 エ ...
続きを読む
vbanameeyecatch
エクセルVBAで、アクティブセル、アクティブシート、アクティブブックという「現在参照中の・・・」というオブジェクトがあります。 今回の「VBA最速で理解」は、この「ActiveWorkbook」「ActiveSheet」「ActiveCel ...
続きを読む
vbaselacteyecatch
エクセルVBAで、そのコードを実行する先のオブジェクトに、フォーカスするためのメソッドに、「Select」と「Activate」があります。 今回は、このよく似た「Select」と「Activate」について説明します。 こんにちは、じゅん ...
続きを読む
vbavbekidoeyecatch
エクセルVBAを始めようとしたときに一番最初に戸惑うのが、「どうしたらVBAコードを書く表示画面になるのか?」だと思います。 今回は、この「どうしたら、その画面になるんだろう?」についての方法を説明します。 こんにちは、じゅんぱ店長(@ju ...
続きを読む
vbamsgboxeyecatch
エクセルVBAでユーザーフォームを使わなくても、簡単なユーザーとのやり取りならメッセージボックスでも可能です。 今回は、この「ユーザーへのメッセージや選択肢を提示する」ユーザーフォームについての説明をします。 こんにちは、じゅんぱ店長(@j ...
続きを読む
vbadoloopeyecatch
以前の記事でも書いたように、エクセルを使った業務で、「ループの処理」コードは重要な実行処理部分です。 今回は、このもう一つの「ループの処理」である「実行回数が限定されないループ処理」を行うコードについて説明します。 こんにちは、じゅんぱ店長 ...
続きを読む
vbafoldereyecatch
エクセルを使った業務で、「作成したファイルの保存」は作業の最後に必ず必要な部分です。 今回は、この「作成したファイルの保存」を行うための重要部分。保存先フォルダをVBAで指定する方法を説明します。 こんにちは、じゅんぱ店長(@junpa33 ...
続きを読む
vbasengeneyecatch
エクセルVBAのコード組み立てで使う変数。「この変数を使いますよ!」というのが「変数の宣言」です。 今回は、この変数の宣言についてです。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBA のコード組立ての中で、変数の宣言は ...
続きを読む
vbaifjyokeneyecatch
エクセルVBAのコード組み立てで最も必要な、最もよく使うメソッドの1つで「If~Then~Else」があります。 今回はこの「If~Then~Else」メソッドについて設定条件の絞り方のポイントを説明します。 こんにちは、じゅんぱ店長(@j ...
続きを読む
VBACopyeyecatch
エクセルVBAのコード組み立てで、よく使うメソッドの1つで「Copy」メソッドがあります。 今回はこの「Copy」メソッドの使い方を説明します。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルVBAで、ワークシートのコピーをを ...
続きを読む
VBAGotoeyecatch001
エクセルVBAのコードで、Gotoステートメントは嫌われ系のグループにはいっています。 それでも、GotoがあるのでVBAコード組み立てがスムーズに、楽に、なる事も多いと言うのも事実です。 こんにちは、じゅんぱ店長(@junpa33)です。 ...
続きを読む
fornextirekoeyecatch
エクセルVBAのコード組み立てで、非常によく使うステートメントの一つにFor~Nextでのループ処理があります。 今回はこのFor~Nextステートメントの使い方を説明します。 こんにちは、じゅんぱ店長(@junpa33)です。 エクセルV ...
続きを読む

 

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。