範囲の操作
メニューを表示するにはスワイプしてください
範囲の選択
探索時に使用、実際のコードでは .Select を避け、範囲を直接参照:
ws.Range("A1:I1").Select ' fine for exploring
ws.Range("A1:I1").Font.Bold = True ' better — skips Select entirely
Offset
自身を基準に参照を移動 — (行数, 列数) の形式で指定し、負の値で上または左に移動:
Dim orderCell As Range
Set orderCell = ws.Range("A2") ' ORD1001
Debug.Print orderCell.Offset(1, 0).Value ' one row down → ORD1002
Debug.Print orderCell.Offset(0, 2).Value ' two columns right → Acme Corp
Debug.Print orderCell.Offset(-1, 0).Value ' one row up → the header, "Order ID"
リサイズ
範囲の左上のセルを固定したまま、カバーする行数や列数を変更:
Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9) ' now covers A1:I1, the full header
OffsetとResizeを組み合わせることで、事前に行数を知らなくても「ヘッダーの下すべて」を取得可能:
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
' dataRange now covers A2:I6 — every order, no header
名前付き範囲
範囲にわかりやすい英語名を付けて、アドレスの代わりに参照可能:
ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count
課題
- Range("A2")(ORD1001)から開始し、
Offsetを使って2行下(ORD1003)の注文のProductとTotalを出力("A4"、"D4"、"H4"は直接記述しない)。 CurrentRegion、Offset、Resizeを組み合わせてデータ行のみ(ヘッダー除く)を選択し、その範囲の行数を出力。- データのみの範囲をカバーする名前付き範囲
OrdersDataを作成し、イミディエイトウィンドウで名前で参照できることを確認。
ヒント
1. A2 から Offset を使用して ORD1003 へ移動
Range変数をA2に設定 — これがアンカーセルであり、本章の例と同じです。- 「2 行下」「同じ列」は、
Offsetの第1引数(行)が 2、第2引数(列)が 0 となり、Product 列を指します。 - Total は異なる列ですが、同じ行 — そのため、2 回の
Offset呼び出しで変更するのは列のオフセット値のみで、行の値は変わりません。 - A2 の位置から列を数えます:Product は Order ID から右に 3 列、Total は右に 7 列です。
2. CurrentRegion、Offset、Resize の組み合わせ
CurrentRegionのA1でテーブル全体(ヘッダー含む)を取得します。Offset(1, 0)でそのブロック全体を 1 行下にずらし、ヘッダーを除外します。Resizeでは、ずらした分だけ行数を減らす必要があります。そうしないと、データ範囲が 1 行分はみ出してしまいます。
3. 名前付き範囲の作成とテスト
- 名前付き範囲は
ThisWorkbook.Names.Addで追加し、Name:=とRefersTo:=を指定します。ヒント2の範囲式をそのまま再利用できます。 - その後参照するには、
Range("OrdersData")を使用します — 名前は変数ではなく単なる文字列となります。
解答例
Sub NavigateWithoutHardcoding()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
' --- 1. Offset from A2 to reach ORD1003 ---
Dim orderCell As Range
Set orderCell = ws.Range("A2")
Debug.Print orderCell.Offset(2, 3).Value ' Product
Debug.Print orderCell.Offset(2, 7).Value ' Total
' --- 2. CurrentRegion + Offset + Resize ---
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
Debug.Print "Data rows: " & dataRange.Rows.Count
' --- 3. Named range ---
ThisWorkbook.Names.Add Name:="OrdersData", RefersTo:=dataRange
End Sub
Sub を実行(F5)し、イミディエイトウィンドウ(Ctrl+G)で次を入力:
?Range("OrdersData").Rows.Count
すべて明確でしたか?
フィードバックありがとうございます!
セクション 3. 章 3
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
範囲の操作
範囲の選択
探索時に使用、実際のコードでは .Select を避け、範囲を直接参照:
ws.Range("A1:I1").Select ' fine for exploring
ws.Range("A1:I1").Font.Bold = True ' better — skips Select entirely
Offset
自身を基準に参照を移動 — (行数, 列数) の形式で指定し、負の値で上または左に移動:
Dim orderCell As Range
Set orderCell = ws.Range("A2") ' ORD1001
Debug.Print orderCell.Offset(1, 0).Value ' one row down → ORD1002
Debug.Print orderCell.Offset(0, 2).Value ' two columns right → Acme Corp
Debug.Print orderCell.Offset(-1, 0).Value ' one row up → the header, "Order ID"
リサイズ
範囲の左上のセルを固定したまま、カバーする行数や列数を変更:
Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9) ' now covers A1:I1, the full header
OffsetとResizeを組み合わせることで、事前に行数を知らなくても「ヘッダーの下すべて」を取得可能:
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
' dataRange now covers A2:I6 — every order, no header
名前付き範囲
範囲にわかりやすい英語名を付けて、アドレスの代わりに参照可能:
ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count
課題
- Range("A2")(ORD1001)から開始し、
Offsetを使って2行下(ORD1003)の注文のProductとTotalを出力("A4"、"D4"、"H4"は直接記述しない)。 CurrentRegion、Offset、Resizeを組み合わせてデータ行のみ(ヘッダー除く)を選択し、その範囲の行数を出力。- データのみの範囲をカバーする名前付き範囲
OrdersDataを作成し、イミディエイトウィンドウで名前で参照できることを確認。
ヒント
1. A2 から Offset を使用して ORD1003 へ移動
Range変数をA2に設定 — これがアンカーセルであり、本章の例と同じです。- 「2 行下」「同じ列」は、
Offsetの第1引数(行)が 2、第2引数(列)が 0 となり、Product 列を指します。 - Total は異なる列ですが、同じ行 — そのため、2 回の
Offset呼び出しで変更するのは列のオフセット値のみで、行の値は変わりません。 - A2 の位置から列を数えます:Product は Order ID から右に 3 列、Total は右に 7 列です。
2. CurrentRegion、Offset、Resize の組み合わせ
CurrentRegionのA1でテーブル全体(ヘッダー含む)を取得します。Offset(1, 0)でそのブロック全体を 1 行下にずらし、ヘッダーを除外します。Resizeでは、ずらした分だけ行数を減らす必要があります。そうしないと、データ範囲が 1 行分はみ出してしまいます。
3. 名前付き範囲の作成とテスト
- 名前付き範囲は
ThisWorkbook.Names.Addで追加し、Name:=とRefersTo:=を指定します。ヒント2の範囲式をそのまま再利用できます。 - その後参照するには、
Range("OrdersData")を使用します — 名前は変数ではなく単なる文字列となります。
解答例
Sub NavigateWithoutHardcoding()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
' --- 1. Offset from A2 to reach ORD1003 ---
Dim orderCell As Range
Set orderCell = ws.Range("A2")
Debug.Print orderCell.Offset(2, 3).Value ' Product
Debug.Print orderCell.Offset(2, 7).Value ' Total
' --- 2. CurrentRegion + Offset + Resize ---
Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
Debug.Print "Data rows: " & dataRange.Rows.Count
' --- 3. Named range ---
ThisWorkbook.Names.Add Name:="OrdersData", RefersTo:=dataRange
End Sub
Sub を実行(F5)し、イミディエイトウィンドウ(Ctrl+G)で次を入力:
?Range("OrdersData").Rows.Count
すべて明確でしたか?
フィードバックありがとうございます!
セクション 3. 章 3