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
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 у прикладній таблиці.
Завдання
- Введіть
HighlightTopEarnersточно так, як показано, у modIntro і запустіть її. Переконайтеся, що два рядки стали зеленими. - Скопіюйте процедуру під назвою
HighlightITDepartmentі змініть умову так, щоб вона підсвічувала будь-який рядок, де у стовпці "Department" (стовпець 3) значення дорівнює "IT" замість перевірки зарплати. - Додайте коментар над кожною процедурою, пояснюючи в одному реченні, що вона робить — практикуйте написання коментарів для читача, а не для себе.
- Збережіть книгу ще раз (вона все ще у форматі
.xlsm, тому звичайнеCtrl+Sпідходить).
- Виділіть всю процедуру
HighlightTopEarners(відSubдоEnd Sub), скопіюйте її та вставте одразу під нею уmodIntro. - Перейменуйте рядок
Subу другій копії наSub HighlightITDepartment()— кожна процедура в модулі повинна мати унікальну назву, інакше VBA не знатиме, яку саме ви хочете запустити. - Змініть умову у рядку
If. Зараз вона перевіряє число:
If ws.Cells(i, 6).Value > 55000 Then
Вам потрібно перевірити текст — стовпець 3 (Department) дорівнює "IT". Нагадаємо з Розділу 2: для порівняння тексту потрібні лапки навколо значення, яке ви порівнюєте, і використовуйте =, а не >.
4. Все інше всередині циклу (рядок Interior.Color, сама структура циклу) можна залишити без змін — змінюється лише умова перевірки.
Додавання коментарів
- Рядок коментаря починається з апострофа (
') і розміщується окремим рядком безпосередньо над рядкомSub— не всередині процедури. - Пишіть так, ніби пояснюєте макрос колезі, який бачить його вперше, а не як нагадування для себе. Порівняйте:
- Не дуже корисно:
' loops through rows(описує як, що вже видно з коду) - Корисніше:
' Highlights employees earning over $55,000(описує що досягається, що не очевидно з першого погляду)
- Не дуже корисно:
- Зробіть те саме для другої процедури — одне речення, яке описує, що саме вона підсвічує і чому, з точки зору бізнес-цілі (співробітники IT-відділу), а не механіки циклу.
' 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, коли обидві процедури працюють.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат