Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Writing Your First VBA Procedure | Вступ до VBA та об'єктної моделі Excel
Excel VBA для автоматизації бізнесу

Writing Your First VBA Procedure

Свайпніть щоб показати меню

Запис макросів навчає вас словникового запасу; написання макросу з нуля — це початок мислення як програміст.

Анатомія процедури Sub

Кожен багаторазовий блок VBA-коду, який виконує дію (а не повертає значення, як Function), записується як Sub:

Sub ProcedureName()
    ' instructions go here
End Sub

Знаходячись курсором у межах Sub, натисніть F5 (або клацніть зелену стрілку Run), щоб виконати його. Коментарі — будь-який рядок, що починається з апострофа (') — VBA повністю ігнорує; використовуйте їх щедро, щоб пояснювати, чому код щось робить, а не лише що саме, оскільки що зазвичай очевидно з самого коду.

Звички форматування, які одразу приносять користь

  • Додавайте Option Explicit на самому початку кожного модуля — це змушує оголошувати всі змінні, що дозволяє виявити помилки у написанні до того, як вони стануть багами;
  • Відступайте код усередині циклів і блоків If на одну вкладку — VBE цього не вимагає, але не відформатований код швидко стає нечитабельним;
  • Використовуйте описові імена (HighEarnerCount, а не x) — ви подякуєте собі через три тижні.

Приклад: виділення співробітників з високою зарплатою

Напишемо вручну процедуру, яка проходить по кожному співробітнику в таблиці та виділяє тих, хто заробляє понад $55,000 — те, що макрорекордер не зможе зробити, оскільки це потребує прийняття рішення (оператор If), що повторюється для кожного рядка (цикл).

Option Explicit
 
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long
 
    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
 
    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i
 
    MsgBox "Done — high earners are highlighted."
End Sub
Покроковий розбір коду
expand arrow
  • Dim ws As Worksheet / Dim i As Long — ці рядки оголошують дві змінні: ws міститиме посилання на лист Employees, а i — лічильник для проходу по рядках;
  • Set ws = ThisWorkbook.Worksheets("Employees") — це звичка роботи з об'єктною моделлю: явно вказуйте лист, а не покладайтеся на активний;
  • ws.Cells(ws.Rows.Count, 1).End(xlUp).Row — стандартний прийом для знаходження останнього використаного рядка у стовпці A, незалежно від кількості співробітників у таблиці;
  • For i = 2 To lastRow ... Next i — цикл, який повторює код для кожного рядка з даними, починаючи з другого, щоб пропустити заголовок;
  • If ws.Cells(i, 6).Value > 55000 Then — рішення: форматування отримують лише ті рядки, де у стовпці Salary (стовпець 6) значення перевищує 55000;
  • MsgBox — просте спливаюче вікно, що підтверджує завершення макросу.

Введіть цю процедуру в modIntro, розмістіть курсор всередині неї та натисніть F5. Перевірте числа самостійно — Emma Davis та Olivia Brown — це двоє співробітників, які заробляють понад $55,000 у прикладній таблиці.

Завдання

  1. Введіть HighlightTopEarners точно так, як показано, у modIntro і запустіть її. Переконайтеся, що два рядки стали зеленими.
  2. Скопіюйте процедуру під назвою HighlightITDepartment і змініть умову так, щоб вона підсвічувала будь-який рядок, де у стовпці "Department" (стовпець 3) значення дорівнює "IT" замість перевірки зарплати.
  3. Додайте коментар над кожною процедурою, пояснюючи в одному реченні, що вона робить — практикуйте написання коментарів для читача, а не для себе.
  4. Збережіть книгу ще раз (вона все ще у форматі .xlsm, тому звичайне Ctrl+S підходить).
Підказка
expand arrow
  1. Виділіть всю процедуру HighlightTopEarners (від Sub до End Sub), скопіюйте її та вставте одразу під нею у modIntro.
  2. Перейменуйте рядок Sub у другій копії на Sub HighlightITDepartment() — кожна процедура в модулі повинна мати унікальну назву, інакше VBA не знатиме, яку саме ви хочете запустити.
  3. Змініть умову у рядку If. Зараз вона перевіряє число:
If ws.Cells(i, 6).Value > 55000 Then

Вам потрібно перевірити текст — стовпець 3 (Department) дорівнює "IT". Нагадаємо з Розділу 2: для порівняння тексту потрібні лапки навколо значення, яке ви порівнюєте, і використовуйте =, а не >. 4. Все інше всередині циклу (рядок Interior.Color, сама структура циклу) можна залишити без змін — змінюється лише умова перевірки.

Додавання коментарів

  1. Рядок коментаря починається з апострофа (') і розміщується окремим рядком безпосередньо над рядком Sub — не всередині процедури.
  2. Пишіть так, ніби пояснюєте макрос колезі, який бачить його вперше, а не як нагадування для себе. Порівняйте:
    • Не дуже корисно: ' loops through rows (описує як, що вже видно з коду)
    • Корисніше: ' Highlights employees earning over $55,000 (описує що досягається, що не очевидно з першого погляду)
  3. Зробіть те саме для другої процедури — одне речення, яке описує, що саме вона підсвічує і чому, з точки зору бізнес-цілі (співробітники IT-відділу), а не механіки циклу.
Розв'язок
expand arrow
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — high earners are highlighted."
End Sub

' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 3).Value = "IT" Then
            ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — IT department is highlighted."
End Sub

Введіть обидві процедури у modIntro, спочатку запустіть HighlightTopEarners і переконайтеся, що саме два рядки стали зеленими (Emma Davis із $62,000 та Sophia Miller із $59,000 — інші три мають зарплату $55,000 або менше), потім запустіть HighlightITDepartment і переконайтеся, що підсвічується рядок Sophia Miller. Збережіть файл за допомогою Ctrl+S, коли обидві процедури працюють.

Все було зрозуміло?

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

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