部品_範囲設定_行可変
SetRange_VariableRows
https://feelcodelab.com/vba_parts/setrange_variablerows/
・開始行から、指定した列の最終行までを、行数可変の範囲(Range)にして返す ・最終行の取得と、範囲を作ることを、1つにまとめた部品(内部で GetLastRow と SetRange_Fixed を使う) ・開始行の下にデータがない場合は、Nothing を返す ★ この部品は Sub(プロシージャ)ではなく「Function(関数)」で、Range を返す
応用
取得
範囲
★【最重要】ブック(vWb)とシート名(vSheetName)は、必ず引数で指定する(省略できない)
→ ThisWorkbook = このマクロが入っているブック / ActiveWorkbook = いまアクティブなブック
→ ファイルを開く部品の後は、ActiveWorkbook が、開いたファイルに切り替わる。
開いた直後に、ActiveWorkbook を変数へ控えて、その変数を渡す
★【最重要】戻り値は Range(オブジェクト)なので、受け取るときは必ず Set を使う
★【最重要】データがないときは Nothing が返るので、受け取った直後に Nothing かどうかを確認する
→ Nothing のまま後続の部品へ渡すと、範囲消去などが、Nothing のエラー(1014)で止まる
・最終行は、キー列(vKeyCol)の、最後にデータが入っている行で決まる
→ 途中に空白行があっても、キー列の最後のデータの行までが範囲になる
→ キー列は、空白のない列(番号や名前など)を指定する
・開始行が 1 行目で、シートが空の場合は、GetLastRow が 1 を返すため、Nothing ではなく、1 行の範囲が返る
→ 見出し行がある表では、開始行を 2 以上にして使う
・開始行・開始列・終了列・キー列は、すべて 1 以上の整数で、終了列は開始列以上であること
→ 設定の誤りは、Nothing や False ではなく、原因を示すエラーで止まる(Err.Raise)
→ データがないときでも、設定の誤りは、必ず検出する
・中で呼んでいる部品(最終行取得・範囲設定_固定)が出すエラーは、この部品の名前を付けて、出し直される
→ エラー番号は、そのまま変わらない。エラーの説明の先頭に、
「部品_範囲設定_行可変 の中(呼んでいた部品名):」が付く
・最終行から、但し書きなどの行を除きたいときは、この部品ではなく、
GetLastRow の結果から行を引いて SetRange_Fixed に渡す
・Offset / Find / Resize / With は禁止・f_GetLastRow(部品_最終行取得)が必要
・キー列の最終行の取得に使用
・f_SetRange_Fixed(部品_範囲設定_固定)が必要
・範囲を作ることと、行番号・列番号の確認に使用
・組み合わせ:f_SetRange_VariableRows → f_ClearRange_Contents / f_ClearRange_All など
(作った範囲を、範囲を操作する部品へ渡す)・特になし(マッピング表等は不要)
vWb : 対象のブック(Workbook)※必須(省略できない) vSheetName : 範囲を作るシートのシート名(String) vStartRow : 開始行の行番号(Long) vStartCol : 開始列の列番号(Long) vEndCol : 終了列の列番号(Long) vKeyCol : 最終行を判定するキー列の列番号(Long)
Range : 開始行から、キー列の最終行まで、開始列から終了列までの範囲
開始行の下にデータがない場合は NothingRange
Function 部品_範囲設定_行可変( _
ByVal vWb As Workbook, _
ByVal vSheetName As String, _
ByVal vStartRow As Long, _
ByVal vStartCol As Long, _
ByVal vEndCol As Long, _
ByVal vKeyCol As Long) As Range
Set 部品_範囲設定_行可変 = f_SetRange_VariableRows(vWb, vSheetName, vStartRow, vStartCol, vEndCol, vKeyCol)
End Function
Function f_SetRange_VariableRows( _
ByVal vWb As Workbook, _
ByVal vSheetName As String, _
ByVal vStartRow As Long, _
ByVal vStartCol As Long, _
ByVal vEndCol As Long, _
ByVal vKeyCol As Long) As Range
Dim lastRow As Long
Dim endRow As Long
Dim rng As Range
Dim errNum As Long
Dim stepName As String
Dim errDesc As String
Set f_SetRange_VariableRows = Nothing
If vStartRow < 1 Or vStartCol < 1 Or vEndCol < 1 Or vKeyCol < 1 Then
Err.Raise vbObjectError + 1007, "f_SetRange_VariableRows", _
"行番号・列番号は 1 以上を指定してください" & _
"(開始行=" & vStartRow & "、開始列=" & vStartCol & _
"、終了列=" & vEndCol & "、キー列=" & vKeyCol & ")。"
End If
If vEndCol < vStartCol Then
Err.Raise vbObjectError + 1008, "f_SetRange_VariableRows", _
"終了列が、開始列より前になっています(開始列=" & vStartCol & "、終了列=" & vEndCol & ")。"
End If
On Error GoTo ErrWrap
stepName = "最終行取得"
lastRow = f_GetLastRow(vWb, vSheetName, vKeyCol)
endRow = lastRow
If endRow < vStartRow Then endRow = vStartRow
stepName = "範囲設定_固定"
Set rng = f_SetRange_Fixed(vWb, vSheetName, vStartRow, vStartCol, endRow, vEndCol)
If lastRow >= vStartRow Then Set f_SetRange_VariableRows = rng
Exit Function
ErrWrap:
errNum = Err.Number
errDesc = Err.Description
Err.Raise errNum, "f_SetRange_VariableRows", _
"部品_範囲設定_行可変 の中(" & stepName & "):" & errDesc
End Function<例1:見出し(2行目)の下から、最終行までの A列~B列>
Dim rng As Range
Set rng = 部品_範囲設定_行可変(ThisWorkbook, "転記元", 3, 1, 2, 1) '3行目から、1列目の最終行まで
If rng Is Nothing Then
MsgBox "データがありません"
Exit Sub
End If
<例2:転記先の表データを消す>
Set rng = 部品_範囲設定_行可変(ThisWorkbook, "転記先", 3, 1, 4, 1) 'A3~D列の最終行
If Not rng Is Nothing Then
If 部品_範囲消去_値のみ(rng) = False Then MsgBox "消去に失敗しました": Exit Sub
End If
<例3:但し書きの2行を除く場合は、この部品を使わない>
lastRow = 部品_最終行取得(ThisWorkbook, "帳票", 1)
lastRow = lastRow - 2
Set rng = 部品_範囲設定_固定(ThisWorkbook, "帳票", 3, 1, lastRow, 5) 1.0
2026-10-29