【Excel VBA】特定のシートの最終行を取得するオリジナル関数(データが必ず入っている列がわからない場合)

オリジナルVBA関数

何かとよく使うExcelシートの最終行。

A列がIDなどでデータが必ず入っているなら↓の書き方で問題ないのですが、

最終行 = Sheet1.Cells(Rows.Count,1).End(xlUp).Row

A列のすべての行に必ずデータが入っているとは限らない、B列もC列も、どの列が必須の列かわからない場合に最終行を取得するのってどうすればいいだろう。

Sheet1.Cells(1,1).CurrentRegion.SpecialCells(xlLastCell).Row

という書き方をしてみたこともあるのですが、これだと正しく最終行が取得できないときがあるので断念。

そこで、「A列から順番に10列分くらい調べて最も行数の大きかった数を最終行とする」みたいな関数を作成して使っています。

そのオリジナル関数で最終行を取得する場合は↓のように書きます。

変数 = getLastRow(sh01) ※sh01はシートのオブジェクト名

シートを指定して、そのシートの最終行の数値を返す関数です。シートの指定はオブジェクト名で行う前提です。今回の場合はsh01がシートのオブジェクト名です。

【 初心者から財務プロまで 】エクセルで学ぶビジネス・シミュレーション講座 マスターコース

最終行を簡単に取得するオリジナル関数(Excel VBA)

オリジナル関数getLastRowの内容は下記の通り。

'shObjシートの最終行を取得するオリジナル関数
'A列から10列分の最終行を調べて一番大きい数字を返す
'shObjはシートのオブジェクト名やシートオブジェクト変数を指定
Function getLastRow(shObj As Object) As Long

    With shObj
        Dim c As Long
        Dim maxR As Long
        Dim r As Long
        
        maxR = 1
        'ここを1 to 20とすると20列分調べます。適宜調整ください。
        For c = 1 To 10
        
            r = .Cells(Rows.Count, 1).End(xlUp).row
            If r > maxR Then
                maxR = r
            End If
        
        Next c
        
    End With
    
    getLastRow = maxR
    
End Function

実際に使うときはこんな感じ↓

Sub testFunction()

    Dim r As Long
    r = getLastRow(sh01)
    
    MsgBox r

End Sub

上のプログラムで指定している「sh01」シートの内容が↓だった場合、getLastRow関数の結果は「6」となります。

ちなみに、シートのオブジェクト名は↓画像の赤丸のところを見るとわかります。

  • 上の赤丸1の「sh01(Sheet1)」のSheet1は、シート名だよ
  • 赤丸2のところでシートオブジェクト名を変更できるよ

最初に関数を作成する手間はありますが、しょっちゅう最終行を取得するならその手間を差し引いても楽になりますのでほんとにおすすめです。

ぜひお試しあれ!

みんなのディープラーニング講座 ゼロからChainerとPythonで学ぶ深層学習の基礎

コメント

タイトルとURLをコピーしました