部品_範囲設定_固定
SetRange_Fixed
https://feelcodelab.com/vba_parts/setrange_fixed/
・開始行・開始列・終了行・終了列を、すべて数字で指定して、1つの範囲(Range)を返す ・最終行の取得は行わない(最終行を使いたいときは、GetLastRow の結果を終了行に渡す) ・列が1列だけの範囲も、複数列の範囲も、この部品で作る(開始列と終了列に同じ値を渡すと1列になる) ★ この部品は Sub(プロシージャ)ではなく「Function(関数)」で、Range を返す
土台
取得
範囲
★【最重要】ブック(vWb)とシート名(vSheetName)は、必ず引数で指定する(省略できない)
→ ThisWorkbook = このマクロが入っているブック / ActiveWorkbook = いまアクティブなブック
→ ファイルを開く部品の後は、ActiveWorkbook が、開いたファイルに切り替わる。
開いた直後に、ActiveWorkbook を変数へ控えて、その変数を渡す
★【最重要】戻り値は Range(オブジェクト)なので、受け取るときは必ず Set を使う
・開始行・開始列・終了行・終了列は、すべて 1 以上の整数で、
終了行は開始行以上、終了列は開始列以上であること
→ 設定の誤りは、Nothing や False ではなく、原因を示すエラーで止まる(Err.Raise)
・GetLastRow の結果を終了行に渡すときは、「データがない場合は 1 が返る」点に注意する
→ 見出しの行より下にデータがあるかは、呼び出し側で先に確認する
・Offset / Find / Resize / With は禁止・なし(土台の部品。他の部品を参照しない。単独で使用可能) ・組み合わせ:f_GetLastRow → f_SetRange_Fixed (最終行を取得してから、その行を終了行として範囲を作る)
・特になし(マッピング表等は不要)
vWb : 対象のブック(Workbook)※必須(省略できない) vSheetName : 範囲を作るシートのシート名(String) vStartRow : 開始行の行番号(Long) vStartCol : 開始列の列番号(Long) vEndRow : 終了行の行番号(Long) vEndCol : 終了列の列番号(Long)
Range : 指定した範囲(開始行・開始列から、終了行・終了列まで)
Range
Function 部品_範囲設定_固定( _
ByVal vWb As Workbook, _
ByVal vSheetName As String, _
ByVal vStartRow As Long, _
ByVal vStartCol As Long, _
ByVal vEndRow As Long, _
ByVal vEndCol As Long) As Range
Set 部品_範囲設定_固定 = f_SetRange_Fixed(vWb, vSheetName, vStartRow, vStartCol, vEndRow, vEndCol)
End Function
Function f_SetRange_Fixed( _
ByVal vWb As Workbook, _
ByVal vSheetName As String, _
ByVal vStartRow As Long, _
ByVal vStartCol As Long, _
ByVal vEndRow As Long, _
ByVal vEndCol As Long) As Range
Dim ws As Worksheet
Set f_SetRange_Fixed = Nothing
If vWb Is Nothing Then
Err.Raise vbObjectError + 1010, "f_SetRange_Fixed", _
"ブック(vWb)が設定されていません(Nothing)。"
End If
On Error Resume Next
Set ws = vWb.Worksheets(vSheetName)
On Error GoTo 0
If ws Is Nothing Then
Err.Raise vbObjectError + 1011, "f_SetRange_Fixed", _
"シート「" & vSheetName & "」が、ブック「" & vWb.Name & "」に存在しません。"
End If
If vStartRow < 1 Or vStartCol < 1 Or vEndRow < 1 Or vEndCol < 1 Then
Err.Raise vbObjectError + 1007, "f_SetRange_Fixed", _
"行番号・列番号は 1 以上を指定してください" & _
"(開始行=" & vStartRow & "、開始列=" & vStartCol & _
"、終了行=" & vEndRow & "、終了列=" & vEndCol & ")。"
End If
If vEndRow < vStartRow Or vEndCol < vStartCol Then
Err.Raise vbObjectError + 1008, "f_SetRange_Fixed", _
"終了が開始より前になっています" & _
"(開始行=" & vStartRow & "、終了行=" & vEndRow & _
"、開始列=" & vStartCol & "、終了列=" & vEndCol & ")。"
End If
If vEndRow > ws.Rows.Count Or vEndCol > ws.Columns.Count Then
Err.Raise vbObjectError + 1009, "f_SetRange_Fixed", _
"シートの上限(" & ws.Rows.Count & "行・" & ws.Columns.Count & "列)を超えています" & _
"(終了行=" & vEndRow & "、終了列=" & vEndCol & ")。"
End If
Set f_SetRange_Fixed = ws.Range( _
ws.Cells(vStartRow, vStartCol), _
ws.Cells(vEndRow, vEndCol))
End Function<例1:見出し(2行目)から、最終行までの A列~B列>
Dim lastRow As Long
Dim rng As Range
lastRow = 部品_最終行取得(ThisWorkbook, "転記元", 1) '1列目で最終行を取得
If lastRow < 3 Then
MsgBox "データがありません" '見出し(2行目)の下にデータがない
Exit Sub
End If
Set rng = 部品_範囲設定_固定(ThisWorkbook, "転記元", 2, 1, lastRow, 2)
<例2:行を手動で決める>
Set rng = 部品_範囲設定_固定(ThisWorkbook, "転記元", 3, 1, 20, 2) 'A3~B20
<例3:1列だけの範囲>
Set rng = 部品_範囲設定_固定(ThisWorkbook, "転記元", 3, 4, 8, 4) 'D3~D8 1.0
2026-10-27