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, щоб вивести Product і Total для замовлення на два рядки нижче (ORD1003) — не вводячи "A4", "D4" чи "H4".
  2. Використайте разом CurrentRegion, Offset і Resize, щоб вибрати лише рядки з даними (без заголовка) і вивести кількість рядків у цьому діапазоні.
  3. Створіть іменований діапазон з назвою OrdersData, який охоплює той самий діапазон лише з даними, і переконайтеся, що ви можете звертатися до нього за назвою у Вікні негайного виконання.
Підказка
expand arrow

1. Використання Offset від A2 для досягнення ORD1003

  • Почніть із встановлення змінної Range на A2 — це ваша опорна клітинка, як у прикладі з розділу.
  • "Два рядки нижче" та "той самий стовпець" означає, що перший аргумент Offset (рядки) — 2, а другий (стовпці) — 0, для стовпця Product.
  • Total знаходиться в іншому стовпці, але в тому ж рядку — тому змінюється лише номер зсуву по стовпцю між двома викликами Offset, а не по рядку.
  • Рахуйте стовпці від позиції A2: Product знаходиться на 3 стовпці праворуч від Order ID; Total — на 7 стовпців праворуч.

2. Комбінування CurrentRegion, Offset та Resize

  • CurrentRegion для A1 повертає всю таблицю разом із заголовком.
  • Offset(1, 0) зсуває весь блок на один рядок вниз — цього достатньо, щоб прибрати заголовок.
  • Resize повинен зменшити кількість рядків на ту ж кількість, на яку ви зсунули, інакше нижній край вийде за межі реальних даних.

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), потім у вікні Immediate (Ctrl+G) введіть:

?Range("OrdersData").Rows.Count
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 3

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Робота з діапазонами

Виділення діапазонів

Це використовується під час дослідження, у робочому коді уникають .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, щоб вивести Product і Total для замовлення на два рядки нижче (ORD1003) — не вводячи "A4", "D4" чи "H4".
  2. Використайте разом CurrentRegion, Offset і Resize, щоб вибрати лише рядки з даними (без заголовка) і вивести кількість рядків у цьому діапазоні.
  3. Створіть іменований діапазон з назвою OrdersData, який охоплює той самий діапазон лише з даними, і переконайтеся, що ви можете звертатися до нього за назвою у Вікні негайного виконання.
Підказка
expand arrow

1. Використання Offset від A2 для досягнення ORD1003

  • Почніть із встановлення змінної Range на A2 — це ваша опорна клітинка, як у прикладі з розділу.
  • "Два рядки нижче" та "той самий стовпець" означає, що перший аргумент Offset (рядки) — 2, а другий (стовпці) — 0, для стовпця Product.
  • Total знаходиться в іншому стовпці, але в тому ж рядку — тому змінюється лише номер зсуву по стовпцю між двома викликами Offset, а не по рядку.
  • Рахуйте стовпці від позиції A2: Product знаходиться на 3 стовпці праворуч від Order ID; Total — на 7 стовпців праворуч.

2. Комбінування CurrentRegion, Offset та Resize

  • CurrentRegion для A1 повертає всю таблицю разом із заголовком.
  • Offset(1, 0) зсуває весь блок на один рядок вниз — цього достатньо, щоб прибрати заголовок.
  • Resize повинен зменшити кількість рядків на ту ж кількість, на яку ви зсунули, інакше нижній край вийде за межі реальних даних.

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), потім у вікні Immediate (Ctrl+G) введіть:

?Range("OrdersData").Rows.Count
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 3
some-alt