Найти в Дзене

Введение в VBA Excel

Оглавление

Это маленькая статья для тех кто делает первые шаги в программировании и хочет немного лучше понять возможности Excel.

Макросы выполняются на языке программирования VBA расшифровывается как Visual Basic for Application. И по классике программирования сделаем первую программу которая выводит сообщение Hello World!

Зайдем в режим редактирования скриптов.

Для этого откроем панель "Разработчик" в которой будет вкладка Visual Basic

Вкладка Visual Basic
Вкладка Visual Basic

Которая позволяет перейти нам к написанию скриптов.

______________________________________________________________________________

Если у вас нет панели "Разработчик", откройте меню «Файл» — «Параметры» — «Настройка ленты».

В списке «Основные вкладки» установите флажок напротив пункта «Разработчик».

Нажмите «ОК», чтобы подтвердить свое решение. Инструменты разработчика появятся в ленте основных вкладок Excel.

Или просто нажмите ALT+F11

______________________________________________________________________________

И вот вы можете начать писать свою первую программу. Для этого достаточно дважды кликнуть на странице и с правой стороны откроется окно для написания программы на этом листе.

-2

Скопируйте туда вот этот код

Sub HelloWorld()
MsgBox "Hello, World!"
End Sub

чтобы получилось вот так:

-3

И запускаем скрипт. Кнопочкой Run на панели инструментов.

-4

Появится окно где будут видны все макросы, на текущий момент он один. Нажимаем еще раз Run.

-5

Увидим следующее сообщение:

-6

Поздравляю! Вы только что написали и запустили свой первый скрипт. По сути написали свою первую программу.

Думаю это было совсем не сложно. Давайте теперь разберем подробнее что же мы сделали. Вернемся к нашему коду:

Sub HelloWorld()
MsgBox "Hello, World!"
End Sub

Первая строка вызывает Процедуру

Вызов процедуры

  • Процедура — Любой макрос VBA является подпрограммой типа "процедура".
  • Процедура помещается между операторами начального объявления ( Sub или Function ) и завершающим оператором объявления ( End Sub или End Function ). Весь код процедуры находится между этими операторами

Главное отличие между процедурами Function и Sub состоит в том, что процедура Function возвращает результат, а процедура Sub – нет.

В данном случае для объявления процедуры в VBA мы используем ключевое слово Sub это сокращение от слова Subprogramm - подпрограмма.

Про Function мы поговорим подробнее в следующий раз.

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

Sub <имяПроцедуры> [(<списокПараметров>)] <операторы> End Sub

где: <имяПроцедуры> - любой допустимый идентификатор VBA. Как правило это название по которому вы сможете определить свою программу. Имя процедуры должно быть написан без пробелов одним словом - Например_так или НапримерТак.

<списокПараметров> - Необязательное поле. Список переменных, представляющих аргументы, передаваемые в процедуру Sub при ее вызове. В качестве разделителя переменных используется запятая.

<операторы> - Необязательное поле. Любая группа операторов, выполняющихся внутри процедуры Sub.

Итак процедура всегда будет иметь примерно вот такой вид:

Sub Имя()
тут наши действия
End Sub

Вторая строка процедуры это оператор MsgBox выводит диалоговое окно с текстовым сообщением «Hello, World!» для пользователя процедуры.

Третья и последняя строка вышеприведенного листинга завершает процедуру и состоит всего из двух слов – End Sub, чем отмечает конец программы. При выполнении инструкции End Sub никаких видимых действий не происходит, но при этом высвобождается память, временно использованная при выполнении процедуры.

Чтобы закрепить прочитанное рассмотрим пару примеров:

Выведем в сообщении результат сложения 2х чисел.

Sub Summ()
MsgBox 23+24
End Sub
-7

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

MsgBox "23+24"

То получим

-8

Вывод нашего выражения как текста.

Думаю пришло время по внимательнее рассмотреть нам функцию MsgBox

Это довольно сложная функция для первого использования мы не будем сильно углубляться и она имеет следующий синтаксис:

MsgBox (сообщение, [ кнопки, ] [ заголовок, ] [ файл_справки, контекст ])

_______________________________________________________________________________________

где:

Сообщение - обязательный аргумент. Выражение отображаемое в диалоговом окне. Максимальная длинна сообщения примерно 1024 знака.

Кнопки - Необязательный аргумент. Числовое выражение, являющееся суммой значений, указывающих количество и тип отображаемых кнопок, стиля значков, выбранной по умолчанию кнопки и модальности окна сообщения. Если аргумент кнопки пропущен, по умолчанию используется значение 0.

заголовок - Необязательный аргумент. Строковое выражение, отображаемое в заголовке диалогового окна. Если аргумент заголовок пропущен, в заголовке выводится имя приложения

файл_справки - Необязательный аргумент. Строковое выражение, определяющее файл, в котором содержится контекстная справка для данного диалогового окна. Если задан аргумент файл_справки, необходимо также указать аргумент контекст.

контекст - Необязательный аргумент. Числовое выражение, представляющее собой номер контекста, присвоенный автором справки соответствующему разделу. Если задан аргумент контекст, необходимо также указать аргумент файл_справки.

_____________________________________________________________________________________

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

В данном примере мы вычислим сложение 2х чисел например 10+20 и сохраним её в переменную.

Sub Test_MsgBox()
n=10+20
MsgBox n
End Sub

В результате мы увидим результат сохраненный в переменной.

Добавим чуть больше функционала. Пусть у нас будут кнопки выбора - Да, Нет.

За этот параметр отвечает второй параметр после сообщения. Он может иметь несколько значений.

-9

В нашем случае для добавления кнопок выбора Да и Нет нужно прописать vbYesNo или поставить цифру 4.

MsgBox n, vbYesNo

или

MsgBox n, 4

первая запись более информативна для человека.

получим следующий результат

-10

Теперь я хочу подсветить кнопку "Нет" по умолчанию и добавить знак информации в окно выдачи результата. А так же добавим наименование окна. В этом мне помогут следующие параметры знаков

-11

И параметры выделения кнопок

-12

Получим следующую строку:

MsgBox n, vbYesNo + vbInformation + vbDefaultButton2, "Вывод сообщения"

и результат

-13

Сейчас, наши кнопки в любом случае приводят к закрытию окна и завершению диалога. Но я хочу сделать их более функциональными. Например я хочу чтобы при нажатии клавиши "Да" к нашему числу добавлялась цифра 3. Для этого нам надо получить результат который возвращает нам функция MsgBox и сопоставить его с ожидаемым ответом.

Возвращаемые значения.

-14

То есть если мы нажмем клавишу "Да" наша функция вернет нам значение "6" или "vbYes". Мы можем сохранить это значение и далее сравнить его с ожидаемым. Тут мы подошли к оператору

If...Then...Else

Он имеет следующий синтаксис:

If условие Then [ операторы] [ Else операторы]

Перевести можно как Если условие Тогда [ операторы ] [ иначе еще операторы ]

_______________________________________________________________________________________

где

Условие - Обязательный. Числовое выражение или строковое выражение, оцененное как True либо False. Если условие Null, условие рассматривается как False.

Операторы - Необязательный элемент в форме блока; является обязательным при использовании однострочного оператора без предложения Else. Операторы разделяются двоеточием; выполняется, если значение condition имеет значение True.

_____________________________________________________________

Применим этот оператор для нашей задачи. Получится примерно следующий фрагмент кода:

Sub Test_MsgBox()
n = 10 + 20
Message = MsgBox(n, vbYesNo + vbInformation + vbDefaultButton2, "Вывод сообщения")
If Message = 6 Then
n = n + 3
MsgBox n, vbYesNo + vbInformation + vbDefaultButton2, "Вывод сообщения"
End If
End Sub

Теперь если мы нажмем "Да" то функция MsgBox вернет нам значение 6 и мы сравнив её с требуемым значением попадаем в функцию If где выполняем увеличение значения на 3 и выводим полученное значение вновь. Правда на этот раз нажатие клавиши вновь приведет нас к завершению программы. Чтобы сделать этот цикл более длительным и складывать много чисел мы можем использовать цикл.

И тут мы пришли к одной очень интересной теме

Циклы VBA

Для того чтобы наш цикл не заканчивался до тех пор пока мы ему не разрешим мы можем использовать цикл Do While давайте рассмотрим его подробнее. Синтаксис.

_____________________________________________________________________________________

Do {While | Until} condition [statements] [ Continue Do ] [statements] [ Exit Do ] [ statements ] Loop

где

Do - Обязательный. Запускает определение Do цикла.

While - Является обязательным, если используется параметр Until. Повторите цикл, пока condition не будет False .

Until - Является обязательным, если используется параметр While. Повторите цикл, пока condition не будет True .

condition - Необязательный элемент. Выражение Boolean. если condition имеет значение Nothing , Visual Basic обрабатывает его как False .

statements - Необязательный элемент. Одна или несколько инструкций, повторяемых в, или до, condition имеют True .

Continue Do - Необязательный элемент. Передает управление следующей итерации Do цикла.

Exit Do - Необязательный элемент. Передает управление за пределы Do цикла.

Loop - Обязательный элемент. Завершает определение Do цикла.

________________________________________________________________________________________

Чтобы лучше понять как это работает разберем несколько простых примеров. Сделаем цикл который выполняет внутри себя простое сложение до тех пор пока значение не выйдет за рамки установленного значения.

Sub testDo()
Do
n = n + 1
Loop Until n > 10
MsgBox n
End Sub

и результат выполнения:

-15

В этом же примере вы можете передвинуть внутрь цикла сообщение о выводе значения переменной n и она у вас будет выскакивать каждый раз а программа до нажатия клавиши Ок будет приостанавливаться.

Давайте добавим этот цикл в наш код с сложением при нажатии клавиш Да Нет.

Sub Test_MsgBox()
n = 10 + 20
Do
Message = MsgBox(n, vbYesNo + vbInformation + vbDefaultButton2, "Вывод сообщения")
If Message = 6 Then
n = n + 3
End If
If Message = 7 Then
i = 1
End If
Loop Until i >= 1
End Sub

Теперь при выполнении программы мы сможем добавлять 3 каждый раз нажимая Да и завершить программу нажимая Нет.

Давайте теперь рассмотрим пример когда мы хотим сами ввести число которое нужно прибавить к существующему.

Для этого нам понадобится диалоговое окно которое мы создадим при помощи функции InputBox

Синтаксис:

_____________________________________________________________________________________

InputBox(сообщение, [ Заголовок], [ по умолчанию ], [ xpos ], [ ypos ], [ файл_справки, контекст ])

сообщение - Обязательный аргумент. Строковое выражение, отображающееся в диалоговом окне. Максимальная длина строки аргумента сообщение составляет приблизительно 1024 знака и зависит от их ширины. Если запрос состоит из нескольких строк, можно отделить строки с помощью символа возврата каретки(Chr(13)), символа linefeed (Chr(10)) или комбинации символов возвращаемой строки ((Chr(13) &(Chr(10)) между каждой строкой.

заголовок - Необязательный аргумент. Строковое выражение, отображаемое в заголовке диалогового окна. Если аргумент заголовок пропущен, в заголовке выводится имя приложения.

по умолчанию - Необязательно. Строковое выражение, отображаемое в текстовом поле в качестве ответа по умолчанию, если ввод вообще не будет выполнен. Если пропустить аргумент по умолчанию, соответствующее текстовое поле отображается пустым.

xpos - Необязательно. Числовое выражение, задающее в твипах расстояние по горизонтали от левого края диалогового окна до левого края экрана. Если аргумент xpos пропускается, диалоговое окно выравнивается по горизонтальной оси.

ypos - Необязательно. Числовое выражение, задающее в твипах расстояние по вертикали от верхнего края диалогового окна до верхнего края экрана. Если аргумент ypos пропускается, диалоговое окно позиционируется по вертикальной оси и отстоит от верхнего края окна примерно на треть от высоты экрана.

файл_справки - Необязательный аргумент. Строковое выражение, определяющее файл, в котором содержится контекстная справка для данного диалогового окна. Если задан аргумент файл_справки, необходимо также указать аргумент контекст.

контекст - Необязательный аргумент. Числовое выражение, представляющее собой номер контекста, присвоенный автором справки соответствующему разделу. Если задан аргумент контекст, необходимо также указать аргумент файл_справки.

_______________________________________________________________________________________

Давайте рассмотрим очень простой пример, чтобы лучше все уяснить. В этом примере мы будем выводить в окно сообщения те символы которые введем в диалоговое окно.

Sub testInputBox()
data_user = InputBox("Введите что ни будь", "Привет", "вот тут")
MsgBox data_user, , "Вы ввели"
End Sub

-16
-17

Теперь по такому-же принципу мы можем ввести в наш пример переменную. Добавим кусочек кода в наш пример.

Sub Test_MsgBox()
n = 10 + 20
Do
Message = MsgBox(n, vbYesNo + vbInformation + vbDefaultButton2, "Вывод сообщения")
If Message = 6 Then
data_user = InputBox("Сколько добавить к " & n, "Сложение", "вот тут")
n = n + data_user
End If
If Message = 7 Then
i = 1
End If
Loop Until i >= 1
End Sub

-18
-19
-20

И так далее. Есть только 1 нюанс, если мы введем в поле не цифру а другой символ например букву то получим ошибку. Как этого избежать? Один из вариантов это проверить является ли цифра цифрой.

Для этого мы можем использовать функцию IsNumeric она возвращает значение истины True, если все значение выражение распознается как числовое, а в противном случае — значение лжи False.

Sub Test_MsgBox()
n = 10 + 20
Do
Message = MsgBox(n, vbYesNo + vbInformation + vbDefaultButton2, "Вывод сообщения")
If Message = 6 Then
data_user = InputBox("Сколько добавить к " & n, "Сложение", "вот тут")
If IsNumeric(data_user) Then
n = n + data_user
Else
MsgBox "Вводите только цифры", vbOKOnly + vbCritical, "Внимание"
End If
End If
If Message = 7 Then
i = 1
End If
Loop Until i >= 1
End Sub

Думаю для первого раза вполне себе достаточно. Давайте подведем итоги. Мы разобрали с вами как создавать макросы. Что такое процедуры, как работать с диалоговыми окнами и мы знаем что такое цикл. Для начала очень не плохо. Но если не включатся в процесс а просто прочитать (пролистать) весь текст то ничего не получится. Мы ничего не запомним. И чтобы этого не произошло вот несколько тестовых заданий для закрепления материала.

1. Сделайте маленький опросник где будут задаваться 3 вопроса поочередно например 1 - Ваше Имя 2 - Ваш возраст 3 - Ваш город. При этом нам надо проверить чтобы данные возраста вводились цифрами а Имя и город буквами. А результат выводился в конце опроса.

2. Сделайте поочередный вывод разных значков сообщения.

vbCritical, vbQuestion, vbExclamation, vbInformation