Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 範囲の操作 | Excelデータの操作
ビジネス自動化のためのExcel VBA

範囲の操作

メニューを表示するにはスワイプしてください

範囲の選択

探索時に使用、実際のコードでは .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"
図 3.3

リサイズ

範囲の左上のセルを固定したまま、カバーする行数や列数を変更:

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

課題

  1. Range("A2")(ORD1001)から開始し、Offsetを使って2行下(ORD1003)の注文のProductとTotalを出力("A4"、"D4"、"H4"は直接記述しない)。
  2. CurrentRegionOffsetResizeを組み合わせてデータ行のみ(ヘッダー除く)を選択し、その範囲の行数を出力。
  3. データのみの範囲をカバーする名前付き範囲OrdersDataを作成し、イミディエイトウィンドウで名前で参照できることを確認。
ヒント
expand arrow

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 の組み合わせ

  • CurrentRegionA1 でテーブル全体(ヘッダー含む)を取得します。
  • Offset(1, 0) でそのブロック全体を 1 行下にずらし、ヘッダーを除外します。
  • Resize では、ずらした分だけ行数を減らす必要があります。そうしないと、データ範囲が 1 行分はみ出してしまいます。

3. 名前付き範囲の作成とテスト

  • 名前付き範囲は ThisWorkbook.Names.Add で追加し、Name:=RefersTo:= を指定します。ヒント2の範囲式をそのまま再利用できます。
  • その後参照するには、Range("OrdersData") を使用します — 名前は変数ではなく単なる文字列となります。
解答例
expand arrow
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に質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の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"
図 3.3

リサイズ

範囲の左上のセルを固定したまま、カバーする行数や列数を変更:

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

課題

  1. Range("A2")(ORD1001)から開始し、Offsetを使って2行下(ORD1003)の注文のProductとTotalを出力("A4"、"D4"、"H4"は直接記述しない)。
  2. CurrentRegionOffsetResizeを組み合わせてデータ行のみ(ヘッダー除く)を選択し、その範囲の行数を出力。
  3. データのみの範囲をカバーする名前付き範囲OrdersDataを作成し、イミディエイトウィンドウで名前で参照できることを確認。
ヒント
expand arrow

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 の組み合わせ

  • CurrentRegionA1 でテーブル全体(ヘッダー含む)を取得します。
  • Offset(1, 0) でそのブロック全体を 1 行下にずらし、ヘッダーを除外します。
  • Resize では、ずらした分だけ行数を減らす必要があります。そうしないと、データ範囲が 1 行分はみ出してしまいます。

3. 名前付き範囲の作成とテスト

  • 名前付き範囲は ThisWorkbook.Names.Add で追加し、Name:=RefersTo:= を指定します。ヒント2の範囲式をそのまま再利用できます。
  • その後参照するには、Range("OrdersData") を使用します — 名前は変数ではなく単なる文字列となります。
解答例
expand arrow
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
some-alt