最近仕事で受注・発注業務のオートメーション化をするにあたって、VBAで良く使う「シート内で利用している最終行番号を取得する」 と 「特定のセルを基準に一番下のセルの行番号を取得する」ユーザー定義関数をメモとして残しておきます。
シート名を引数にユーザー定義関数を記述
Function maxRow(ByVal sheetName As String) As Integer maxRow = Sheets(sheetName).UsedRange.Rows.Count End Function
これで関数の定義はできました。
シートの名前を指定して関数を呼び出す
Debug.Print maxRow("sheet1")
定義した関数を呼び出すにはmaxRow()
のカッコ内に最終行番号を取得したいシート名を入れる。
使用例
下記のようなワークシートで先程の関数を呼び出すと「5」が返されます。
最終行まで間が空いていてもカウントされる
下記のような場合、6~8行目まで空白になっていますが9行目にデータが入力されているので戻り値は「9」となります。
特定のセルを基準に一番下のセルの行番号を取得したい場合
先程のユーザー定義関数で最終行を取得する場合は行の途中で空白があっても飛び越えて一番下の行を取得します。 しかし、下記のようにA列の最終行番号を取得したいといった場合には別の方法を使いましょう。
今度はmaxRowCell
という名前の関数を作ってみました。
シート名を指定した後ろが.range(rangeName).End(xlDown).Row
に変わっています。
こう記述すると指定したセルの列における最終行番号を返します。
Function maxRowCell(ByVal sheetName As String, ByVal rangeName As String) As Integer maxRowCell = Sheets(sheetName).range(rangeName).End(xlDown).Row End Function
シートの名前とセル名を指定して関数を呼び出す
Debug.Print maxRowCell("sheet1", "A1")
このように呼び出すとイミディエイトウィンドウには「5」と表示されます。
概ねこれらの2パターンで最終行の取得は可能なので、for文の繰り返し回数の指定などに応用すればかなり使い勝手のいい関数かと思います。
ついでなので、For文での繰り返し処理のやり方も書いておきます。
最終行まで繰り返し処理を行うFor文の書き方
下記のようなシートがあったとして、A列のアルファベットに応じてB列に1から順番に数字を入力していきたい場合。
まずはA列の最終行番号を取得してB列の何行目まで入力すれば良いのかを計算します。
A列の最終行番号を取得したいのでmaxRowCell
を使うことにします。
For i = 1 To maxRowCell("sheet1", "A1") range("B" & i).Value = i Next
こんな感じですね。
For文の「i」は繰り返すごとに1づつカウントアップされていくのでrange("B" & i)
と記述すれば繰り返すごとに B1→B2→B3 となっていくわけです。
そしてそのセルの中身に今回は数字を入れるだけなのでvalue = i
で 1→2→3 と入力されていきます。
実行結果
無事にB列に1~5の数字が入りましたね。
このようにシートや列の最終行番号を取得することでいろいろな繰り返し処理の変数へ当てはめることができるので、自動でデータの入力や数式の入力を行うマクロを作る際にはとても重宝しています。 ただ、もしこれよりも良い書き方などがあればコメントなどで教えてもらえると助かります。
↓これで勉強してます
- 作者: 吉田拳
- 出版社/メーカー: 技術評論社
- 発売日: 2016/06/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る