Основы VBA (Visual Basic for Applications)

VBA

VBA (Visual Basic for Applications) — это встроенный язык программирования, который используется для автоматизации задач и разработки приложений в различных продуктах Microsoft Office, таких как Excel, Word, Outlook, Access и других.

VBA позволяет пользователям создавать макросы (автоматизированные последовательности команд), пользовательские формы, обрабатывать события, и в целом расширять функциональность приложений Microsoft Office.

Содержание
  1. VBA: возможности и применение
  2. Отличия между VBA и стандартными языками программирования:
  3. Среда разработки VBA
  4. Основные элементы среды разработки:
  5. Переменные, типы данных и операторы
  6. Объявление переменных:
  7. Работа с различными типами данных:
  8. Массивы
  9. Операторы и выражения:
  10. Встроенные функции
  11. Функции для работы с числами
  12. Арифметические операции:
  13. Математические функции:
  14. Функции для работы с случайными числами:
  15. Преобразование чисел:
  16. Округление чисел:
  17. Операции с углами:
  18. Пример использования функций:
  19. Основные функции для работы со строками:
  20. Объединение строк (конкатенация):
  21. Длина строки:
  22. Получение отдельного символа по индексу:
  23. Преобразование регистра:
  24. Поиск подстроки:
  25. Изменение строки:
  26. Получение отдельного символа строки по индексу:
  27. Сравнение строк:
  28. Удаление пробелов:
  29. Разделение строки на подстроки:
  30. Извлечение подстроки:
  31. Проверка наличия подстроки:
  32. Извлечение подстроки между двумя символами:
  33. Основные функции для работы с датой:
  34. Текущая дата и время:
  35. Разбор даты:
  36. Создание даты:
  37. Основные функции для работы с временем:
  38. Разбор времени:
  39. Создание времени:
  40. Манипуляции с датой и временем:
  41. Добавление/вычитание периода времени:
  42. Разница между датами:
  43. Функции для работы с массивами
  44. Получение длины массива:
  45. Функция Array для создания массива:
  46. Функция Split для разделения строки на массив:
  47. Функция Join для объединения элементов массива в строку:
  48. Пример использования массивов:
  49. ReDim
  50. Задания для тренировки
  51. Управляющие конструкции.
  52. Условный оператор
  53. 1. Простая форма условного оператора:
  54. 2. Условие с несколькими ветвями:
  55. 3. Условие с логическими операторами:
  56. Задания для тренировки
  57. Циклы
  58. 1. Цикл For...Next:
  59. 2. Цикл Do While...Loop:
  60. 3. Цикл Do Until...Loop:
  61. 4. Цикл For Each...Next:
  62. Задания на тренировку циклов
  63. Собственные процедуры и функции
  64. Процедуры:
  65. Функции:
  66. Параметры процедур и функций:
  67. Параметры процедур:
  68. Параметры функций:
  69. Задания на закрепление функций и процедур
  70. Обработка ошибок в VBA
  71. Основные элементы обработки ошибок в VBA:
  72. Задания для закрепления пройденных тем:

VBA: возможности и применение

  1. Автоматизация задач:
    • VBA позволяет автоматизировать повторяющиеся задачи, что улучшает производительность и уменьшает вероятность ошибок. Например, автоматическое создание отчетов, обработка данных и т.д.
  2. Работа с данными:
    • VBA обеспечивает доступ к данным в таблицах Excel, базах данных Access и других источниках. Это позволяет программировать обработку и анализ данных.
  3. Создание пользовательских форм:
    • Возможность создавать интерфейсы с помощью пользовательских форм, что делает приложения более удобными для конечных пользователей.
  4. Обработка событий:
    • VBA поддерживает обработку событий, таких как щелчок мыши, изменение данных и другие, что позволяет реагировать на действия пользователя.
  5. Интеграция с другими приложениями:
    • VBA позволяет интегрировать приложения Microsoft Office друг с другом, а также с внешними системами, что упрощает обмен данными.
  6. Разработка макросов:
    • Возможность записывать и редактировать макросы для автоматизации серии действий, что удобно для новичков.

Отличия между VBA и стандартными языками программирования:

  1. Интеграция с приложениями:
    • VBA предназначен специально для интеграции с приложениями Microsoft Office, в то время как стандартные языки программирования, такие как Python или Java, разрабатывались для общего назначения.
  2. Упрощенный синтаксис:
    • Синтаксис VBA часто более прост и удобен для новичков, поскольку он ориентирован на использование в приложениях офиса и учитывает особенности их интерфейсов.
  3. Ограниченные возможности:
    • В сравнении с некоторыми стандартными языками, VBA может иметь ограниченные возможности, но для автоматизации задач в Microsoft Office он предоставляет все необходимое.
  4. Направленность на прикладные задачи:
    • VBA нацелен на решение конкретных задач, связанных с офисными приложениями, что делает его отличным выбором для автоматизации рабочих процессов в офисе.
  5. Легкость обучения:
    • Из-за ограниченного объема функциональности VBA может быть легче изучить для новичков, чем некоторые стандартные языки программирования.

Среда разработки VBA

Среда разработки VBA (Visual Basic for Applications) предоставляет инструменты для написания, отладки и выполнения макросов и программ на VBA. В основном, эта среда разработки интегрирована в приложения Microsoft Office, такие как Excel или Word.Среда разработки

Основные элементы среды разработки:

  1. Меню и Панели инструментов:Меню
    • Содержат стандартные команды для работы с кодом, отладкой, выполнением программы и другими задачами. Например, «File» (Файл), «Edit» (Правка), «View» (Вид) и т.д.
  2. Окно редактора кода:Редактор кода
    • Главное окно, где вы пишете свой код. Здесь можно создавать, редактировать и управлять процедурами, функциями и модулями.
  3. Окно Проекта:Окно проекта
    • Показывает структуру вашего проекта. Здесь отображаются все открытые книги, документы, формы и модули. Вы можете легко переключаться между ними и управлять структурой проекта.
  4. Окно Свойств:Окно свойств
    • Позволяет настраивать свойства выбранного объекта, будь то форма, элемент управления или модуль. Здесь вы можете изменять размер, цвет, шрифт и другие параметры объектов.
  5. Окно Инструментов управления проектом:
    • Здесь расположены инструменты для управления проектом, такие как кнопки запуска, остановки и отладки кода.
  6. Окно вывода (Immediate Window):
    • Используется для выполнения команд в режиме немедленного выполнения и отображения результатов. Очень полезно при отладке.Immediate

Переменные, типы данных и операторы

Объявление переменных:

В VBA переменные объявляются с использованием ключевого слова Dim. Примеры:

Dim age As Integer
Dim name As String
Dim price As Double

Здесь age, name и price — это имена переменных, а Integer, String и Double — типы данных.

Работа с различными типами данных:

  • Целочисленные типы данных:
    Dim myInteger As Integer
    myInteger = 10
    
  • Тип данных с плавающей точкой (десятичная дробь):
    Dim myDouble As Double
    myDouble = 10.5
    
  • Тип данных строка:
    Dim myString As String
    myString = "Hello, World!"
    
  • Тип данных логический:
    Dim isTrue As Boolean
    isTrue = True
    
  • Тип данных дата:
    Dim today As Date
    today = Date
    
  • Тип данных время

Массивы

Массив в программировании представляет собой структуру данных, которая позволяет хранить набор элементов одного типа под одним общим именем. Элементы массива могут быть доступны по их индексам или ключам. В языке программирования VBA (Visual Basic for Applications), массивы могут быть одномерными или многомерными.

Одномерные массивы:

Одномерный массив представляет собой набор элементов, упорядоченных в одну линию. Каждый элемент имеет свой уникальный индекс, начинающийся с 0. Пример объявления и использования одномерного массива:

Dim myArray(4) As Integer  ' Одномерный массив с 5 элементами (индексы от 0 до 4)

myArray(0) = 10
myArray(1) = 20
myArray(2) = 30
myArray(3) = 40
myArray(4) = 50

Debug.Print myArray(2)  ' Выводит 30

Многомерные массивы:

Многомерные массивы позволяют организовать элементы в виде таблицы с двумя или более измерениями. Например, двумерный массив представляет собой таблицу с рядами и столбцами. Пример объявления и использования двумерного массива:

Dim myMatrix(2, 2) As Integer  ' Двумерный массив с 3 строками и 3 столбцами

myMatrix(0, 0) = 1
myMatrix(0, 1) = 2
myMatrix(0, 2) = 3
myMatrix(1, 0) = 4
myMatrix(1, 1) = 5
myMatrix(1, 2) = 6
myMatrix(2, 0) = 7
myMatrix(2, 1) = 8
myMatrix(2, 2) = 9

Debug.Print myMatrix(1, 1)  ' Выводит 5

Операторы и выражения:

  • Арифметические операторы:
    Dim a As Integer, b As Integer, result As Integer
    a = 10
    b = 5
    result = a + b  ' Сложение
    result = a - b  ' Вычитание
    result = a * b  ' Умножение
    result = a / b  ' Деление
    result = a Mod b  ' Остаток от деления
    
  • Операторы сравнения:
    Dim x As Integer, y As Integer, isEqual As Boolean
    x = 10
    y = 5
    isEqual = (x = y)   ' Равно
    isEqual = (x <> y)  ' Не равно
    isEqual = (x > y)   ' Больше
    isEqual = (x < y)   ' Меньше
    isEqual = (x >= y)  ' Больше или равно
    isEqual = (x <= y)  ' Меньше или равно
    
  • Логические операторы:
    Dim p As Boolean, q As Boolean, result As Boolean
    p = True
    q = False
    result = p And q   ' Логическое И
    result = p Or q    ' Логическое ИЛИ
    result = Not p      ' Логическое НЕ
    
  • Конкатенация строк:
    Dim firstName As String, lastName As String, fullName As String
    firstName = "John"
    lastName = "Doe"
    fullName = firstName & " " & lastName

Встроенные функции

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

Арифметические операции:

  • + (Сложение): result = num1 + num2
  • - (Вычитание): result = num1 - num2
  • * (Умножение): result = num1 * num2
  • / (Деление): result = num1 / num2
  • Mod (Остаток от деления): result = num1 Mod num2

Математические функции:

  • Abs (Абсолютное значение): result = Abs(number)
  • Sqr (Квадратный корень): result = Sqr(number)
  • Int (Целая часть числа): result = Int(number)
  • Round (Округление): result = Round(number, decimalPlaces)

Функции для работы с случайными числами:

  • Rnd (Генерация случайного числа): result = Rnd()
    • Генерирует случайное число в интервале от 0 до 1.
  • Rnd * (max - min) + min (Генерация случайного числа в диапазоне):
    Dim min As Integer, max As Integer
    min = 1
    max = 100
    result = Int((Rnd * (max - min + 1)) + min)
    

Преобразование чисел:

  • CInt (Преобразование в целое число): result = CInt(number)
  • CDbl (Преобразование в число с плавающей точкой): result = CDbl(number)
  • CStr (Преобразование в строку): result = CStr(number)

Округление чисел:

  • Round (Округление): result = Round(number, decimalPlaces)
    • Округляет число до указанного количества знаков после запятой.

Операции с углами:

  • Degrees (Преобразование радиан в градусы): result = Degrees(angle)
  • Radians (Преобразование градусов в радианы): result = Radians(angle)

Пример использования функций:

Dim num1 As Double, num2 As Double
num1 = 10.5
num2 = 3.2

' Сложение
result = num1 + num2

' Генерация случайного числа в диапазоне от 1 до 100
randomNumber = Int((Rnd * (100 - 1 + 1)) + 1)

' Преобразование числа в строку
stringValue = CStr(result)

' Округление числа до 2 знаков после запятой
roundedValue = Round(result, 2)

Debug.Print "Результат сложения: " & result
Debug.Print "Случайное число: " & randomNumber
Debug.Print "Преобразование в строку: " & stringValue
Debug.Print "Округленное значение: " & roundedValue

Основные функции для работы со строками:

Объединение строк (конкатенация):

  • & (Конкатенация): result = string1 & string2
  • + (Конкатенация): result = string1 + string2
  • + (Объединение): result = string1 + " " + string2

Длина строки:

  • Len (Длина строки): length = Len(myString)

Получение отдельного символа по индексу:

  • Mid (Извлечение подстроки): char = Mid(myString, index, 1)
  • Пример: firstChar = Mid(myString, 1, 1) — получение первого символа.

Преобразование регистра:

  • UCase (В верхний регистр): upperCase = UCase(myString)
  • LCase (В нижний регистр): lowerCase = LCase(myString)

Поиск подстроки:

  • InStr (Поиск подстроки): position = InStr(myString, substring)
  • Возвращает позицию первого вхождения подстроки в строку. Если подстрока не найдена, возвращает 0.

Изменение строки:

  • Replace (Замена подстроки): newString = Replace(originalString, oldSubstring, newSubstring)

Получение отдельного символа строки по индексу:

Dim myString As String
myString = "Hello, World!"

' Получение первого символа
firstChar = Mid(myString, 1, 1)

' Получение третьего символа
thirdChar = Mid(myString, 3, 1)

Debug.Print "Первый символ: " & firstChar
Debug.Print "Третий символ: " & thirdChar

Сравнение строк:

  • StrComp (Сравнение строк): result = StrComp(string1, string2, vbTextCompare)
  • vbTextCompare выполняет сравнение без учета регистра.

Удаление пробелов:

  • Trim (Удаление пробелов): trimmedString = Trim(myString)
  • Удаляет пробелы в начале и конце строки.

Разделение строки на подстроки:

  • Split (Разделение строки): resultArray = Split(myString, delimiter)
  • Разделяет строку на массив подстрок по указанному разделителю.

Извлечение подстроки:

  • Left (Извлечение левой части): leftPart = Left(myString, length)
  • Right (Извлечение правой части): rightPart = Right(myString, length)
  • Извлекают указанное количество символов с начала или конца строки.

Проверка наличия подстроки:

  • Instr (Проверка наличия подстроки): containsSubstring = InStr(myString, substring)
  • Возвращает 0, если подстрока не найдена, иначе — позицию первого вхождения.

Извлечение подстроки между двумя символами:

Dim startChar As Integer, endChar As Integer
startChar = InStr(myString, "H") + 1
endChar = InStr(myString, ",") - 1
extractedSubstring = Mid(myString, startChar, endChar - startChar + 1)

Основные функции для работы с датой:

Текущая дата и время:

  • Date (Текущая дата): currentDate = Date
  • Time (Текущее время): currentTime = Time
  • Now (Текущая дата и время): currentDateTime = Now

Разбор даты:

  • Year (Год): yearValue = Year(myDate)
  • Month (Месяц): monthValue = Month(myDate)
  • Day (День месяца): dayValue = Day(myDate)

Создание даты:

  • DateSerial (Создание даты по компонентам): newDate = DateSerial(year, month, day)

Основные функции для работы с временем:

Разбор времени:

  • Hour (Час): hourValue = Hour(myTime)
  • Minute (Минута): minuteValue = Minute(myTime)
  • Second (Секунда): secondValue = Second(myTime)

Создание времени:

  • TimeSerial (Создание времени по компонентам): newTime = TimeSerial(hour, minute, second)

Манипуляции с датой и временем:

Добавление/вычитание периода времени:

  • DateAdd (Добавление периода времени): newDate = DateAdd(interval, number, startDate)
    • Пример: newDate = DateAdd("d", 7, currentDate) — добавление 7 дней к текущей дате.
  • interval: Строка, указывающая тип периода времени, который следует добавить. Может принимать следующие значения:
    • "yyyy": Год
    • "q": Квартал
    • "m": Месяц
    • "y": День года
    • "d": День
    • "w": Неделя
    • "ww": Неделя (начиная с воскресенья)
    • "h": Час
    • "n": Минута
    • "s": Секунда
  • number: Количество периодов времени, которое следует добавить. Может быть положительным (добавление) или отрицательным (вычитание) числом.
  • startDate: Исходная дата или время.

Разница между датами:

  • DateDiff (Разница между датами): difference = DateDiff(interval, date1, date2)
    • Пример: differenceInDays = DateDiff("d", startDate, endDate) — разница в днях.
  • interval: Строка, указывающая тип периода времени, для которого нужно вычислить разницу между двумя датами. Может принимать те же значения, что и в DateAdd.
  • date1 и date2: Даты, между которыми нужно вычислить разницу.

Примеры использования:

Dim currentDate As Date, currentTime As Date
currentDate = Date
currentTime = Time

' Получение компонентов даты
yearValue = Year(currentDate)
monthValue = Month(currentDate)
dayValue = Day(currentDate)

' Создание даты по компонентам
newDate = DateSerial(2023, 11, 22)

' Добавление 7 дней к текущей дате
newDate = DateAdd("d", 7, currentDate)

' Разница в днях между двумя датами
differenceInDays = DateDiff("d", newDate, currentDate)

' Вывод результатов
Debug.Print "Текущая дата: " & currentDate
Debug.Print "Текущее время: " & currentTime
Debug.Print "Год: " & yearValue
Debug.Print "Месяц: " & monthValue
Debug.Print "День: " & dayValue
Debug.Print "Новая дата: " & newDate
Debug.Print "Разница в днях: " & differenceInDays

Функции для работы с массивами

Получение длины массива:

length = UBound(myArray) - LBound(myArray) + 1

Функция Array для создания массива:

myArray = Array(1, 2, 3, 4, 5)

Функция Split для разделения строки на массив:

Dim myString As String
myString = "apple,orange,banana"
myArray = Split(myString, ",")

Функция Join для объединения элементов массива в строку:

myString = Join(myArray, ",")

Пример использования массивов:

Dim myArray(4) As Integer
myArray(0) = 10
myArray(1) = 20
myArray(2) = 30
myArray(3) = 40
myArray(4) = 50

' Вывод элементов массива
For i = LBound(myArray) To UBound(myArray)
    Debug.Print myArray(i)
Next i

' Использование функции Array
Dim dynamicArray As Variant
dynamicArray = Array(1, "apple", True, 3.14)

' Получение длины массива
length = UBound(myArray) - LBound(myArray) + 1

Debug.Print "Длина массива: " & length

ReDim

ReDim — это ключевое слово в VBA, используемое для изменения размера массива во время выполнения программы. Когда вы создаете массив, вы обычно указываете его размерность, и эта размерность остается неизменной. Однако иногда может возникнуть необходимость изменить размер массива в процессе выполнения программы.

Синтаксис ReDim выглядит следующим образом:

ReDim ИмяМассива(НовыйРазмер)

где ИмяМассива — это имя массива, который вы хотите изменить, а НовыйРазмер — новый размер массива.

Если вы хотите изменить только верхнюю границу массива, вы можете написать:

ReDim Preserve ИмяМассива(НовыйВерхнийИндекс)

Ключевое слово Preserve сохраняет уже существующие значения в массиве при его изменении.

Пример использования ReDim:

Dim Массив(1 To 3) As Integer
Массив(1) = 10
Массив(2) = 20
Массив(3) = 30

ReDim Preserve Массив(1 To 5)

' Теперь массив имеет размер 1 To 5, и первые три значения сохранены.

ReDim особенно полезно, когда точный размер массива заранее неизвестен, и вы хотите динамически изменять его размер в процессе выполнения программы.

Задания для тренировки

Задание 1. Операции со строками. Дана строка «Hello, World!». Создайте новую строку, в которой все символы будут в верхнем регистре, и затем создайте ещё одну строку, в которой все символы будут в нижнем регистре.

Задание 2. Операции с числами. Создайте две переменные, присвойте им значения 5 и 3. Выведите результат сложения, вычитания, умножения и деления этих переменных.

Задание 3. Операции с датами. Создайте две переменные типа Date, представляющие текущую дату и дату вашего рождения. Выведите разницу в годах между ними.

Задание 4. Операции с массивами. Создайте массив чисел от 1 до 5. Умножьте каждый элемент массива на 2 и создайте новый массив с результатами.

Задание 5. Операции с временем. Создайте две переменные типа Time, представляющие текущее время и время через 2 часа. Выведите разницу в минутах между этими двумя моментами времени.

Задание 6. Функции работы с числами. Создайте переменную с числом с плавающей точкой. Используйте функцию округления, чтобы округлить это число до ближайшего целого.

Задание 7. Функции работы со строками. Даны две строки. Используйте функцию для определения, начинается ли одна строка с другой.

Задание 8. Функции работы с датой. Создайте переменную с текущей датой. С использованием функции добавления дней, добавьте 5 дней к текущей дате и выведите результат.

Задание 9. Функции работы с временем. Создайте переменную с текущим временем. С использованием функции вычитания времени, вычтите 30 минут и выведите результат.

Задание 10. Функции работы с массивами. Создайте массив целых чисел. Используйте функцию для нахождения максимального значения в массиве и выведите результат.

Решение 1-5
Option Explicit

Sub Main()
    ' Задание 1: Операции со строками
    Dim originalString As String
    originalString = "Hello, World!"
    
    ' Преобразование в верхний регистр
    Dim upperCaseString As String
    upperCaseString = UCase(originalString)
    Debug.Print "1.1. Строка в верхнем регистре: " & upperCaseString
    
    ' Преобразование в нижний регистр
    Dim lowerCaseString As String
    lowerCaseString = LCase(originalString)
    Debug.Print "1.2. Строка в нижнем регистре: " & lowerCaseString


    ' Задание 2: Операции с числами
    Dim num1 As Integer, num2 As Integer
    num1 = 5
    num2 = 3
    
    ' Вывод результатов операций
    Debug.Print "2.1. Сложение: " & num1 + num2
    Debug.Print "2.2. Вычитание: " & num1 - num2
    Debug.Print "2.3. Умножение: " & num1 * num2
    Debug.Print "2.4. Деление: " & num1 / num2


    ' Задание 3: Операции с датами
    Dim currentDate As Date, birthDate As Date
    currentDate = Date
    birthDate = #1990-01-01#  ' Пример даты рождения
    
    ' Вывод разницы в годах
    Debug.Print "3. Разница в годах: " & Year(currentDate) - Year(birthDate)


    ' Задание 4: Операции с массивами
    Dim originalArray(1 To 5) As Integer
    Dim newArray() As Integer
    
    ' Заполнение исходного массива
    For i = 1 To 5
        originalArray(i) = i
    Next i
    
    ' Умножение каждого элемента на 2
    For i = 1 To 5
        ReDim Preserve newArray(i)
        newArray(i) = originalArray(i) * 2
    Next i
    Debug.Print "4. Новый массив после умножения: " & Join(newArray, ", ")


    ' Задание 5: Операции с временем
    Dim currentTime As Date, futureTime As Date
    currentTime = Time
    futureTime = DateAdd("h", 2, currentTime)  ' Текущее время + 2 часа
    
    ' Вывод разницы в минутах
    Debug.Print "5. Разница в минутах: " & DateDiff("n", currentTime, futureTime)
End Sub
Решение 6-10
Option Explicit

Sub Main()
    ' Задание 6: Функции работы с числами
    Dim floatingNumber As Double
    floatingNumber = 7.85
    
    ' Округление до ближайшего целого
    Dim roundedNumber As Integer
    roundedNumber = Round(floatingNumber)
    Debug.Print "6. Округленное число: " & roundedNumber


    ' Задание 7: Функции работы со строками
    Dim str1 As String, str2 As String
    str1 = "Hello, "
    str2 = "World!"
    
    ' Проверка, начинается ли str1 с str2
    Debug.Print "7. Начинается ли str1 с str2: " & StrComp(str1, str2, vbTextCompare) = 0


    ' Задание 8: Функции работы с датой
    Dim currentDate2 As Date, futureDate As Date
    currentDate2 = Date
    
    ' Добавление 5 дней
    futureDate = DateAdd("d", 5, currentDate2)
    Debug.Print "8. Дата через 5 дней: " & futureDate


    ' Задание 9: Функции работы с временем
    Dim currentTime2 As Date, newTime As Date
    currentTime2 = Time
    
    ' Вычитание 30 минут
    newTime = DateAdd("n", -30, currentTime2)
    Debug.Print "9. Время минус 30 минут: " & newTime


    ' Задание 10: Функции работы с массивами
    Dim numbersArray As Variant
    numbersArray = Array(4, 12, 6, 9, 2, 15)
    
    ' Нахождение максимального значения
    Dim maxNumber As Integer
    maxNumber = WorksheetFunction.Max(numbersArray)
    Debug.Print "10. Максимальное значение в массиве: " & maxNumber
End Sub

Управляющие конструкции.

Условный оператор

Условный оператор в VBA позволяет выполнить блок кода в зависимости от условия.

Основным условным оператором является If...Then...Else.

1. Простая форма условного оператора:

Dim age As Integer
age = 25

If age >= 18 Then
    MsgBox "Вы совершеннолетний."
Else
    MsgBox "Вы несовершеннолетний."
End If

В этом примере, если значение переменной age больше или равно 18, будет показано сообщение «Вы совершеннолетний», иначе будет показано сообщение «Вы несовершеннолетний».

2. Условие с несколькими ветвями:

Dim score As Integer
score = 85

If score >= 90 Then
    MsgBox "Отлично!"
ElseIf score >= 80 Then
    MsgBox "Хорошо."
ElseIf score >= 70 Then
    MsgBox "Удовлетворительно."
Else
    MsgBox "Плохо."
End If

Этот пример демонстрирует использование нескольких ветвей условия в операторе If...Then...Else. В зависимости от значения переменной score будет выводиться соответствующее сообщение.

3. Условие с логическими операторами:

Dim temperature As Double
temperature = 28.5

If temperature > 25 And temperature <= 30 Then
    MsgBox "Погода приятная."
ElseIf temperature > 30 Then
    MsgBox "Жарко!"
Else
    MsgBox "Прохладно."
End If

В этом примере используются логические операторы (And). Если температура находится в диапазоне от 25 до 30 градусов, выводится сообщение «Погода приятная», иначе программа проверяет другие условия.

Задания для тренировки

Задание 11. Условный оператор с числами. Создайте переменную с числом. Используйте условный оператор для проверки, является ли число положительным, отрицательным или нулём.

Задание 12. Условный оператор с датой. Создайте переменную с текущей датой. Используйте условный оператор для проверки, является ли текущая дата выходным днём или будним.

Задание 13. Условный оператор с временем. Создайте переменную с текущим временем. Используйте условный оператор для проверки, является ли текущее время утром (до 12:00), днём (12:00 — 18:00) или вечером (после 18:00).

Задание 14. Условный оператор со строками. Создайте две строки разной длины. Используйте условный оператор для определения, какая из строк длиннее.

Задание 15. Условный оператор с массивами. Создайте массив чисел. Используйте условный оператор для проверки, есть ли в массиве чётные числа, и если да, выведите их количество.

Решение
Option Explicit

Sub Main()
    ' Задание 11: Условный оператор с числами
    Dim number As Integer
    number = -7
    
    ' Проверка положительное/отрицательное/нулевое число
    If number > 0 Then
        Debug.Print "11. Число положительное."
    ElseIf number < 0 Then
        Debug.Print "11. Число отрицательное."
    Else
        Debug.Print "11. Число нулевое."
    End If


    ' Задание 12: Условный оператор с датой
    Dim currentDate3 As Date
    currentDate3 = Date
    
    ' Проверка выходного или буднего дня
    If Weekday(currentDate3, vbMonday) < 6 Then
        Debug.Print "12. Сегодня будний день."
    Else
        Debug.Print "12. Сегодня выходной."
    End If


    ' Задание 13: Условный оператор с временем
    Dim currentTime3 As Date
    currentTime3 = Time
    
    ' Проверка утро/день/вечер
    If currentTime3 < TimeValue("12:00:00") Then
        Debug.Print "13. Утро."
    ElseIf currentTime3 < TimeValue("18:00:00") Then
        Debug.Print "13. День."
    Else
        Debug.Print "13. Вечер."
    End If


    ' Задание 14: Условный оператор со строками
    Dim str3 As String, str4 As String
    str3 = "Hello"
    str4 = "Good morning!"
    
    ' Проверка, какая строка длиннее
    If Len(str3) > Len(str4) Then
        Debug.Print "14. Строка 1 длиннее."
    ElseIf Len(str3) < Len(str4) Then
        Debug.Print "14. Строка 2 длиннее."
    Else
        Debug.Print "14. Строки равны по длине."
    End If


    ' Задание 15: Условный оператор с массивами
    Dim numbersArray2 As Variant
    numbersArray2 = Array(1, 3, 5, 7, 8, 9)
    
    ' Проверка наличия чётных чисел в массиве
    Dim hasEvenNumbers As Boolean
    hasEvenNumbers = False
    
    For Each num In numbersArray2
        If num Mod 2 = 0 Then
            hasEvenNumbers = True
            Exit For
        End If
    Next num
    
    If hasEvenNumbers Then
        Debug.Print "15. В массиве есть чётные числа."
    Else
        Debug.Print "15. В массиве нет чётных чисел."
    End If
End Sub

Циклы

Циклы в программировании используются для повторного выполнения блока кода или набора инструкций.

Они позволяют автоматизировать повторяющиеся задачи и обрабатывать структуры данных, такие как массивы.

В VBA, как и во многих других языках программирования, существует несколько типов циклов.

1. Цикл For...Next:

  • Используется для выполнения блока кода определенное количество раз.

Пример: Вывести числа от 1 до 5.

For i = 1 To 5
    Debug.Print i
Next i

2. Цикл Do While...Loop:

  • Позволяет выполнять блок кода, пока некоторое условие истинно.

Пример: Вывести числа от 1 до 5.

Dim i As Integer
i = 1

Do While i <= 5
    Debug.Print i
    i = i + 1
Loop

3. Цикл Do Until...Loop:

  • Позволяет выполнять блок кода, пока некоторое условие ложно.

Пример: Вывести числа от 1 до 5.

Dim i As Integer
i = 1

Do Until i > 5
    Debug.Print i
    i = i + 1
Loop

4. Цикл For Each...Next:

  • Используется для перебора элементов в коллекции (например, массиве или диапазоне ячеек в Excel).

Пример: Вывести элементы массива.

Dim myArray As Variant
myArray = Array("apple", "banana", "orange")

For Each fruit In myArray
    Debug.Print fruit
Next fruit

Задания на тренировку циклов

Задание 16. Цикл с числами. Используя цикл For...Next, выведите все чётные числа от 2 до 10.

Задание 17. Цикл со строками. Используя цикл Do While...Loop, добавьте к каждой букве строки «Hello» восклицательный знак и выведите результат.

Задание 18. Цикл с датой. Используя цикл For Each...Next, создайте массив с датами следующей недели от текущей даты и выведите их.

Задание 19. Цикл с временем. Используя цикл Do Until...Loop, уменьшайте текущее время на 15 минут до тех пор, пока оно не станет меньше полуночи.

Задание 20. Цикл с массивами. Используя цикл For...Next, умножьте каждый элемент массива на его индекс и выведите результат.

Решения
Option Explicit

Sub Main()
    ' Задание 16: Цикл с числами
    Debug.Print "16. Чётные числа от 2 до 10:"
    For i = 2 To 10 Step 2
        Debug.Print i
    Next i


    ' Задание 17: Цикл со строками
    Dim myString As String
    myString = "Hello"
    Dim resultString As String
    
    Debug.Print "17. Строка с восклицательными знаками:"
    Do While Len(resultString) < Len(myString) * 2
        resultString = resultString & Left(myString, 1) & "!"
    Loop
    Debug.Print resultString


    ' Задание 18: Цикл с датой
    Dim currentDate4 As Date, nextWeekDates() As Date
    currentDate4 = Date
    ReDim nextWeekDates(1 To 7)
    
    Debug.Print "18. Даты следующей недели:"
    For i = 1 To 7
        nextWeekDates(i) = DateAdd("d", i, currentDate4)
        Debug.Print nextWeekDates(i)
    Next i


    ' Задание 19: Цикл с временем
    Dim currentTime4 As Date
    currentTime4 = Time
    
    Debug.Print "19. Время уменьшается на 15 минут до полуночи:"
    Do Until currentTime4 < TimeValue("00:00:00")
        Debug.Print currentTime4
        currentTime4 = DateAdd("n", -15, currentTime4)
    Loop


    ' Задание 20: Цикл с массивами
    Dim numbersArray3 As Variant
    numbersArray3 = Array(3, 6, 9, 12, 15)
    
    Debug.Print "20. Массив после умножения на индекс:"
    For i = LBound(numbersArray3) To UBound(numbersArray3)
        numbersArray3(i) = numbersArray3(i) * i
        Debug.Print numbersArray3(i)
    Next i
End Sub

Собственные процедуры и функции

В VBA (Visual Basic for Applications) процедуры представляют собой блоки кода, которые могут содержать набор инструкций и выполняться при вызове. Процедуры могут быть подразделены на два основных типа: процедуры и функции.

Процедуры:

Процедуры в VBA не возвращают никакого значения. Они могут использоваться для выполнения некоторых действий, вывода информации или изменения состояния переменных.

Sub ПримерПроцедуры()
    ' Код процедуры
    Debug.Print "Привет, это процедура!"
End Sub

Функции:

Функции в VBA возвращают значение. Они могут принимать аргументы (параметры), обрабатывать их и возвращать результат.

Function ПримерФункции() As String
    ' Код функции
    ПримерФункции = "Привет, это функция!"
End Function

Параметры процедур и функций:

Параметры процедур:

Процедуры могут принимать параметры, которые передаются им при вызове. Параметры помогают передавать данные внутрь процедуры.

Sub ПроцедураСПараметрами(Параметр1 As Integer, Параметр2 As String)
    ' Код процедуры с параметрами
    Debug.Print "Параметр1: " & Параметр1
    Debug.Print "Параметр2: " & Параметр2
End Sub

Параметры функций:

Функции также могут иметь параметры, которые указываются в скобках после имени функции.

Function ФункцияСПараметрами(Параметр1 As Integer, Параметр2 As String) As String
    ' Код функции с параметрами
    ФункцияСПараметрами = "Параметр1: " & Параметр1 & ", Параметр2: " & Параметр2
End Function

При вызове процедур и функций передаются нужные параметры:

Sub ВызовПроцедуры()
    ПроцедураСПараметрами 42, "Пример"
End Sub

Sub ВызовФункции()
    Dim результат As String
    результат = ФункцияСПараметрами(42, "Пример")
    Debug.Print результат
End Sub

Задания на закрепление функций и процедур

Задание 21. Функция на сложение двух чисел: Создайте функцию Сложение, которая принимает два аргумента и возвращает их сумму.

Задание 22. Процедура для вывода приветствия: Создайте процедуру Приветствие, которая принимает имя пользователя в качестве аргумента и выводит приветственное сообщение.

Задание 23. Функция для определения четности числа: Создайте функцию Четность, которая принимает целое число и возвращает строку «Четное» или «Нечетное».

Задание 24. Процедура для заполнения массива: Создайте процедуру ЗаполнитьМассив, которая принимает массив и число, и заполняет каждый элемент массива переданным числом.

Задание 25. Функция для нахождения максимального значения в массиве: Создайте функцию МаксимальноеЗначение, которая принимает массив чисел и возвращает его максимальное значение.

Решения
Option Explicit

' Задание 21: Функция на сложение двух чисел
Function Сложение(Число1 As Double, Число2 As Double) As Double
    Сложение = Число1 + Число2
End Function

' Задание 22: Процедура для вывода приветствия
Sub Приветствие(Имя As String)
    MsgBox "Привет, " & Имя & "!"
End Sub

' Задание 23: Функция для определения четности числа
Function Четность(Число As Integer) As String
    If Число Mod 2 = 0 Then
        Четность = "Четное"
    Else
        Четность = "Нечетное"
    End If
End Function

' Задание 24: Процедура для заполнения массива
Sub ЗаполнитьМассив(Массив() As Double, Значение As Double)
    Dim i As Integer
    For i = LBound(Массив) To UBound(Массив)
        Массив(i) = Значение
    Next i
End Sub

' Задание 25: Функция для нахождения максимального значения в массиве
Function МаксимальноеЗначение(Массив() As Double) As Double
    Dim МаксЗначение As Double
    МаксЗначение = Массив(LBound(Массив))
    
    Dim Значение As Double
    For Each Значение In Массив
        If Значение > МаксЗначение Then
            МаксЗначение = Значение
        End If
    Next Значение
    
    МаксимальноеЗначение = МаксЗначение
End Function

Sub Тестирование()
    ' Тестирование созданных функций и процедур
    Dim результатСложения As Double
    результатСложения = Сложение(5, 10)
    Debug.Print "21. Результат сложения: " & результатСложения
    
    Приветствие "Анна"  ' Вызов процедуры
    
    Dim результатЧетности As String
    результатЧетности = Четность(7)
    Debug.Print "23. Результат четности: " & результатЧетности
    
    Dim тестовыйМассив(1 To 5) As Double
    ЗаполнитьМассив тестовыйМассив, 42  ' Вызов процедуры
    Debug.Print "24. Массив после заполнения: " & Join(tестовыйМассив, ", ")
    
    Dim числаДляПоиска() As Double
    числаДляПоиска = Array(14, 5, 23, 8, 19)
    Dim максЗначение As Double
    максЗначение = МаксимальноеЗначение(числаДляПоиска)
    Debug.Print "25. Максимальное значение в массиве: " & максЗначение
End Sub

Обработка ошибок в VBA

В VBA (Visual Basic for Applications), обработка ошибок и исключений выполняется с использованием конструкции On Error. Это позволяет управлять возможными ошибками в вашем коде и предоставляет средства для обработки их в случае возникновения.

Основные элементы обработки ошибок в VBA:

  1. On Error Resume Next: Эта инструкция заставляет VBA продолжить выполнение кода, игнорируя ошибки. Это может быть полезным в некоторых случаях, но обязательно следите за тем, чтобы ваш код не пропускал важные ошибки.
    On Error Resume Next
    ' Код, в котором возможны ошибки
    
  2. On Error GoTo 0: Эта инструкция отключает обработку ошибок и возвращает выполнение к стандартному режиму обработки ошибок.
    On Error GoTo 0
    
  3. On Error GoTo Метка: Эта инструкция перенаправляет выполнение кода на указанную метку при возникновении ошибки.
    On Error GoTo ОбработкаОшибки
    ' Код, в котором возможны ошибки
    Exit Sub ' Избежать выполнения кода для обработки ошибки
    ОбработкаОшибки:
    ' Код для обработки ошибки
    
  4. Обработка конкретных ошибок:
    On Error Resume Next
    ' Код, в котором возможны ошибки
    
    If Err.Number = 13 Then
        ' Обработка ошибки №13 (Type Mismatch)
        MsgBox "Ошибка типа данных!"
    End If
    
    On Error GoTo 0
    

Пример

Sub ПримерОбработкиОшибок()
    On Error GoTo ОбработкаОшибки

    Dim Результат As Double
    Результат = 10 / 0 ' Попытка деления на ноль вызовет ошибку

    MsgBox "Результат: " & Результат

    On Error GoTo 0 ' Возврат к стандартному режиму обработки ошибок
    Exit Sub ' Избегаем выполнения кода для обработки ошибки

ОбработкаОшибки:
    MsgBox "Произошла ошибка: " & Err.Description
    ' Дополнительный код для обработки ошибки

    ' Переход к следующей итерации цикла или выход из процедуры/функции
    Resume Next
End Sub

Задания для закрепления пройденных тем:

Задание 26. Переменные и типы данных: Создайте переменные для хранения следующей информации: вашего имени, вашего возраста (целое число), вашего роста (число с плавающей точкой) и статуса вашей подписки (логическое значение).

Задание 27. Встроенные функции: Используйте встроенные функции для работы со строками. Объедините две строки «Привет, » и ваше имя.

Задание 28. Условный оператор: Напишите условный оператор, который проверяет, является ли ваш возраст больше или равным 18, и выводит соответствующее сообщение.

Задание 29. Циклы: Используя цикл, выведите числа от 1 до 5 включительно.

Задание 30. Функции и процедуры: Создайте функцию, которая принимает ваш рост и возвращает его значение, округленное до ближайшего целого числа. Затем создайте процедуру, которая выводит сообщение о вашем росте.

Задание 31. Операции с числами: Вычислите среднее арифметическое чисел 10, 15 и 20.

Задание 32. Работа с массивами: Создайте массив целых чисел от 1 до 5. Используйте цикл для вывода каждого элемента массива.

Задание 33. Операции с датой и временем: Создайте переменную с текущей датой. Используйте функцию для добавления одного месяца и выведите результат.

Задание 34. Строковые операции: Создайте строку «Программирование на » и добавьте к ней свой любимый язык программирования.

Задание 35. Условия и циклы: Используйте цикл и условие для вывода чисел от 1 до 10, пропуская четные числа.

Решения
Option Explicit

Sub ЗаданияДляЗакрепления()
    ' Задание 26: Переменные и типы данных
    Dim Имя As String
    Dim Возраст As Integer
    Dim Рост As Double
    Dim Подписка As Boolean

    Имя = "Ваше имя"
    Возраст = 25
    Рост = 175.5
    Подписка = True

    ' Задание 27: Встроенные функции
    Dim Приветствие As String
    Приветствие = "Привет, " & Имя

    ' Задание 28: Условный оператор
    If Возраст >= 18 Then
        Debug.Print "Вы совершеннолетний."
    Else
        Debug.Print "Вы несовершеннолетний."
    End If

    ' Задание 29: Циклы
    Dim i As Integer
    For i = 1 To 5
        Debug.Print i
    Next i

    ' Задание 30: Функции и процедуры
    Dim ОкругленныйРост As Integer
    ОкругленныйРост = ОкруглениеДоЦелого(Рост)
    ВывестиРост ОкругленныйРост

    ' Задание 31: Операции с числами
    Dim СреднееАрифметическое As Double
    СреднееАрифметическое = (10 + 15 + 20) / 3

    ' Задание 32: Работа с массивами
    Dim Числа(1 To 5) As Integer
    For i = 1 To 5
        Числа(i) = i
    Next i

    ' Задание 33: Операции с датой и временем
    Dim ТекущаяДата As Date
    ТекущаяДата = Date
    Dim ДатаЧерезМесяц As Date
    ДатаЧерезМесяц = DateAdd("m", 1, ТекущаяДата)

    ' Задание 34: Строковые операции
    Dim ЯзыкПрограммирования As String
    ЯзыкПрограммирования = "VBA"
    Dim Предложение As String
    Предложение = "Программирование на " & ЯзыкПрограммирования

    ' Задание 35: Условия и циклы
    For i = 1 To 10
        If i Mod 2 <> 0 Then
            Debug.Print i
        End If
    Next i
End Sub

Function ОкруглениеДоЦелого(Число As Double) As Integer
    ' Функция для округления числа до ближайшего целого
    ОкруглениеДоЦелого = Round(Число)
End Function

Sub ВывестиРост(Рост As Integer)
    ' Процедура для вывода сообщения о росте
    MsgBox "Ваш рост: " & Рост & " с
Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.