最終行、最終列、最終セルの取得 

最終行/列/セルを取得する

最終情報アクセスに関して各方法を記載。
用途に応じて適宜使用されたし。

'最終行、最終列の取得
Sub debugWriteLastLines()
    'ある行から下へ
    Dim lastRowToBottom As Integer: lastRowToBottom = Cells(1, 1).End(xlDown).ROW
    'ある列から右へ
    Dim lastColToRight As Integer: lastColToRight = Cells(1, 1).End(xlToRight).COLUMN
    '最終行から上へ
    Dim lastRowToTop As Integer: lastRowToTop = Cells(Rows.Count, 1).End(xlUp).ROW
    '最終列から左へ
    Dim lastColToLeft As Integer: lastColToLeft = Cells(1, Columns.Count).End(xlToLeft).COLUMN
    
    Debug.Print lastRowToBottom
    Debug.Print lastColToRight
    Debug.Print lastRowToTop
    Debug.Print lastColToLeft
    Debug.Print Cells(lastRowToBottom, lastColToRight)
    Debug.Print Cells(lastRowToTop, lastColToLeft)
End Sub

'使用範囲の最終セルを取得
Sub findUsedRangeLastCell()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Debug.Print ws.UsedRange.Address
    Dim lastCellAddress As String: lastCellAddress = ws.UsedRange(ws.UsedRange.Count).Address
    Dim lastCellRow As String: lastCellRow = Range(lastCellAddress).ROW
    Dim lastCellColumn As String: lastCellColumn = Range(lastCellAddress).COLUMN
    Debug.Print lastCellAddress
    Debug.Print lastCellRow
    Debug.Print lastCellColumn
End Sub

'指定されたシートの使用範囲最終セルを取得する
Function usedLastRange(ws As Worksheet)
    Dim addressArray As Variant
    addressArray = Split(ws.UsedRange.Address, ":")
    If UBound(addressArray) = 0 Then
        Set lastRange = ws.Range(Split(ws.UsedRange.Address, ":")(0))
    Else
        Set lastRange = ws.Range(Split(ws.UsedRange.Address, ":")(1))
    End If
    Set usedLastRange = lastRange
End Function

注意

行のグループ化をした状態で実施すると折りたたまれた行にある値はスキップされるから想定通りの値が取れないケースを確認している。要注意。
フィルタもたぶん一緒じゃないかな。注意した方がいい。

指定回数分移動したセルを取得

あるセルから下に向かって複数回移動したセルをとりたいときのソース。
上記の各種方向に移動するものと組み合わせて使用するとGood。

    '呼び出し
    Set baseSectionInputStartRange = getBottomEndRange(.Cells(1, 3), 1)
'指定されたシートのセルから指定回数分下移動したセルを返す
Function getBottomEndRange(argRange As Range, argTimes As Integer)
    Dim returnRange As Range
    Set returnRange = argRange
    For i = 1 To argTimes
        Set returnRange = topSheet.Range(returnRange.Address).End(xlDown)
    Next
    Set getBottomEndRange = returnRange
End Function

    '呼び出し
    Set replaceRightEndRange = getRightEndRange(getShiftRange(customSettingCurrentRange, -1, 0), 1)
'指定されたシートのセルから指定回数分右移動したセルを返す
Function getRightEndRange(argRange As Range, argTimes As Integer)
    Dim returnRange As Range
    Set returnRange = argRange
    For i = 1 To argTimes
        Set returnRange = topSheet.Range(returnRange.Address).End(xlToRight)
    Next
    Set getBottomEndRange = returnRange
End Function

範囲の右下セルを取得する(2022/12/26改訂)

表を配列形式でとりたいときに、使用する。
ヘッダフラグはヘッダで右方向の終端セルを取得するかどうかを指定する。
ライトタイムズは右方向に何回移動するかを指定する。

'#説明:指定されたセルを起点とした範囲の右下セルを取得する。右移動にヘッダを使うか、右移動を何回行うかを指定できる
'#引数:startRange:開始位置セル、headerFlag:ヘッダ行で右移動をするか、rightTimes:右移動回数
'#戻値:始点から取得できた右下のセル
Function regionEndRange(startRange As Range, Optional headerFlag As Boolean = False, Optional rightTimes As Integer = 1)
        Dim rightEndRange As Range
        Dim tempRange As Range
        Set tempRange = startRange
        'ヘッダフラグがTRUEの場合、ヘッダで右方向の最終列を取得する
        If headerFlag Then
            Set tempRange = startRange.Offset(-1, 0)
        End If
        
        Set rightEndRange = getRightEndRange(tempRange, rightTimes)
        Dim bottomEndRange As Range
        If getBottomEndRange(startRange, 1).Value <> "" Then
            Set bottomEndRange = getBottomEndRange(startRange, 1)
        Else
            Set bottomEndRange = startRange
        End If
        '引数の開始セルから行方向、列方向にずらしたセルを戻り値に設定
        Set regionEndRange = startRange.Offset(bottomEndRange.row - startRange.row, rightEndRange.Column - startRange.Column)
End Function


コメント