Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Використання вбудованих функцій | Основи VBA
Excel VBA для автоматизації бізнесу

Використання вбудованих функцій

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

У VBA є кілька сотень вбудованих функцій, і більшість із них ви ніколи не використаєте. Нижче наведені ті, що найчастіше зустрічаються в бізнес-автоматизації — для очищення тексту, роботи з датами та перетворення типів.

Функції для роботи з датами

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() і Date виглядають схоже, але відповідають на різні питання — Now() включає поточний час до секунди (корисно для фіксації часу запуску макросу), а Date повертає лише календарний день, що зручно для розрахунку термінів виконання чи віку. DateAdd і DateDiff — це дзеркальні функції: DateAdd дозволяє додавати або віднімати певну кількість одиниць часу від дати ("d" — дні, але також працюють "m" — місяці та "yyyy" — роки), а DateDiff вимірює різницю між двома датами.

Note
Примітка

Літерали дат у VBA — будь-що, записане між символами #, наприклад, #01/09/2023# — завжди використовують внутрішній порядок MM/DD/YYYY, незалежно від регіональних налаштувань Windows чи системної локалі. Тобто #01/09/2023# означає 9 січня 2023 року, а не 1 вересня, навіть якщо у вашому повсякденному форматі дат використовується DD/MM/YYYY. Це відрізняється від введення дат у комірку аркуша, де діють регіональні налаштування — формат літералів #...# є специфічним для VBA і залишається незмінним незалежно від місця виконання коду.

Функції для роботи з текстом

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase і LCase використовують для нечутливого до регістру порівняння, наприклад, If UCase(category) = UCase("electronics") Then працює незалежно від того, як було введено значення category. Left, Right і Mid витягують частину рядка, відрізняючись лише тим, з якого боку починається відлік: Left і Right рахують від початку та кінця відповідно, а Mid бере початкову позицію та довжину, тому Mid("P001", 2, 3) і Right("P001", 3) у цьому випадку повертають однаковий результат — у "P001" лише один символ-префікс, тому "починаючи з позиції 2" і "останні 3 символи" дають однаковий підрядок. Trim тихо видаляє пробіли на початку та в кінці — непомітна, але дуже корисна функція, коли дані скопійовані з різних джерел із різним форматуванням. InStr шукає один рядок у іншому та повертає позицію, де знайдено збіг (або 0, якщо не знайдено), що дозволяє перевірити, чи містить назва товару слово Mouse, без необхідності точного збігу.

Функції для роботи з числами

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round і Int обидві зменшують число, але по-різному — Round(24.996, 2) округлює до найближчого значення з точністю до двох знаків після коми (25.00, що відображається як 25), а Int(7.9) завжди відкидає дробову частину в бік нуля, незалежно від того, наскільки близько число до наступного цілого, і повертає 7 замість 8. Плутанина між цими функціями часто призводить до помилок у розрахунках цін: для округлення ціни до копійок майже завжди слід використовувати Round, а не Int, інакше ви будете систематично занижувати ціну на частку копійки в кожній транзакції.

Перетворення типів

Критично важливо при отриманні значень із аркуша, оскільки значення комірок часто надходять як Variant:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl перетворює у Double, CInt — у Integer, CStr — у String, а CDate — у значення типу Date.

Чому не дозволити VBA автоматично конвертувати типи за потреби? Зазвичай це спрацює, але покладатися на це ненадійно: комірка, яка виглядає як число, але була введена або імпортована як текст, може призвести до помилок у порівняннях або обчисленнях, і явне перетворення дозволяє виявити проблему одразу, на тій самій стрічці, де виникає некоректне значення, а не через кілька кроків далі.

Завдання

  1. Написати рядок, який витягує лише числову частину "P003" за допомогою Mid (підказка: почати з позиції 2).
  2. Написати рядок, який перетворює витягнутий текст у справжнє число за допомогою CInt або CLng.
  3. Використати DateDiff, щоб обчислити, скільки днів тому була найнята Emma Davis (15/03/2020) порівняно з сьогоднішнім днем.
Підказка
expand arrow

1. Витяг числової частини

  • Mid приймає три параметри: сам рядок, з якої позиції починати рахувати, і скільки символів взяти.
  • "P003" містить одну літеру та три цифри — потрібно пропустити "P" і взяти все після неї.
  • Початкова позиція 2 означає "почати з другого символу" — порахуйте "P003" на пальцях, щоб переконатися, що позиція 2 — це перший "0".

2. Перетворення у справжнє число

  • Все, що повертає Mid, залишається текстом, навіть якщо виглядає як число.
  • Обгорніть весь вираз Mid(...) у CInt(...) або CLng(...) — ви перетворюєте результат однієї функції за допомогою іншої.
  • Нагадування з попереднього розділу: CInt/CLng перетворюють текст у ціле число; використовуйте CLng, якщо не впевнені, що число не буде великим.

3. Кількість днів з моменту прийому на роботу

  • DateDiff потребує трьох параметрів: в якій одиниці вимірювати ("d" — дні), початкову дату та кінцеву дату.
  • Складність полягає у записі дати у VBA — обгорніть її символами #, наприклад, #03/15/2020#. Усередині #...# VBA завжди очікує порядок місяць/день/рік, незалежно від регіональних налаштувань — тобто 15 березня це #03/15/2020#, а не #15/03/2020#.
  • Для "сьогодні" не потрібно вводити дату вручну — є ключове слово з розділу 2.3, яке завжди повертає поточну дату.
  • Вставте ці дві дати у DateDiff у правильному порядку — спочатку ранішу дату — інакше отримаєте від’ємне число.
Все було зрозуміло?

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Використання вбудованих функцій

У VBA є кілька сотень вбудованих функцій, і більшість із них ви ніколи не використаєте. Нижче наведені ті, що найчастіше зустрічаються в бізнес-автоматизації — для очищення тексту, роботи з датами та перетворення типів.

Функції для роботи з датами

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() і Date виглядають схоже, але відповідають на різні питання — Now() включає поточний час до секунди (корисно для фіксації часу запуску макросу), а Date повертає лише календарний день, що зручно для розрахунку термінів виконання чи віку. DateAdd і DateDiff — це дзеркальні функції: DateAdd дозволяє додавати або віднімати певну кількість одиниць часу від дати ("d" — дні, але також працюють "m" — місяці та "yyyy" — роки), а DateDiff вимірює різницю між двома датами.

Note
Примітка

Літерали дат у VBA — будь-що, записане між символами #, наприклад, #01/09/2023# — завжди використовують внутрішній порядок MM/DD/YYYY, незалежно від регіональних налаштувань Windows чи системної локалі. Тобто #01/09/2023# означає 9 січня 2023 року, а не 1 вересня, навіть якщо у вашому повсякденному форматі дат використовується DD/MM/YYYY. Це відрізняється від введення дат у комірку аркуша, де діють регіональні налаштування — формат літералів #...# є специфічним для VBA і залишається незмінним незалежно від місця виконання коду.

Функції для роботи з текстом

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase і LCase використовують для нечутливого до регістру порівняння, наприклад, If UCase(category) = UCase("electronics") Then працює незалежно від того, як було введено значення category. Left, Right і Mid витягують частину рядка, відрізняючись лише тим, з якого боку починається відлік: Left і Right рахують від початку та кінця відповідно, а Mid бере початкову позицію та довжину, тому Mid("P001", 2, 3) і Right("P001", 3) у цьому випадку повертають однаковий результат — у "P001" лише один символ-префікс, тому "починаючи з позиції 2" і "останні 3 символи" дають однаковий підрядок. Trim тихо видаляє пробіли на початку та в кінці — непомітна, але дуже корисна функція, коли дані скопійовані з різних джерел із різним форматуванням. InStr шукає один рядок у іншому та повертає позицію, де знайдено збіг (або 0, якщо не знайдено), що дозволяє перевірити, чи містить назва товару слово Mouse, без необхідності точного збігу.

Функції для роботи з числами

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round і Int обидві зменшують число, але по-різному — Round(24.996, 2) округлює до найближчого значення з точністю до двох знаків після коми (25.00, що відображається як 25), а Int(7.9) завжди відкидає дробову частину в бік нуля, незалежно від того, наскільки близько число до наступного цілого, і повертає 7 замість 8. Плутанина між цими функціями часто призводить до помилок у розрахунках цін: для округлення ціни до копійок майже завжди слід використовувати Round, а не Int, інакше ви будете систематично занижувати ціну на частку копійки в кожній транзакції.

Перетворення типів

Критично важливо при отриманні значень із аркуша, оскільки значення комірок часто надходять як Variant:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl перетворює у Double, CInt — у Integer, CStr — у String, а CDate — у значення типу Date.

Чому не дозволити VBA автоматично конвертувати типи за потреби? Зазвичай це спрацює, але покладатися на це ненадійно: комірка, яка виглядає як число, але була введена або імпортована як текст, може призвести до помилок у порівняннях або обчисленнях, і явне перетворення дозволяє виявити проблему одразу, на тій самій стрічці, де виникає некоректне значення, а не через кілька кроків далі.

Завдання

  1. Написати рядок, який витягує лише числову частину "P003" за допомогою Mid (підказка: почати з позиції 2).
  2. Написати рядок, який перетворює витягнутий текст у справжнє число за допомогою CInt або CLng.
  3. Використати DateDiff, щоб обчислити, скільки днів тому була найнята Emma Davis (15/03/2020) порівняно з сьогоднішнім днем.
Підказка
expand arrow

1. Витяг числової частини

  • Mid приймає три параметри: сам рядок, з якої позиції починати рахувати, і скільки символів взяти.
  • "P003" містить одну літеру та три цифри — потрібно пропустити "P" і взяти все після неї.
  • Початкова позиція 2 означає "почати з другого символу" — порахуйте "P003" на пальцях, щоб переконатися, що позиція 2 — це перший "0".

2. Перетворення у справжнє число

  • Все, що повертає Mid, залишається текстом, навіть якщо виглядає як число.
  • Обгорніть весь вираз Mid(...) у CInt(...) або CLng(...) — ви перетворюєте результат однієї функції за допомогою іншої.
  • Нагадування з попереднього розділу: CInt/CLng перетворюють текст у ціле число; використовуйте CLng, якщо не впевнені, що число не буде великим.

3. Кількість днів з моменту прийому на роботу

  • DateDiff потребує трьох параметрів: в якій одиниці вимірювати ("d" — дні), початкову дату та кінцеву дату.
  • Складність полягає у записі дати у VBA — обгорніть її символами #, наприклад, #03/15/2020#. Усередині #...# VBA завжди очікує порядок місяць/день/рік, незалежно від регіональних налаштувань — тобто 15 березня це #03/15/2020#, а не #15/03/2020#.
  • Для "сьогодні" не потрібно вводити дату вручну — є ключове слово з розділу 2.3, яке завжди повертає поточну дату.
  • Вставте ці дві дати у DateDiff у правильному порядку — спочатку ранішу дату — інакше отримаєте від’ємне число.
Все було зрозуміло?

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

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

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