Vba краткое руководство

VBA – Обзор

VBA означает V isual B asic для приложений A, языка программирования, управляемого событиями, от Microsoft, который в настоящее время преимущественно используется в офисных приложениях Microsoft, таких как MSExcel, MS-Word и MS-Access.

Он помогает техническим специалистам создавать специализированные приложения и решения для расширения возможностей этих приложений. Преимущество этого средства в том, что вам НЕ НУЖНО установить Visual Basic на наш ПК, однако установка Office неявно поможет в достижении этой цели.

Вы можете использовать VBA во всех офисных версиях, от MS-Office 97 до MS-Office 2013, а также с любой из последних доступных версий. Среди VBA Excel VBA является самым популярным. Преимущество использования VBA в том, что вы можете создавать очень мощные инструменты в MS Excel, используя линейное программирование.

Применение VBA

Вы можете задаться вопросом, зачем использовать VBA в Excel, поскольку MS-Excel сам по себе предоставляет множество встроенных функций. MS-Excel предоставляет только основные встроенные функции, которых может быть недостаточно для выполнения сложных вычислений. При таких обстоятельствах VBA становится наиболее очевидным решением.

Например, очень сложно рассчитать ежемесячное погашение кредита, используя встроенные формулы Excel. Скорее, легко запрограммировать VBA для такого расчета.

Доступ к редактору VBA

В окне Excel нажмите «ALT + F11». Откроется окно VBA, как показано на следующем снимке экрана.

Заявления о принятии решений в VBScript

VBA – Макросы Excel

В этой главе вы узнаете, как написать простой макрос шаг за шагом.

Шаг 1. Сначала включите меню «Разработчик» в Excel 20XX. Чтобы сделать то же самое, нажмите Файл → Параметры.

Шаг 2 – Нажмите «Настроить ленту» и выберите «Разработчик». Нажмите «ОК».

Разработчик в VBScript

Шаг 3 – Лента «Разработчик» появляется в строке меню.

Разработчик в VBScript

Шаг 4 – Нажмите кнопку «Visual Basic», чтобы открыть редактор VBA.

Разработчик в VBScript

Шаг 5 – Запустите сценарий, добавив кнопку. Нажмите Вставить → Выберите кнопку.

Разработчик в VBScript

Шаг 6 – Выполните щелчок правой кнопкой мыши и выберите «Свойства».

Разработчик в VBScript

Шаг 7 – Измените имя и подпись, как показано на следующем снимке экрана.

Разработчик в VBScript

Шаг 8 – Теперь дважды нажмите кнопку, и схема подпрограммы отобразится, как показано на следующем снимке экрана.

Разработчик в VBScript

Шаг 9 – Начните кодирование, просто добавив сообщение.

Private Sub say_helloworld_Click()
   MsgBox "Hi"
End Sub

Шаг 10 – Нажмите кнопку, чтобы выполнить подпроцедуру. Вывод подпроцедуры показан на следующем снимке экрана.

Разработчик в VBScript

Примечание. В следующих главах мы продемонстрируем использование простой кнопки, как описано в шагах с 1 по 10. Следовательно, важно тщательно понять эту главу.

VBA – Excel Условия

В этой главе вы познакомитесь с обычно используемой терминологией Excel VBA. Эти термины будут использоваться в следующих модулях, поэтому важно понимать каждый из них.

Модули

Модули – это область, где написан код. Это новая рабочая тетрадь, поэтому никаких модулей нет.

Модуль в VBScript

Чтобы вставить модуль, перейдите к Вставка → Модуль. Как только модуль вставлен, «module1» будет создан.

Внутри модулей мы можем написать код VBA, а код написан в процедуре. Процедура / подпроцедура – это серия утверждений VBA, в которых указывается, что делать.

Модуль в VBScript

Процедура

Процедуры – это группа операторов, выполняемых как единое целое, которые инструктируют Excel, как выполнять определенную задачу. Выполняемая задача может быть очень простой или очень сложной задачей. Однако рекомендуется разбивать сложные процедуры на более мелкие.

Двумя основными типами процедур являются Sub и Function.

Модуль в VBScript

функция

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

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

Подпроцедур

Подпроцедуры работают аналогично функциям. Хотя подпроцедуры НЕ возвращают значение, функции могут возвращать или не возвращать значение. Подпроцедуры могут быть вызваны без ключевого слова вызова. Подпроцедуры всегда заключены в инструкции Sub и End Sub .

VBA – Макро Комментарии

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

Он включает в себя информацию, такую ​​как разработанную, модифицированную, и может также включать встроенную логику. Комментарии игнорируются интерпретатором при исполнении.

Комментарии в VBA обозначаются двумя способами.

  • Любое утверждение, начинающееся с одинарной кавычки (‘), рассматривается как комментарий. Ниже приведен пример.

Любое утверждение, начинающееся с одинарной кавычки (‘), рассматривается как комментарий. Ниже приведен пример.

' This Script is invoked after successful login 
' Written by : TutorialsPoint 
' Return Value : True / False
  • Любое утверждение, которое начинается с ключевого слова «REM». Ниже приведен пример.

Любое утверждение, которое начинается с ключевого слова «REM». Ниже приведен пример.

REM This Script is written to Validate the Entered Input 
REM Modified by  : Tutorials point/user2

VBA – Окно сообщений

Функция MsgBox отображает окно сообщения и ждет, когда пользователь нажмет кнопку, а затем действие будет выполнено на основе кнопки, нажатой пользователем.

Синтаксис

MsgBox(prompt[,buttons][,title][,helpfile,context])

Описание параметра

  • Подсказка – Обязательный параметр. Строка, которая отображается в виде сообщения в диалоговом окне. Максимальная длина подсказки составляет около 1024 символов. Если сообщение распространяется более чем на строку, то строки могут быть разделены с помощью символа возврата каретки (Chr (13)) или символа перевода строки (Chr (10)) между каждой строкой.

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

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

  • Файл справки – необязательный параметр. Строковое выражение, определяющее файл справки, который будет использоваться для предоставления контекстной справки для диалогового окна.

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

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

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

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

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

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

Параметр Buttons может принимать любое из следующих значений:

  • 0 vbOKOnly – отображает только кнопку ОК.

  • 1 vbOKCancel – отображает кнопки OK и Отмена.

  • 2 vbAbortRetryIgnore – отображает кнопки отмены, повторной попытки и игнорирования.

  • 3 vbYesNoCancel – отображает кнопки «Да», «Нет» и «Отмена».

  • 4 vBYesNo – отображает кнопки «Да» и «Нет».

  • 5 vbRetryCancel – отображает кнопки «Повторить» и «Отмена».

  • 16 vbCritical – отображает значок критического сообщения.

  • 32 vbQuestion – отображает значок запроса предупреждения.

  • 48 vbExclamation – отображает значок предупреждающего сообщения.

  • 64 vbInformation – отображает значок информационного сообщения.

  • 0 vbDefaultButton1 – первая кнопка по умолчанию.

  • 256 vbDefaultButton2 – вторая кнопка по умолчанию.

  • 512 vbDefaultButton3 – третья кнопка по умолчанию.

  • 768 vbDefaultButton4 – четвертая кнопка по умолчанию.

  • 0 vbApplicationModal Модальное приложение – текущее приложение не будет работать, пока пользователь не ответит на окно сообщения.

  • 4096 vbSystemModal Системный модал – Все приложения не будут работать, пока пользователь не ответит на окно сообщения.

0 vbOKOnly – отображает только кнопку ОК.

1 vbOKCancel – отображает кнопки OK и Отмена.

2 vbAbortRetryIgnore – отображает кнопки отмены, повторной попытки и игнорирования.

3 vbYesNoCancel – отображает кнопки «Да», «Нет» и «Отмена».

4 vBYesNo – отображает кнопки «Да» и «Нет».

5 vbRetryCancel – отображает кнопки «Повторить» и «Отмена».

16 vbCritical – отображает значок критического сообщения.

32 vbQuestion – отображает значок запроса предупреждения.

48 vbExclamation – отображает значок предупреждающего сообщения.

64 vbInformation – отображает значок информационного сообщения.

0 vbDefaultButton1 – первая кнопка по умолчанию.

256 vbDefaultButton2 – вторая кнопка по умолчанию.

512 vbDefaultButton3 – третья кнопка по умолчанию.

768 vbDefaultButton4 – четвертая кнопка по умолчанию.

0 vbApplicationModal Модальное приложение – текущее приложение не будет работать, пока пользователь не ответит на окно сообщения.

4096 vbSystemModal Системный модал – Все приложения не будут работать, пока пользователь не ответит на окно сообщения.

Вышеуказанные значения логически разделены на четыре группы: первая группа (от 0 до 5) указывает кнопки, отображаемые в окне сообщения. Вторая группа (16, 32, 48, 64) описывает стиль значка, который должен отображаться, третья группа (0, 256, 512, 768) указывает, какая кнопка должна быть по умолчанию, и четвертая группа (0, 4096). ) определяет модальность окна сообщения.

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

Функция MsgBox может возвращать одно из следующих значений, которое можно использовать для определения кнопки, которую пользователь нажал в окне сообщения.

  • 1 – vbOK – нажата кнопка ОК
  • 2 – vbCancel – Отмена была нажата
  • 3 – vbAbort – нажата кнопка «Прервать»
  • 4 – vbRetry – повторная попытка была нажата
  • 5 – vbIgnore – щелкнули Ignore
  • 6 – vbYes – Да нажали
  • 7 – vbNo – нет кликали

пример

Function MessageBox_Demo() 
   'Message Box with just prompt message 
   MsgBox("Welcome")     
   
   'Message Box with title, yes no and cancel Butttons  
   int a = MsgBox("Do you like blue color?",3,"Choose options") 
   ' Assume that you press No Button  
   msgbox ("The Value of a is " & a) 
End Function

Выход

Шаг 1. Указанную выше функцию можно выполнить, нажав кнопку «Выполнить» в окне VBA или вызвав функцию из рабочего листа Excel, как показано на следующем снимке экрана.

Окно сообщений в VBA

Шаг 2 – Отображается окно простого сообщения с сообщением «Добро пожаловать» и кнопкой «ОК»

Окно сообщений в VBA

Шаг 3 – После нажатия OK, появляется еще одно диалоговое окно с сообщением вместе с кнопками «да, нет и отмена».

Окно сообщений в VBA

Шаг 4 – После нажатия кнопки «Нет» значение этой кнопки (7) сохраняется в виде целого числа и отображается пользователю в виде окна сообщения, как показано на следующем снимке экрана. Используя это значение, можно понять, на какую кнопку нажал пользователь.

Окно сообщений в VBA

VBA – InputBox

Функция InputBox предлагает пользователям ввести значения. После ввода значений, если пользователь нажимает кнопку OK или нажимает клавишу ВВОД на клавиатуре, функция InputBox возвращает текст в текстовое поле. Если пользователь нажмет кнопку «Отмена», функция вернет пустую строку («»).

Синтаксис

InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])

Описание параметра

  • Подсказка – обязательный параметр. Строка, которая отображается в виде сообщения в диалоговом окне. Максимальная длина подсказки составляет около 1024 символов. Если сообщение распространяется более чем на строку, то строки могут быть разделены с помощью символа возврата каретки (Chr (13)) или символа перевода строки (Chr (10)) между каждой строкой.

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

  • По умолчанию – необязательный параметр. Текст по умолчанию в текстовом поле, который пользователь хотел бы отобразить.

  • XPos – необязательный параметр. Положение оси X представляет быстрое расстояние от левой стороны экрана по горизонтали. Если оставить это поле пустым, поле ввода будет горизонтально отцентрировано.

  • YPos – необязательный параметр. Положение оси Y представляет быстрое расстояние от левой стороны экрана по вертикали. Если оставить это поле пустым, поле ввода будет центрировано вертикально.

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

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

Подсказка – обязательный параметр. Строка, которая отображается в виде сообщения в диалоговом окне. Максимальная длина подсказки составляет около 1024 символов. Если сообщение распространяется более чем на строку, то строки могут быть разделены с помощью символа возврата каретки (Chr (13)) или символа перевода строки (Chr (10)) между каждой строкой.

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

По умолчанию – необязательный параметр. Текст по умолчанию в текстовом поле, который пользователь хотел бы отобразить.

XPos – необязательный параметр. Положение оси X представляет быстрое расстояние от левой стороны экрана по горизонтали. Если оставить это поле пустым, поле ввода будет горизонтально отцентрировано.

YPos – необязательный параметр. Положение оси Y представляет быстрое расстояние от левой стороны экрана по вертикали. Если оставить это поле пустым, поле ввода будет центрировано вертикально.

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

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

пример

Давайте вычислим площадь прямоугольника путем получения значений от пользователя во время выполнения с помощью двух полей ввода (одно для длины и одно для ширины).

Function findArea() 
   Dim Length As Double 
   Dim Width As Double 
   
   Length = InputBox("Enter Length ", "Enter a Number") 
   Width = InputBox("Enter Width", "Enter a Number") 
   findArea = Length * Width 
End Function

Выход

Шаг 1 – Чтобы выполнить то же самое, позвоните, используя имя функции, и нажмите Enter, как показано на следующем снимке экрана.

Поле ввода Демо

Шаг 2 – После выполнения отображается первое поле ввода (длина). Введите значение в поле ввода.

Поле ввода Демо

Шаг 3 – После ввода первого значения отображается второе поле ввода (ширина).

Поле ввода Демо

Шаг 4 – После ввода второго числа нажмите кнопку ОК. Область отображается, как показано на следующем снимке экрана.

Поле ввода Демо

VBA – Переменные

Переменная – это именованная ячейка памяти, используемая для хранения значения, которое можно изменить во время выполнения скрипта. Ниже приведены основные правила именования переменных.

  • Вы должны использовать букву в качестве первого символа.

  • Вы не можете использовать пробел, точку (.), Восклицательный знак (!) Или символы @, &, $, # в имени.

  • Длина имени не может превышать 255 символов.

  • Вы не можете использовать зарезервированные ключевые слова Visual Basic в качестве имени переменной.

Вы должны использовать букву в качестве первого символа.

Вы не можете использовать пробел, точку (.), Восклицательный знак (!) Или символы @, &, $, # в имени.

Длина имени не может превышать 255 символов.

Вы не можете использовать зарезервированные ключевые слова Visual Basic в качестве имени переменной.

Синтаксис

В VBA вам необходимо объявить переменные перед их использованием.

Dim <<variable_name>> As <<variable_type>>

Типы данных

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

Числовые типы данных

В следующей таблице приведены числовые типы данных и допустимый диапазон значений.

Тип Диапазон значений
Байт От 0 до 255
целое число От -32 768 до 32 767
Долго От -2 147 483 648 до 2 147 483 648
не замужем

-3.402823E + 38 до -1.401298E-45 для отрицательных значений

От 1.401298E-45 до 3.402823E + 38 для положительных значений.

двойной

-1,79769313486232e + 308 до -4,94065645841247E-324 для отрицательных значений

4.94065645841247E-324 до 1.79769313486232e + 308 для положительных значений.

валюта От -922,337,203,685,477.5808 до 922,337,203,685,477.5807
Десятичный

+/- 79,228,162,514,264,337,593,543,950,335, если не используется десятичная дробь

+/- 7,9228162514264337593543950335 (28 знаков после запятой).

-3.402823E + 38 до -1.401298E-45 для отрицательных значений

От 1.401298E-45 до 3.402823E + 38 для положительных значений.

-1,79769313486232e + 308 до -4,94065645841247E-324 для отрицательных значений

4.94065645841247E-324 до 1.79769313486232e + 308 для положительных значений.

+/- 79,228,162,514,264,337,593,543,950,335, если не используется десятичная дробь

+/- 7,9228162514264337593543950335 (28 знаков после запятой).

Нечисловые типы данных

В следующей таблице приведены нечисловые типы данных и допустимый диапазон значений.

Тип Диапазон значений
Строка (фиксированная длина) От 1 до 65 400 знаков
Строка (переменной длины) От 0 до 2 миллиардов символов
Дата С 1 января 100 по 31 декабря 9999
логический Правда или ложь
объект Любой вложенный объект
Вариант (числовой) Любое значение до двойного
Вариант (текст) То же, что и строка переменной длины

пример

Давайте создадим кнопку и назовем ее «Variables_demo», чтобы продемонстрировать использование переменных.

vba_02.jpg

Private Sub say_helloworld_Click()
   Dim password As String
   password = "Admin#1"

   Dim num As Integer
   num = 1234

   Dim BirthDay As Date
   BirthDay = DateValue("30 / 10 / 2020")

   MsgBox "Passowrd is " & password & Chr(10) & "Value of num is " &
      num & Chr(10) & "Value of Birthday is " & BirthDay
End Sub

Выход

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

vba_03.jpg

VBA – Константы

Константа – это именованная область памяти, используемая для хранения значения, которое НЕ МОЖЕТ быть изменено во время выполнения скрипта. Если пользователь пытается изменить значение константы, выполнение скрипта заканчивается ошибкой. Константы объявляются так же, как и переменные.

Ниже приведены правила именования констант.

  • Вы должны использовать букву в качестве первого символа.

  • Вы не можете использовать пробел, точку (.), Восклицательный знак (!) Или символы @, &, $, # в имени.

  • Длина имени не может превышать 255 символов.

  • Вы не можете использовать зарезервированные ключевые слова Visual Basic в качестве имени переменной.

Вы должны использовать букву в качестве первого символа.

Вы не можете использовать пробел, точку (.), Восклицательный знак (!) Или символы @, &, $, # в имени.

Длина имени не может превышать 255 символов.

Вы не можете использовать зарезервированные ключевые слова Visual Basic в качестве имени переменной.

Синтаксис

В VBA нам нужно присвоить значение объявленным константам. Выдается ошибка, если мы пытаемся изменить значение константы.

Const <<constant_name>> As <<constant_type>> = <<constant_value>>

пример

Давайте создадим кнопку «Constant_demo», чтобы продемонстрировать, как работать с константами.

Private Sub Constant_demo_Click() 
   Const MyInteger As Integer = 42 
   Const myDate As Date = #2/2/2020# 
   Const myDay As String = "Sunday" 
   
   MsgBox "Integer is " & MyInteger & Chr(10) & "myDate is " 
      & myDate & Chr(10) & "myDay is " & myDay  
End Sub

Выход

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

vba_05.jpg

VBA – Операторы

Оператор может быть определен с помощью простого выражения – 4 + 5 равно 9. Здесь 4 и 5 называются операндами, а + – операторами . VBA поддерживает следующие типы операторов –

  • Арифметические Операторы
  • Операторы сравнения
  • Логические (или реляционные) операторы
  • Операторы конкатенации

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

Следующие арифметические операторы поддерживаются VBA.

Предположим, что переменная A содержит 5, а переменная B содержит 10, тогда –

Показать примеры

оператор Описание пример
+ Добавляет два операнда А + Б даст 15
Вычитает второй операнд из первого А – Б даст -5
* Умножает оба операнда А * Б даст 50
/ Делит числитель на знаменатель Б / у даст 2
% Оператор модуля и остаток после целочисленного деления B% A даст 0
^ Оператор экспонирования B ^ A даст 100000

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

В VBA поддерживаются следующие операторы сравнения.

Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда –

Показать примеры

оператор Описание пример
знак равно Проверяет, равны ли значения двух операндов или нет. Если да, то условие верно. (A = B) является ложным.
<> Проверяет, равны ли значения двух операндов или нет. Если значения не равны, то условие выполняется. (A <> B) верно.
> Проверяет, больше ли значение левого операнда, чем значение правого операнда. Если да, то условие верно. (A> B) является ложным.
< Проверяет, меньше ли значение левого операнда, чем значение правого операнда. Если да, то условие верно. (A <B) верно.
> = Проверяет, больше ли значение левого операнда или равно значению правого операнда. Если да, то условие верно. (A> = B) является ложным.
<= Проверяет, меньше ли значение левого операнда или равно значению правого операнда. Если да, то условие верно. (A <= B) верно.

Логические операторы

Следующие логические операторы поддерживаются VBA.

Предположим, что переменная A содержит 10, а переменная B содержит 0, тогда –

Показать примеры

оператор Описание пример
А ТАКЖЕ Называется логический оператор И. Если оба условия истинны, то выражение истинно. a <> 0 И b <> 0 – Ложь.
ИЛИ ЖЕ Вызывается логическим оператором ИЛИ. Если любое из двух условий истинно, то условие истинно. a <> 0 ИЛИ b <> 0 верно.
НЕ Вызывается логическим оператором НЕ. Используется для изменения логического состояния своего операнда. Если условие истинно, то оператор Логический НЕ будет делать ложь. НЕ (a <> 0 ИЛИ b <> 0) ложно.
XOR Называется логическим исключением. Это комбинация оператора NOT и OR. Если одно и только одно из выражений оценивается как Истина, результатом является Истина. (a <> 0 XOR b <> 0) верно.

Операторы конкатенации

Следующие операторы конкатенации поддерживаются VBA.

Предположим, что переменная A содержит 5, а переменная B содержит 10, тогда –

Показать примеры

оператор Описание пример
+ Добавляет два значения в качестве переменной. Значения числовые А + Б даст 15
& Объединяет два значения А & Б даст 510

Допустим, переменная A = “Microsoft” и переменная B = “VBScript”, тогда –

оператор Описание пример
+ Объединяет два значения A + B даст MicrosoftVBScript
& Объединяет два значения A & B предоставит MicrosoftVBScript

Примечание. Операторы конкатенации могут использоваться как для чисел, так и для строк. Вывод зависит от контекста, если переменные содержат числовое значение или строковое значение.

VBA – Решения

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

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

Принятие решений в VBA

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

Sr.No. Заявление и описание
1 если заявление

Оператор if состоит из логического выражения, за которым следует один или несколько операторов.

2 если .. еще заявление

Оператор if else состоит из логического выражения, за которым следует один или несколько операторов. Если условие истинно, выполняются операторы из операторов If . Если условие ложно, выполняется другая часть сценария.

3 если … еще одно заявление

Оператор if, сопровождаемый одним или несколькими операторами ElseIf , который состоит из логических выражений, а затем сопровождается необязательным оператором else , который выполняется, когда все условия становятся ложными.

4 вложенные операторы if

Оператор if или elseif внутри другого оператора if или elseif .

5 заявление о переключении

Оператор switch позволяет проверять переменную на соответствие списку значений.

Оператор if состоит из логического выражения, за которым следует один или несколько операторов.

Оператор if else состоит из логического выражения, за которым следует один или несколько операторов. Если условие истинно, выполняются операторы из операторов If . Если условие ложно, выполняется другая часть сценария.

Оператор if, сопровождаемый одним или несколькими операторами ElseIf , который состоит из логических выражений, а затем сопровождается необязательным оператором else , который выполняется, когда все условия становятся ложными.

Оператор if или elseif внутри другого оператора if или elseif .

Оператор switch позволяет проверять переменную на соответствие списку значений.

VBA – Петли

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

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

Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз. Ниже приводится общая форма оператора цикла в VBA.

Петлевая архитектура

VBA предоставляет следующие типы циклов для обработки требований циклов. Нажмите на следующие ссылки, чтобы проверить их детали.

Sr.No. Тип и описание петли
1 для цикла

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

2 для каждого цикла

Это выполняется, если в группе есть хотя бы один элемент, и повторяется для каждого элемента в группе.

3 пока .. венд петля

Это проверяет условие перед выполнением тела цикла.

4 сделай .. пока петли

Операторы do..While будут выполняться до тех пор, пока условие истинно. (Т. Е.) Цикл должен повторяться до тех пор, пока условие не станет ложным.

5 делать .. до петель

Операторы do..Until будут выполняться до тех пор, пока условие имеет значение False (т. Е.) Цикл должен повторяться до тех пор, пока условие не станет True.

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

Это выполняется, если в группе есть хотя бы один элемент, и повторяется для каждого элемента в группе.

Это проверяет условие перед выполнением тела цикла.

Операторы do..While будут выполняться до тех пор, пока условие истинно. (Т. Е.) Цикл должен повторяться до тех пор, пока условие не станет ложным.

Операторы do..Until будут выполняться до тех пор, пока условие имеет значение False (т. Е.) Цикл должен повторяться до тех пор, пока условие не станет True.

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

Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение выходит из области видимости, все остальные операторы в цикле НЕ выполняются.

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

S.No. Контрольное заявление и описание
1 Выход для выписки

Завершает оператор цикла For и передает выполнение в оператор, следующий сразу за циклом

2 Выйти Do заявление

Завершает оператор Do While и переносит выполнение в оператор сразу после цикла

Завершает оператор цикла For и передает выполнение в оператор, следующий сразу за циклом

Завершает оператор Do While и переносит выполнение в оператор сразу после цикла

VBA – Струны

Строки – это последовательность символов, которая может состоять из букв, цифр, специальных символов или всех из них. Переменная называется строкой, если она заключена в двойные кавычки “”.

Синтаксис

variablename = "string"

Примеры

str1 = "string"   ' Only Alphabets
str2 = "132.45"   ' Only Numbers
str3 = "!@#$;*"  ' Only Special Characters
Str4 = "Asc23@#"  ' Has all the above

Строковые функции

Существуют предопределенные функции VBA String, которые помогают разработчикам очень эффективно работать со строками. Ниже приведены строковые методы, которые поддерживаются в VBA. Пожалуйста, нажмите на каждый из методов, чтобы узнать подробно.

Sr.No. Название и описание функции
1 InStr

Возвращает первое вхождение указанной подстроки. Поиск происходит слева направо.

2 InStrRev

Возвращает первое вхождение указанной подстроки. Поиск происходит справа налево.

3 LCASE

Возвращает нижний регистр указанной строки.

4 UCase

Возвращает верхний регистр указанной строки.

5 Оставил

Возвращает определенное количество символов с левой стороны строки.

6 Правильно

Возвращает определенное количество символов с правой стороны строки.

7 средний

Возвращает определенное количество символов из строки на основе указанных параметров.

8 LTrim

Возвращает строку после удаления пробелов в левой части указанной строки.

9 RTrim

Возвращает строку после удаления пробелов с правой стороны указанной строки.

10 Отделка

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

11 Len

Возвращает длину заданной строки.

12 замещать

Возвращает строку после замены строки другой строкой.

13 Космос

Заполняет строку указанным количеством пробелов.

14 StrComp

Возвращает целочисленное значение после сравнения двух указанных строк.

15 строка

Возвращает строку с указанным символом указанное количество раз.

16 StrReverse

Возвращает строку после изменения последовательности символов данной строки.

Возвращает первое вхождение указанной подстроки. Поиск происходит слева направо.

Возвращает первое вхождение указанной подстроки. Поиск происходит справа налево.

Возвращает нижний регистр указанной строки.

Возвращает верхний регистр указанной строки.

Возвращает определенное количество символов с левой стороны строки.

Возвращает определенное количество символов с правой стороны строки.

Возвращает определенное количество символов из строки на основе указанных параметров.

Возвращает строку после удаления пробелов в левой части указанной строки.

Возвращает строку после удаления пробелов с правой стороны указанной строки.

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

Возвращает длину заданной строки.

Возвращает строку после замены строки другой строкой.

Заполняет строку указанным количеством пробелов.

Возвращает целочисленное значение после сравнения двух указанных строк.

Возвращает строку с указанным символом указанное количество раз.

Возвращает строку после изменения последовательности символов данной строки.

VBA – функция даты и времени

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

Функции даты

Sr.No. Описание функции
1 Дата

Функция, которая возвращает текущую системную дату.

2 CDate

Функция, которая преобразует данный вход в дату.

3 DateAdd

Функция, которая возвращает дату, к которой был добавлен указанный интервал времени.

4 DateDiff

Функция, которая возвращает разницу между двумя периодами времени.

5 DatePart

Функция, которая возвращает указанную часть заданного значения даты ввода.

6 DateSerial

Функция, которая возвращает действительную дату для данного года, месяца и даты.

7 FormatDateTime

Функция, которая форматирует дату на основе предоставленных параметров.

8 IsDate

Функция, которая возвращает логическое значение независимо от того, является ли предоставленный параметр датой.

9 День

Функция, которая возвращает целое число от 1 до 31, представляющее день указанной даты.

10 Месяц

Функция, которая возвращает целое число от 1 до 12, представляющее месяц указанной даты.

11 Год

Функция, которая возвращает целое число, представляющее год указанной даты.

12 MonthName

Функция, которая возвращает название определенного месяца для указанной даты.

13 WeekDay

Функция, которая возвращает целое число (от 1 до 7), которое представляет день недели для указанного дня.

14 WeekDayName

Функция, которая возвращает название дня недели для указанного дня.

Функция, которая возвращает текущую системную дату.

Функция, которая преобразует данный вход в дату.

Функция, которая возвращает дату, к которой был добавлен указанный интервал времени.

Функция, которая возвращает разницу между двумя периодами времени.

Функция, которая возвращает указанную часть заданного значения даты ввода.

Функция, которая возвращает действительную дату для данного года, месяца и даты.

Функция, которая форматирует дату на основе предоставленных параметров.

Функция, которая возвращает логическое значение независимо от того, является ли предоставленный параметр датой.

Функция, которая возвращает целое число от 1 до 31, представляющее день указанной даты.

Функция, которая возвращает целое число от 1 до 12, представляющее месяц указанной даты.

Функция, которая возвращает целое число, представляющее год указанной даты.

Функция, которая возвращает название определенного месяца для указанной даты.

Функция, которая возвращает целое число (от 1 до 7), которое представляет день недели для указанного дня.

Функция, которая возвращает название дня недели для указанного дня.

Функции времени

Sr.No. Описание функции
1 Сейчас

Функция, которая возвращает текущую системную дату и время.

2 Час

Функция, которая возвращает целое число от 0 до 23, представляющее часовую часть данного времени.

3 минут

Функция, которая возвращает целое число от 0 до 59, которое представляет часть минут данного времени.

4 второй

Функция, которая возвращает целое число от 0 до 59, которое представляет часть секунд данного времени.

5 Время

Функция, которая возвращает текущее системное время.

6 таймер

Функция, которая возвращает количество секунд и миллисекунд с 12:00.

7 TimeSerial

Функция, которая возвращает время для конкретного ввода часов, минут и секунд.

8 TimeValue

Функция, которая преобразует входную строку в формат времени.

Функция, которая возвращает текущую системную дату и время.

Функция, которая возвращает целое число от 0 до 23, представляющее часовую часть данного времени.

Функция, которая возвращает целое число от 0 до 59, которое представляет часть минут данного времени.

Функция, которая возвращает целое число от 0 до 59, которое представляет часть секунд данного времени.

Функция, которая возвращает текущее системное время.

Функция, которая возвращает количество секунд и миллисекунд с 12:00.

Функция, которая возвращает время для конкретного ввода часов, минут и секунд.

Функция, которая преобразует входную строку в формат времени.

VBA – Массивы

Мы очень хорошо знаем, что переменная является контейнером для хранения значения. Иногда разработчики могут одновременно хранить более одного значения в одной переменной. Когда ряд значений хранится в одной переменной, она называется переменной массива .

Декларация массива

Массивы объявляются так же, как и переменная, за исключением того, что объявление переменной массива использует круглые скобки. В следующем примере размер массива указан в скобках.

'Method 1 : Using Dim
Dim arr1()	'Without Size

'Method 2 : Mentioning the Size
Dim arr2(5)  'Declared with size of 5

'Method 3 : using 'Array' Parameter
Dim arr3
arr3 = Array("apple","Orange","Grapes")
  • Хотя размер массива указан как 5, он может содержать 6 значений, так как индекс массива начинается с нуля.

  • Индекс массива не может быть отрицательным.

  • Массивы VBScript могут хранить переменные любого типа в массиве. Следовательно, массив может хранить целое число, строку или символы в одной переменной массива.

Хотя размер массива указан как 5, он может содержать 6 значений, так как индекс массива начинается с нуля.

Индекс массива не может быть отрицательным.

Массивы VBScript могут хранить переменные любого типа в массиве. Следовательно, массив может хранить целое число, строку или символы в одной переменной массива.

Присвоение значений массиву

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

пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click()
   Dim arr(5)
   arr(0) = "1"           'Number as String
   arr(1) = "VBScript"    'String
   arr(2) = 100 		     'Number
   arr(3) = 2.45 		     'Decimal Number
   arr(4) = #10/07/2013#  'Date
   arr(5) = #12.45 PM#    'Time
  
   msgbox("Value stored in Array index 0 : " & arr(0))
   msgbox("Value stored in Array index 1 : " & arr(1))
   msgbox("Value stored in Array index 2 : " & arr(2))
   msgbox("Value stored in Array index 3 : " & arr(3))
   msgbox("Value stored in Array index 4 : " & arr(4))
   msgbox("Value stored in Array index 5 : " & arr(5))
End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

Value stored in Array index 0 : 1
Value stored in Array index 1 : VBScript
Value stored in Array index 2 : 100
Value stored in Array index 3 : 2.45
Value stored in Array index 4 : 7/10/2013
Value stored in Array index 5 : 12:45:00 PM

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

Массивы не просто ограничены одним измерением, однако они могут иметь максимум 60 измерений. Двумерные массивы являются наиболее часто используемыми.

пример

В следующем примере объявляется многомерный массив с 3 строками и 4 столбцами.

Private Sub Constant_demo_Click()
   Dim arr(2,3) as Variant	' Which has 3 rows and 4 columns
   arr(0,0) = "Apple" 
   arr(0,1) = "Orange"
   arr(0,2) = "Grapes"           
   arr(0,3) = "pineapple" 
   arr(1,0) = "cucumber"           
   arr(1,1) = "beans"           
   arr(1,2) = "carrot"           
   arr(1,3) = "tomato"           
   arr(2,0) = "potato"             
   arr(2,1) = "sandwitch"            
   arr(2,2) = "coffee"             
   arr(2,3) = "nuts"            
           
   msgbox("Value in Array index 0,1 : " &  arr(0,1))
   msgbox("Value in Array index 2,2 : " &  arr(2,2))
End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

Value stored in Array index : 0 , 1 : Orange
Value stored in Array index : 2 , 2 : coffee

ReDim Заявление

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

Синтаксис

ReDim [Preserve] varname(subscripts) [, varname(subscripts)]

Описание параметра

  • Сохранять – необязательный параметр, используемый для сохранения данных в существующем массиве при изменении размера последнего измерения.

  • Varname – обязательный параметр, который обозначает имя переменной, которое должно соответствовать стандартным соглашениям об именах переменных.

  • Subscripts – обязательный параметр, который указывает размер массива.

Сохранять – необязательный параметр, используемый для сохранения данных в существующем массиве при изменении размера последнего измерения.

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

Subscripts – обязательный параметр, который указывает размер массива.

пример

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

Примечание. При изменении размера массива, меньшего, чем он был изначально, данные в удаленных элементах будут потеряны.

Private Sub Constant_demo_Click()
   Dim a() as variant
   i = 0
   redim a(5)
   a(0) = "XYZ"
   a(1) = 41.25
   a(2) = 22
  
   REDIM PRESERVE a(7)
   For i = 3 to 7
   a(i) = i
   Next
  
   'to Fetch the output
   For i = 0 to ubound(a)
      Msgbox a(i)
   Next
End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

XYZ
41.25
22
3
4
5
6
7

Методы массива

В VBScript есть различные встроенные функции, которые помогают разработчикам эффективно обрабатывать массивы. Все методы, которые используются в сочетании с массивами, перечислены ниже. Пожалуйста, нажмите на название метода, чтобы узнать о нем подробно.

Sr.No. Описание функции
1 LBound

Функция, которая возвращает целое число, соответствующее наименьшему нижнему индексу из указанных массивов.

2 UBound

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

3 Трещина

Функция, которая возвращает массив, содержащий указанное количество значений. Разделить на основе разделителя.

4 Присоединиться

Функция, которая возвращает строку, которая содержит указанное количество подстрок в массиве. Это прямо противоположная функция метода разделения.

5 Фильтр

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

6 IsArray

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

7 стирать

Функция, которая восстанавливает выделенную память для переменных массива.

Функция, которая возвращает целое число, соответствующее наименьшему нижнему индексу из указанных массивов.

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

Функция, которая возвращает массив, содержащий указанное количество значений. Разделить на основе разделителя.

Функция, которая возвращает строку, которая содержит указанное количество подстрок в массиве. Это прямо противоположная функция метода разделения.

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

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

Функция, которая восстанавливает выделенную память для переменных массива.

VBA – Пользовательские функции

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

Помимо встроенных функций, VBA позволяет также писать пользовательские функции. В этой главе вы узнаете, как писать свои собственные функции в VBA.

Определение функции

Функция VBA может иметь необязательный оператор возврата. Это необходимо, если вы хотите вернуть значение из функции.

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

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

Прежде чем использовать функцию, нам нужно определить эту конкретную функцию. Наиболее распространенный способ определения функции в VBA – использование ключевого слова Function , за которым следует уникальное имя функции, которое может содержать или не содержать список параметров и оператор с ключевым словом End Function , который указывает конец функции. Ниже приведен основной синтаксис.

Синтаксис

Добавьте кнопку и добавьте следующую функцию.

Function Functionname(parameter-list)
   statement 1
   statement 2
   statement 3
   .......
   statement n
End Function

пример

Добавьте следующую функцию, которая возвращает область. Обратите внимание, что значение / значения могут быть возвращены с самим именем функции.

Function findArea(Length As Double, Optional Width As Variant)
   If IsMissing(Width) Then
      findArea = Length * Length
   Else
      findArea = Length * Width
   End If
End Function

Вызов функции

Чтобы вызвать функцию, вызовите функцию, используя имя функции, как показано на следующем снимке экрана.

Принятие решений в VBA

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

Принятие решений в VBA

VBA – подпроцедура

Подпроцедуры похожи на функции, однако есть несколько отличий.

  • Подпроцедуры НЕ возвращают значение, в то время как функции могут возвращать или не возвращать значение.

  • Подпроцедуры МОГУТ быть вызваны без ключевого слова вызова.

  • Подпроцедуры всегда заключены в инструкции Sub и End Sub.

Подпроцедуры НЕ возвращают значение, в то время как функции могут возвращать или не возвращать значение.

Подпроцедуры МОГУТ быть вызваны без ключевого слова вызова.

Подпроцедуры всегда заключены в инструкции Sub и End Sub.

пример

Sub Area(x As Double, y As Double)
   MsgBox x * y
End Sub

Процедуры вызова

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

Function findArea(Length As Double, Width As Variant)
   area Length, Width    ' To Calculate Area 'area' sub proc is called
End Function

Теперь вы сможете вызывать только функцию, но не подпроцедуру, как показано на следующем снимке экрана.

Подпроцедура в VBA

Площадь рассчитывается и отображается только в окне сообщения.

Рассчитать площадь Sub 2 в VBA

В ячейке результата отображается НОЛЬ, так как значение области НЕ возвращается из функции. Короче говоря, вы не можете сделать прямой вызов подпроцедуры из листа Excel.

Рассчитать площадь Sub 3 в VBA

VBA – События

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

  • События рабочего листа
  • Рабочая тетрадь События

События рабочего листа

События рабочего листа инициируются при изменении рабочего листа. Он создается путем щелчка правой кнопкой мыши на вкладке листа и выбора «просмотра кода», а затем вставки кода.

Пользователь может выбрать каждый из этих рабочих листов и выбрать «Рабочий лист» из выпадающего списка, чтобы получить список всех поддерживаемых событий рабочего листа.

Поле ввода Демо

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

Private Sub Worksheet_Activate() 
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)    
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 
Private Sub Worksheet_Calculate() 
Private Sub Worksheet_Change(ByVal Target As Range) 
Private Sub Worksheet_Deactivate() 
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

пример

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

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   MsgBox "Before Double Click"
End Sub

Выход

При двойном щелчке по любой ячейке окно сообщения отображается пользователю, как показано на следующем снимке экрана.

Поле ввода Демо

Рабочая тетрадь События

События рабочей книги инициируются, когда происходит изменение рабочей книги в целом. Мы можем добавить код для событий рабочей книги, выбрав «ThisWorkbook» и выбрав «рабочая книга» из выпадающего списка, как показано на следующем снимке экрана. Немедленно подпрограмма Workbook_open отображается пользователю, как показано на следующем снимке экрана.

Поле ввода Демо

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

Private Sub Workbook_AddinUninstall() 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Private Sub Workbook_BeforePrint(Cancel As Boolean) 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Private Sub Workbook_Deactivate() 
Private Sub Workbook_NewSheet(ByVal Sh As Object) 
Private Sub Workbook_Open() 
Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 
Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 
Private Sub Workbook_WindowActivate(ByVal Wn As Window) 
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) 
Private Sub Workbook_WindowResize(ByVal Wn As Window)

пример

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

Private Sub Workbook_NewSheet(ByVal Sh As Object)
   MsgBox "New Sheet Created Successfully"
End Sub

Выход

После создания нового листа Excel пользователю отображается сообщение, как показано на следующем снимке экрана.

Поле ввода Демо

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

Существует три типа ошибок в программировании: (a) синтаксические ошибки, (b) ошибки времени выполнения и (c) логические ошибки.

Синтаксические ошибки

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

Function ErrorHanlding_Demo()
   dim x,y
   x = "Tutorialspoint"
   y = Ucase(x
End Function

Ошибки во время выполнения

Ошибки времени выполнения, также называемые исключениями, возникают во время выполнения после интерпретации.

Например, следующая строка вызывает ошибку во время выполнения, потому что здесь синтаксис правильный, но во время выполнения он пытается вызвать fnmultiply, который является несуществующей функцией.

Function ErrorHanlding_Demo1()
   Dim x,y
   x = 10
   y = 20
   z = fnadd(x,y)
   a = fnmultiply(x,y)
End Function

Function fnadd(x,y)
   fnadd = x + y
End Function

Логические ошибки

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

Вы не можете поймать эти ошибки, потому что это зависит от требований вашего бизнеса, какую логику вы хотите использовать в своей программе.

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

Err Object

Предположим, если у нас есть ошибка во время выполнения, то выполнение останавливается, отображая сообщение об ошибке. Как разработчик, если мы хотим зафиксировать ошибку, то используется Error Object.

пример

В следующем примере Err.Number дает номер ошибки, а Err.Description – описание ошибки.

Err.Raise 6   ' Raise an overflow error.
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear   ' Clear the error.

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

VBA включает подпрограмму обработки ошибок, а также может использоваться для отключения подпрограммы обработки ошибок. Без оператора On Error любая ошибка во время выполнения является фатальной: отображается сообщение об ошибке, и выполнение резко останавливается.

On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Sr.No. Ключевое слово и описание
1

Линия GoTo

Включает процедуру обработки ошибок, которая начинается со строки, указанной в требуемом аргументе строки. Указанная строка должна быть в той же процедуре, что и оператор On Error, иначе произойдет ошибка времени компиляции.

2

Перейти 0

Отключает включенный обработчик ошибок в текущей процедуре и сбрасывает его в Nothing.

3

GoTo -1

Отключает включенное исключение в текущей процедуре и сбрасывает его в Nothing.

4

Продолжить дальше

Указывает, что при возникновении ошибки во время выполнения элемент управления переходит к оператору, который следует сразу за оператором, в котором произошла ошибка, и выполнение продолжается с этой точки.

Линия GoTo

Включает процедуру обработки ошибок, которая начинается со строки, указанной в требуемом аргументе строки. Указанная строка должна быть в той же процедуре, что и оператор On Error, иначе произойдет ошибка времени компиляции.

Перейти 0

Отключает включенный обработчик ошибок в текущей процедуре и сбрасывает его в Nothing.

GoTo -1

Отключает включенное исключение в текущей процедуре и сбрасывает его в Nothing.

Продолжить дальше

Указывает, что при возникновении ошибки во время выполнения элемент управления переходит к оператору, который следует сразу за оператором, в котором произошла ошибка, и выполнение продолжается с этой точки.

пример

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x, y, z As Integer
   x = 50
   y = 0
   z = x / y   ' Divide by ZERO Error Raises
  
   ErrorHandler:    ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 10   ' Divide by zero error
         MsgBox ("You attempted to divide by zero!")
      Case Else
         MsgBox "UNKNOWN ERROR  - Error# " & Err.Number & " : " & Err.Description
   End Select
   Resume Next
End Sub

VBA – объекты Excel

При программировании с использованием VBA есть несколько важных объектов, с которыми пользователь будет иметь дело.

  • Объекты приложения
  • Объекты рабочей книги
  • Объекты рабочего листа
  • Диапазон объектов

Объекты приложения

Объект Application состоит из следующих элементов:

  • Общесоциальные настройки и опции.
  • Методы, которые возвращают объекты верхнего уровня, такие как ActiveCell, ActiveSheet и т. Д.

пример

'Example 1 :
Set xlapp = CreateObject("Excel.Sheet") 
xlapp.Application.Workbooks.Open "C:test.xls"

'Example 2 :
Application.Windows("test.xls").Activate

'Example 3:
Application.ActiveCell.Font.Bold = True

Объекты рабочей книги

Объект Workbook является членом коллекции Workbooks и содержит все объекты Workbook, открытые в настоящее время в Microsoft Excel.

пример

'Ex 1 : To close Workbooks
Workbooks.Close

'Ex 2 : To Add an Empty Work Book
Workbooks.Add

'Ex 3: To Open a Workbook
Workbooks.Open FileName:="Test.xls", ReadOnly:=True

'Ex : 4 - To Activate WorkBooks
Workbooks("Test.xls").Worksheets("Sheet1").Activate

Объекты рабочего листа

Объект Worksheet является членом коллекции Worksheets и содержит все объекты Worksheet в рабочей книге.

пример

'Ex 1 : To make it Invisible
Worksheets(1).Visible = False

'Ex 2 : To protect an WorkSheet
Worksheets("Sheet1").Protect password:=strPassword, scenarios:=True

Диапазон объектов

Объекты Range представляют ячейку, строку, столбец или выборку ячеек, содержащих один или несколько непрерывных блоков ячеек.

'Ex 1 : To Put a value in the cell A5
Worksheets("Sheet1").Range("A5").Value = "5235"

'Ex 2 : To put a value in range of Cells
Worksheets("Sheet1").Range("A1:A4").Value = 5

VBA – Текстовые файлы

Вы также можете прочитать файл Excel и записать содержимое ячейки в текстовый файл, используя VBA. VBA позволяет пользователям работать с текстовыми файлами двумя способами:

  • Объект файловой системы
  • используя команду записи

Объект файловой системы (FSO)

Как следует из названия, FSO помогают разработчикам работать с дисками, папками и файлами. В этом разделе мы обсудим, как использовать FSO.

Sr.No. Тип объекта и описание
1

Привод

Драйв – это объект. Содержит методы и свойства, которые позволяют собирать информацию о диске, подключенном к системе.

2

приводы

Диски это коллекция. Он предоставляет список дисков, подключенных к системе, физически или логически.

3

файл

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

4

файлы

Файлы это коллекция. Он предоставляет список всех файлов, содержащихся в папке.

5

скоросшиватель

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

6

Папки

Папки это коллекция. Он предоставляет список всех папок в папке.

7

TextStream

TextStream – это объект. Это позволяет разработчикам читать и писать текстовые файлы.

Привод

Драйв – это объект. Содержит методы и свойства, которые позволяют собирать информацию о диске, подключенном к системе.

приводы

Диски это коллекция. Он предоставляет список дисков, подключенных к системе, физически или логически.

файл

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

файлы

Файлы это коллекция. Он предоставляет список всех файлов, содержащихся в папке.

скоросшиватель

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

Папки

Папки это коллекция. Он предоставляет список всех папок в папке.

TextStream

TextStream – это объект. Это позволяет разработчикам читать и писать текстовые файлы.

Привод

Диск – это объект, который обеспечивает доступ к свойствам конкретного диска или общей сетевой папки. Следующие свойства поддерживаются объектом Drive

  • Доступное пространство
  • DriveLetter
  • Тип вождения
  • Файловая система
  • Свободное место
  • Готов
  • Дорожка
  • Корневая папка
  • Серийный номер
  • ShareName
  • Общий размер
  • VolumeName

пример

Шаг 1. Прежде чем приступить к написанию сценариев с использованием FSO, мы должны включить Microsoft Scripting Runtime. Чтобы сделать то же самое, перейдите в Инструменты → Ссылки, как показано на следующем снимке экрана.

Excel FSO в VBScript

Шаг 2. Добавьте «Microsoft Scripting RunTime» и нажмите «ОК».

Excel FSO в VBScript

Шаг 3 – Добавьте данные, которые вы хотели бы записать в текстовый файл, и добавьте командную кнопку.

Excel FSO в VBScript

Шаг 4 – Теперь пришло время для сценария.

Private Sub fn_write_to_text_Click()
   Dim FilePath As String
   Dim CellData As String
   Dim LastCol As Long
   Dim LastRow As Long
  
   Dim fso As FileSystemObject
   Set fso = New FileSystemObject
   Dim stream As TextStream
  
   LastCol = ActiveSheet.UsedRange.Columns.Count
   LastRow = ActiveSheet.UsedRange.Rows.Count
    
   ' Create a TextStream.
   Set stream = fso.OpenTextFile("D:TrySupport.log", ForWriting, True)
  
   CellData = ""
  
   For i = 1 To LastRow
      For j = 1 To LastCol
         CellData = Trim(ActiveCell(i, j).Value)
         stream.WriteLine "The Value at location (" & i & "," & j & ")" & CellData
      Next j
   Next i
  
   stream.Close
   MsgBox ("Job Done")
End Sub

Выход

При выполнении сценария убедитесь, что курсор помещен в первую ячейку рабочего листа. Файл Support.log создается, как показано на следующем снимке экрана в разделе «D: Try».

Excel FSO в VBScript

Содержимое файла показано на следующем снимке экрана.

Excel FSO в VBScript

Написать команду

В отличие от FSO, нам НЕ нужно добавлять ссылки, однако мы НЕ сможем работать с дисками, файлами и папками. Мы сможем просто добавить поток в текстовый файл.

пример

Private Sub fn_write_to_text_Click()
   Dim FilePath As String
   Dim CellData As String
   Dim LastCol As Long
   Dim LastRow As Long
  
   LastCol = ActiveSheet.UsedRange.Columns.Count
   LastRow = ActiveSheet.UsedRange.Rows.Count
    
   FilePath = "D:Trywrite.txt"
   Open FilePath For Output As #2
  
   CellData = ""
   For i = 1 To LastRow
      For j = 1 To LastCol
         CellData = "The Value at location (" & i & "," & j & ")" & Trim(ActiveCell(i, j).Value)
         Write #2, CellData
      Next j
   Next i
  
   Close #2
   MsgBox ("Job Done")
End Sub

Выход

После выполнения сценария файл «write.txt» создается в папке «D: Try», как показано на следующем снимке экрана.

Excel FSO в VBScript

Содержимое файла показано на следующем снимке экрана.

Excel FSO в VBScript

VBA – Графики программирования

Используя VBA, вы можете создавать графики на основе определенных критериев. Давайте посмотрим на это на примере.

Шаг 1 – Введите данные, по которым должен быть сгенерирован график.

График в VBA

Шаг 2 – Создайте 3 кнопки – одну для создания гистограммы, другую для создания круговой диаграммы и другую для создания столбчатой ​​диаграммы.

График в VBA

Шаг 3 – Разработайте макрос, чтобы сгенерировать каждый из этих типов диаграмм.

' Procedure to Generate Pie Chart
Private Sub fn_generate_pie_graph_Click()
   Dim cht As ChartObject
   For Each cht In Worksheets(1).ChartObjects
      cht.Chart.Type = xlPie
   Next cht
End Sub

' Procedure to Generate Bar Graph
Private Sub fn_Generate_Bar_Graph_Click()
   Dim cht As ChartObject
   For Each cht In Worksheets(1).ChartObjects
      cht.Chart.Type = xlBar
   Next cht
End Sub

' Procedure to Generate Column Graph
Private Sub fn_generate_column_graph_Click()
   Dim cht As ChartObject
   For Each cht In Worksheets(1).ChartObjects
      cht.Chart.Type = xlColumn
   Next cht
End Sub

Шаг 4 – При нажатии на соответствующую кнопку создается диаграмма. В следующем выводе нажмите кнопку «Сгенерировать круговую диаграмму».

График в VBA

VBA – формы пользователя

Форма пользователя – это настраиваемое диалоговое окно, которое делает ввод пользовательских данных более управляемым и более простым в использовании для пользователя. В этой главе вы научитесь разрабатывать простую форму и добавлять данные в Excel.

Шаг 1 – Перейдите к окну VBA, нажав Alt + F11 и перейдите к меню «Вставить» и выберите «Форма пользователя». После выбора форма пользователя отображается, как показано на следующем снимке экрана.

Заявления о принятии решений в VBScript

Шаг 2 – Разработка форм с использованием заданных элементов управления.

Заявления о принятии решений в VBScript

Шаг 3 – После добавления каждого элемента управления, элементы управления должны быть названы. Заголовок соответствует тому, что отображается в форме, а имя соответствует логическому имени, которое будет появляться при написании кода VBA для этого элемента.

Заявления о принятии решений в VBScript

Шаг 4 – Ниже приведены имена против каждого из добавленных элементов управления.

контроль Логическое имя титр
От frmempform Форма сотрудника
Идентификационная этикетка сотрудника EmpID ID сотрудника
Имя Label Box имя Имя
фамилия этикетка Фамилия Фамилия
Dob Label Box дата рождения Дата рождения
Mailid Label Box почтовый идентификатор Email ID
Этикетка для паспорта Держатель паспорта Держатель паспорта
Текстовое поле Emp ID txtempid Непригодный
Имя Текстовое поле txtfirstname Непригодный
Фамилия Текстовое поле txtlastname Непригодный
Текстовое поле идентификатора электронной почты txtemailid Непригодный
Поле со списком даты cmbdate Непригодный
Поле со списком месяцев cmbmonth Непригодный
Поле со списком cmbyear Непригодный
Да радио кнопка radioyes да
Нет радио кнопки radiono нет
Кнопка «Отправить» btnsubmit Отправить
Кнопка Отмена btncancel отменить

Шаг 5 – Добавьте код для события загрузки формы, выполнив щелчок правой кнопкой мыши на форме и выбрав «Просмотреть код».

Заявления о принятии решений в VBScript

Шаг 6 – Выберите «Userform» из выпадающего списка объектов и выберите метод «Initialize», как показано на следующем снимке экрана.

Заявления о принятии решений в VBScript

Шаг 7 – После загрузки формы убедитесь, что текстовые поля очищены, раскрывающиеся окна заполнены и переключатели сброшены.

Private Sub UserForm_Initialize()
   'Empty Emp ID Text box and Set the Cursor 
   txtempid.Value = ""
   txtempid.SetFocus
   
   'Empty all other text box fields
   txtfirstname.Value = ""
   txtlastname.Value = ""
   txtemailid.Value = ""
   
   'Clear All Date of Birth Related Fields
   cmbdate.Clear
   cmbmonth.Clear
   cmbyear.Clear
   
   'Fill Date Drop Down box - Takes 1 to 31
   With cmbdate
      .AddItem "1"
      .AddItem "2"
      .AddItem "3"
      .AddItem "4"
      .AddItem "5"
      .AddItem "6"
      .AddItem "7"
      .AddItem "8"
      .AddItem "9"
      .AddItem "10"
      .AddItem "11"
      .AddItem "12"
      .AddItem "13"
      .AddItem "14"
      .AddItem "15"
      .AddItem "16"
      .AddItem "17"
      .AddItem "18"
      .AddItem "19"
      .AddItem "20"
      .AddItem "21"
      .AddItem "22"
      .AddItem "23"
      .AddItem "24"
      .AddItem "25"
      .AddItem "26"
      .AddItem "27"
      .AddItem "28"
      .AddItem "29"
      .AddItem "30"
      .AddItem "31"
   End With
   
   'Fill Month Drop Down box - Takes Jan to Dec
   With cmbmonth
      .AddItem "JAN"
      .AddItem "FEB"
      .AddItem "MAR"
      .AddItem "APR"
      .AddItem "MAY"
      .AddItem "JUN"
      .AddItem "JUL"
      .AddItem "AUG"
      .AddItem "SEP"
      .AddItem "OCT"
      .AddItem "NOV"
      .AddItem "DEC"
   End With
   
   'Fill Year Drop Down box - Takes 1980 to 2014
   With cmbyear
      .AddItem "1980"
      .AddItem "1981"
      .AddItem "1982"
      .AddItem "1983"
      .AddItem "1984"
      .AddItem "1985"
      .AddItem "1986"
      .AddItem "1987"
      .AddItem "1988"
      .AddItem "1989"
      .AddItem "1990"
      .AddItem "1991"
      .AddItem "1992"
      .AddItem "1993"
      .AddItem "1994"
      .AddItem "1995"
      .AddItem "1996"
      .AddItem "1997"
      .AddItem "1998"
      .AddItem "1999"
      .AddItem "2000"
      .AddItem "2001"
      .AddItem "2002"
      .AddItem "2003"
      .AddItem "2004"
      .AddItem "2005"
      .AddItem "2006"
      .AddItem "2007"
      .AddItem "2008"
      .AddItem "2009"
      .AddItem "2010"
      .AddItem "2011"
      .AddItem "2012"
      .AddItem "2013"
      .AddItem "2014"
   End With
   
   'Reset Radio Button. Set it to False when form loads.
   radioyes.Value = False
   radiono.Value = False

End Sub

Шаг 8 – Теперь добавьте код в кнопку «Отправить». Нажав кнопку «Отправить», пользователь сможет добавить значения в таблицу.

Private Sub btnsubmit_Click()
   Dim emptyRow As Long
  
   'Make Sheet1 active
   Sheet1.Activate
  
   'Determine emptyRow
   emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1
  
   'Transfer information
   Cells(emptyRow, 1).Value = txtempid.Value
   Cells(emptyRow, 2).Value = txtfirstname.Value
   Cells(emptyRow, 3).Value = txtlastname.Value
   Cells(emptyRow, 4).Value = cmbdate.Value & "/" & cmbmonth.Value & "/" & cmbyear.Value
   Cells(emptyRow, 5).Value = txtemailid.Value
  
   If radioyes.Value = True Then
      Cells(emptyRow, 6).Value = "Yes"
   Else
      Cells(emptyRow, 6).Value = "No"
   End If
End Sub

Шаг 9 – Добавьте метод, чтобы закрыть форму, когда пользователь нажимает кнопку Отмена.

Private Sub btncancel_Click()
   Unload Me
End Sub

Шаг 10 – Заполните форму, нажав кнопку «Выполнить». Введите значения в форму и нажмите кнопку «Отправить». Автоматически значения будут перетекать в лист, как показано на следующем снимке экрана.


VBA — Overview

VBA stands for Visual Basic for Applications an event-driven programming language from Microsoft that is now predominantly used with Microsoft office applications such as MSExcel, MS-Word, and MS-Access.

It helps techies to build customized applications and solutions to enhance the capabilities of those applications. The advantage of this facility is that you NEED NOT have visual basic installed on our PC, however, installing Office will implicitly help in achieving the purpose.

You can use VBA in all office versions, right from MS-Office 97 to MS-Office 2013 and also with any of the latest versions available. Among VBA, Excel VBA is the most popular. The advantage of using VBA is that you can build very powerful tools in MS Excel using linear programming.

Application of VBA

You might wonder why to use VBA in Excel as MS-Excel itself provides loads of inbuilt functions. MS-Excel provides only basic inbuilt functions which might not be sufficient to perform complex calculations. Under such circumstances, VBA becomes the most obvious solution.

For example, it is very hard to calculate the monthly repayment of a loan using Excel’s built-in formulas. Rather, it is easy to program a VBA for such a calculation.

Accessing VBA Editor

In Excel window, press «ALT+F11». A VBA window opens up as shown in the following screenshot.

Decision making statements in VBScript

VBA — Excel Macros

In this chapter, you will learn how to write a simple macro in a step by step manner.

Step 1 − First, enable ‘Developer’ menu in Excel 20XX. To do the same, click File → Options.

Step 2 − Click ‘Customize the Ribbon’ tab and check ‘Developer’. Click ‘OK’.

Developer in VBScript

Step 3 − The ‘Developer’ ribbon appears in the menu bar.

Developer in VBScript

Step 4 − Click the ‘Visual Basic’ button to open the VBA Editor.

Developer in VBScript

Step 5 − Start scripting by adding a button. Click Insert → Select the button.

Developer in VBScript

Step 6 − Perform a right-click and choose ‘properties’.

Developer in VBScript

Step 7 − Edit the name and caption as shown in the following screenshot.

Developer in VBScript

Step 8 − Now double-click the button and the sub-procedure outline will be displayed as shown in the following screenshot.

Developer in VBScript

Step 9 − Start coding by simply adding a message.

Private Sub say_helloworld_Click()
   MsgBox "Hi"
End Sub

Step 10 − Click the button to execute the sub-procedure. The output of the sub-procedure is shown in the following screenshot. Make sure that you do have design mode turned on. Simply click it to turn it on if it is not on.

Developer in VBScript

Note − In further chapters, we will demonstrate using a simple button, as explained from step#1 to 10. Hence , it is important to understand this chapter thoroughly.

VBA — Excel Terms

In this chapter, you will acquaint yourself with the commonly used excel VBA terminologies. These terminologies will be used in further modules, hence understanding each one of these is important.

Modules

Modules is the area where the code is written. This is a new Workbook, hence there aren’t any Modules.

Module in VBScript

To insert a Module, navigate to Insert → Module. Once a module is inserted ‘module1’ is created.

Within the modules, we can write VBA code and the code is written within a Procedure. A Procedure/Sub Procedure is a series of VBA statements instructing what to do.

Module in VBScript

Procedure

Procedures are a group of statements executed as a whole, which instructs Excel how to perform a specific task. The task performed can be a very simple or a very complicated task. However, it is a good practice to break down complicated procedures into smaller ones.

The two main types of Procedures are Sub and Function.

Module in VBScript

Function

A function is a group of reusable code, which can be called anywhere in your program. This eliminates the need of writing the same code over and over again. This helps the programmers to divide a big program into a number of small and manageable functions.

Apart from inbuilt Functions, VBA allows to write user-defined functions as well and statements are written between Function and End Function.

Sub-Procedures

Sub-procedures work similar to functions. While sub procedures DO NOT Return a value, functions may or may not return a value. Sub procedures CAN be called without call keyword. Sub procedures are always enclosed within Sub and End Sub statements.

VBA — Macro Comments

Comments are used to document the program logic and the user information with which other programmers can seamlessly work on the same code in future.

It includes information such as developed by, modified by, and can also include incorporated logic. Comments are ignored by the interpreter while execution.

Comments in VBA are denoted by two methods.

  • Any statement that starts with a Single Quote (‘) is treated as comment. Following is an example.

' This Script is invoked after successful login 
' Written by : TutorialsPoint 
' Return Value : True / False
  • Any statement that starts with the keyword «REM». Following is an example.

REM This Script is written to Validate the Entered Input 
REM Modified by  : Tutorials point/user2

VBA — Message Box

The MsgBox function displays a message box and waits for the user to click a button and then an action is performed based on the button clicked by the user.

Syntax

MsgBox(prompt[,buttons][,title][,helpfile,context])

Parameter Description

  • Prompt − A Required Parameter. A String that is displayed as a message in the dialog box. The maximum length of prompt is approximately 1024 characters. If the message extends to more than a line, then the lines can be separated using a carriage return character (Chr(13)) or a linefeed character (Chr(10)) between each line.

  • Buttons − An Optional Parameter. A Numeric expression that specifies the type of buttons to display, the icon style to use, the identity of the default button, and the modality of the message box. If left blank, the default value for buttons is 0.

  • Title − An Optional Parameter. A String expression displayed in the title bar of the dialog box. If the title is left blank, the application name is placed in the title bar.

  • Helpfile − An Optional Parameter. A String expression that identifies the Help file to use for providing context-sensitive help for the dialog box.

  • Context − An Optional Parameter. A Numeric expression that identifies the Help context number assigned by the Help author to the appropriate Help topic. If context is provided, helpfile must also be provided.

The Buttons parameter can take any of the following values −

  • 0 vbOKOnly — Displays OK button only.

  • 1 vbOKCancel — Displays OK and Cancel buttons.

  • 2 vbAbortRetryIgnore — Displays Abort, Retry, and Ignore buttons.

  • 3 vbYesNoCancel — Displays Yes, No, and Cancel buttons.

  • 4 vbYesNo — Displays Yes and No buttons.

  • 5 vbRetryCancel — Displays Retry and Cancel buttons.

  • 16 vbCritical — Displays Critical Message icon.

  • 32 vbQuestion — Displays Warning Query icon.

  • 48 vbExclamation — Displays Warning Message icon.

  • 64 vbInformation — Displays Information Message icon.

  • 0 vbDefaultButton1 — First button is default.

  • 256 vbDefaultButton2 — Second button is default.

  • 512 vbDefaultButton3 — Third button is default.

  • 768 vbDefaultButton4 — Fourth button is default.

  • 0 vbApplicationModal Application modal — The current application will not work until the user responds to the message box.

  • 4096 vbSystemModal System modal — All applications will not work until the user responds to the message box.

The above values are logically divided into four groups: The first group (0 to 5) indicates the buttons to be displayed in the message box. The second group (16, 32, 48, 64) describes the style of the icon to be displayed, the third group (0, 256, 512, 768) indicates which button must be the default, and the fourth group (0, 4096) determines the modality of the message box.

Return Values

The MsgBox function can return one of the following values which can be used to identify the button the user has clicked in the message box.

  • 1 — vbOK — OK was clicked
  • 2 — vbCancel — Cancel was clicked
  • 3 — vbAbort — Abort was clicked
  • 4 — vbRetry — Retry was clicked
  • 5 — vbIgnore — Ignore was clicked
  • 6 — vbYes — Yes was clicked
  • 7 — vbNo — No was clicked

Example

Function MessageBox_Demo() 
   'Message Box with just prompt message 
   MsgBox("Welcome")     
   
   'Message Box with title, yes no and cancel Butttons  
   int a = MsgBox("Do you like blue color?",3,"Choose options") 
   ' Assume that you press No Button  
   msgbox ("The Value of a is " & a) 
End Function

Output

Step 1 − The above Function can be executed either by clicking the «Run» button on VBA Window or by calling the function from Excel Worksheet as shown in the following screenshot.

Message Box in VBA

Step 2 − A Simple Message box is displayed with a message «Welcome» and an «OK» Button

Message Box in VBA

Step 3 − After Clicking OK, yet another dialog box is displayed with a message along with «yes, no, and cancel» buttons.

Message Box in VBA

Step 4 − After clicking the ‘No’ button, the value of that button (7) is stored as an integer and displayed as a message box to the user as shown in the following screenshot. Using this value, it can be understood which button the user has clicked.

Message Box in VBA

VBA — InputBox

The InputBox function prompts the users to enter values. After entering the values, if the user clicks the OK button or presses ENTER on the keyboard, the InputBox function will return the text in the text box. If the user clicks the Cancel button, the function will return an empty string («»).

Syntax

InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])

Parameter Description

  • Prompt − A required parameter. A String that is displayed as a message in the dialog box. The maximum length of prompt is approximately 1024 characters. If the message extends to more than a line, then the lines can be separated using a carriage return character (Chr(13)) or a linefeed character (Chr(10)) between each line.

  • Title − An optional parameter. A String expression displayed in the title bar of the dialog box. If the title is left blank, the application name is placed in the title bar.

  • Default − An optional parameter. A default text in the text box that the user would like to be displayed.

  • XPos − An optional parameter. The position of X axis represents the prompt distance from the left side of the screen horizontally. If left blank, the input box is horizontally centered.

  • YPos − An optional parameter. The position of Y axis represents the prompt distance from the left side of the screen vertically. If left blank, the input box is vertically centered.

  • Helpfile − An optional parameter. A String expression that identifies the helpfile to be used to provide context-sensitive Help for the dialog box.

  • context − An optional parameter. A Numeric expression that identifies the Help context number assigned by the Help author to the appropriate Help topic. If context is provided, helpfile must also be provided.

Example

Let us calculate the area of a rectangle by getting values from the user at run time with the help of two input boxes (one for length and one for width).

Function findArea() 
   Dim Length As Double 
   Dim Width As Double 
   
   Length = InputBox("Enter Length ", "Enter a Number") 
   Width = InputBox("Enter Width", "Enter a Number") 
   findArea = Length * Width 
End Function

Output

Step 1 − To execute the same, call using the function name and press Enter as shown in the following screenshot.

Input Box Demo

Step 2 − Upon execution, the First input box (length) is displayed. Enter a value into the input box.

Input Box Demo

Step 3 − After entering the first value, the second input box (width) is displayed.

Input Box Demo

Step 4 − Upon entering the second number, click the OK button. The area is displayed as shown in the following screenshot.

Input Box Demo

VBA — Variables

Variable is a named memory location used to hold a value that can be changed during the script execution. Following are the basic rules for naming a variable.

  • You must use a letter as the first character.

  • You can’t use a space, period (.), exclamation mark (!), or the characters @, &, $, # in the name.

  • Name can’t exceed 255 characters in length.

  • You cannot use Visual Basic reserved keywords as variable name.

Syntax

In VBA, you need to declare the variables before using them.

Dim <<variable_name>> As <<variable_type>>

Data Types

There are many VBA data types, which can be divided into two main categories, namely numeric and non-numeric data types.

Numeric Data Types

Following table displays the numeric data types and the allowed range of values.

Type Range of Values
Byte 0 to 255
Integer -32,768 to 32,767
Long -2,147,483,648 to 2,147,483,648
Single

-3.402823E+38 to -1.401298E-45 for negative values

1.401298E-45 to 3.402823E+38 for positive values.

Double

-1.79769313486232e+308 to -4.94065645841247E-324 for negative values

4.94065645841247E-324 to 1.79769313486232e+308 for positive values.

Currency -922,337,203,685,477.5808 to 922,337,203,685,477.5807
Decimal

+/- 79,228,162,514,264,337,593,543,950,335 if no decimal is use

+/- 7.9228162514264337593543950335 (28 decimal places).

Non-Numeric Data Types

Following table displays the non-numeric data types and the allowed range of values.

Type Range of Values
String (fixed length) 1 to 65,400 characters
String (variable length) 0 to 2 billion characters
Date January 1, 100 to December 31, 9999
Boolean True or False
Object Any embedded object
Variant (numeric) Any value as large as double
Variant (text) Same as variable-length string

Example

Let us create a button and name it as ‘Variables_demo’ to demonstrate the use of variables.

vba_02.jpg

Private Sub say_helloworld_Click()
   Dim password As String
   password = "Admin#1"

   Dim num As Integer
   num = 1234

   Dim BirthDay As Date
   BirthDay = DateValue("30 / 10 / 2020")

   MsgBox "Passowrd is " & password & Chr(10) & "Value of num is " &
      num & Chr(10) & "Value of Birthday is " & BirthDay
End Sub

Output

Upon executing the script, the output will be as shown in the following screenshot.

vba_03.jpg

VBA — Constants

Constant is a named memory location used to hold a value that CANNOT be changed during the script execution. If a user tries to change a Constant value, the script execution ends up with an error. Constants are declared the same way the variables are declared.

Following are the rules for naming a constant.

  • You must use a letter as the first character.

  • You can’t use a space, period (.), exclamation mark (!), or the characters @, &, $, # in the name.

  • Name can’t exceed 255 characters in length.

  • You cannot use Visual Basic reserved keywords as variable name.

Syntax

In VBA, we need to assign a value to the declared Constants. An error is thrown, if we try to change the value of the constant.

Const <<constant_name>> As <<constant_type>> = <<constant_value>>

Example

Let us create a button «Constant_demo» to demonstrate how to work with constants.

Private Sub Constant_demo_Click() 
   Const MyInteger As Integer = 42 
   Const myDate As Date = #2/2/2020# 
   Const myDay As String = "Sunday" 
   
   MsgBox "Integer is " & MyInteger & Chr(10) & "myDate is " 
      & myDate & Chr(10) & "myDay is " & myDay  
End Sub

Output

Upon executing the script, the output will be displayed as shown in the following screenshot.

vba_05.jpg

VBA — Operators

An Operator can be defined using a simple expression — 4 + 5 is equal to 9. Here, 4 and 5 are called operands and + is called operator. VBA supports following types of operators −

  • Arithmetic Operators
  • Comparison Operators
  • Logical (or Relational) Operators
  • Concatenation Operators

The Arithmatic Operators

Following arithmetic operators are supported by VBA.

Assume variable A holds 5 and variable B holds 10, then −

Show Examples

Operator Description Example
+ Adds the two operands A + B will give 15
Subtracts the second operand from the first A — B will give -5
* Multiplies both the operands A * B will give 50
/ Divides the numerator by the denominator B / A will give 2
% Modulus operator and the remainder after an integer division B % A will give 0
^ Exponentiation operator B ^ A will give 100000

The Comparison Operators

There are following comparison operators supported by VBA.

Assume variable A holds 10 and variable B holds 20, then −

Show Examples

Operator Description Example
= Checks if the value of the two operands are equal or not. If yes, then the condition is true. (A = B) is False.
<> Checks if the value of the two operands are equal or not. If the values are not equal, then the condition is true. (A <> B) is True.
> Checks if the value of the left operand is greater than the value of the right operand. If yes, then the condition is true. (A > B) is False.
< Checks if the value of the left operand is less than the value of the right operand. If yes, then the condition is true. (A < B) is True.
>= Checks if the value of the left operand is greater than or equal to the value of the right operand. If yes, then the condition is true. (A >= B) is False.
<= Checks if the value of the left operand is less than or equal to the value of the right operand. If yes, then the condition is true. (A <= B) is True.

The Logical Operators

Following logical operators are supported by VBA.

Assume variable A holds 10 and variable B holds 0, then −

Show Examples

Operator Description Example
AND Called Logical AND operator. If both the conditions are True, then the Expression is true. a<>0 AND b<>0 is False.
OR Called Logical OR Operator. If any of the two conditions are True, then the condition is true. a<>0 OR b<>0 is true.
NOT Called Logical NOT Operator. Used to reverse the logical state of its operand. If a condition is true, then Logical NOT operator will make false. NOT(a<>0 OR b<>0) is false.
XOR Called Logical Exclusion. It is the combination of NOT and OR Operator. If one, and only one, of the expressions evaluates to be True, the result is True. (a<>0 XOR b<>0) is true.

The Concatenation Operators

Following Concatenation operators are supported by VBA.

Assume variable A holds 5 and variable B holds 10 then −

Show Examples

Operator Description Example
+ Adds two Values as Variable. Values are Numeric A + B will give 15
& Concatenates two Values A & B will give 510

Assume variable A = «Microsoft» and variable B = «VBScript», then −

Operator Description Example
+ Concatenates two Values A + B will give MicrosoftVBScript
& Concatenates two Values A & B will give MicrosoftVBScript

Note − Concatenation Operators can be used for both numbers and strings. The output depends on the context, if the variables hold numeric value or string value.

VBA — Decisions

Decision making allows the programmers to control the execution flow of a script or one of its sections. The execution is governed by one or more conditional statements.

Following is the general form of a typical decision making structure found in most of the programming languages.

Decision making statements in VBA

VBA provides the following types of decision making statements. Click the following links to check their details.

Sr.No. Statement & Description
1 if statement

An if statement consists of a Boolean expression followed by one or more statements.

2 if..else statement

An if else statement consists of a Boolean expression followed by one or more statements. If the condition is True, the statements under If statements are executed. If the condition is false, the Else part of the script is executed.

3 if…elseif..else statement

An if statement followed by one or more ElseIf statements, that consists of Boolean expressions and then followed by an optional else statement, which executes when all the condition become false.

4 nested if statements

An if or elseif statement inside another if or elseif statement(s).

5 switch statement

A switch statement allows a variable to be tested for equality against a list of values.

VBA — Loops

There may be a situation when you need to execute a block of code several number of times. In general, statements are executed sequentially: The first statement in a function is executed first, followed by the second, and so on.

Programming languages provide various control structures that allow for more complicated execution paths.

A loop statement allows us to execute a statement or group of statements multiple times. Following is the general form of a loop statement in VBA.

Loop Architecture

VBA provides the following types of loops to handle looping requirements. Click the following links to check their detail.

Sr.No. Loop Type & Description
1 for loop

Executes a sequence of statements multiple times and abbreviates the code that manages the loop variable.

2 for ..each loop

This is executed if there is at least one element in the group and reiterated for each element in a group.

3 while..wend loop

This tests the condition before executing the loop body.

4 do..while loops

The do..While statements will be executed as long as the condition is True.(i.e.,) The Loop should be repeated till the condition is False.

5 do..until loops

The do..Until statements will be executed as long as the condition is False.(i.e.,) The Loop should be repeated till the condition is True.

Loop Control Statements

Loop control statements change execution from its normal sequence. When execution leaves a scope, all the remaining statements in the loop are NOT executed.

VBA supports the following control statements. Click the following links to check their detail.

S.No. Control Statement & Description
1 Exit For statement

Terminates the For loop statement and transfers the execution to the statement immediately following the loop

2 Exit Do statement

Terminates the Do While statement and transfers the execution to the statement immediately following the loop

VBA — Strings

Strings are a sequence of characters, which can consist of either alphabets, numbers, special characters, or all of them. A variable is said to be a string if it is enclosed within double quotes » «.

Syntax

variablename = "string"

Examples

str1 = "string"   ' Only Alphabets
str2 = "132.45"   ' Only Numbers
str3 = "!@#$;*"  ' Only Special Characters
Str4 = "Asc23@#"  ' Has all the above

String Functions

There are predefined VBA String functions, which help the developers to work with the strings very effectively. Following are String methods that are supported in VBA. Please click on each one of the methods to know in detail.

Sr.No. Function Name & Description
1 InStr

Returns the first occurrence of the specified substring. Search happens from the left to the right.

2 InstrRev

Returns the first occurrence of the specified substring. Search happens from the right to the left.

3 Lcase

Returns the lower case of the specified string.

4 Ucase

Returns the upper case of the specified string.

5 Left

Returns a specific number of characters from the left side of the string.

6 Right

Returns a specific number of characters from the right side of the string.

7 Mid

Returns a specific number of characters from a string based on the specified parameters.

8 Ltrim

Returns a string after removing the spaces on the left side of the specified string.

9 Rtrim

Returns a string after removing the spaces on the right side of the specified string.

10 Trim

Returns a string value after removing both the leading and the trailing blank spaces.

11 Len

Returns the length of the given string.

12 Replace

Returns a string after replacing a string with another string.

13 Space

Fills a string with the specified number of spaces.

14 StrComp

Returns an integer value after comparing the two specified strings.

15 String

Returns a string with a specified character for specified number of times.

16 StrReverse

Returns a string after reversing the sequence of the characters of the given string.

VBA — Date-Time Function

VBScript Date and Time Functions help the developers to convert date and time from one format to another or to express the date or time value in the format that suits a specific condition.

Date Functions

Sr.No. Function & Description
1 Date

A Function, which returns the current system date.

2 CDate

A Function, which converts a given input to date.

3 DateAdd

A Function, which returns a date to which a specified time interval has been added.

4 DateDiff

A Function, which returns the difference between two time period.

5 DatePart

A Function, which returns a specified part of the given input date value.

6 DateSerial

A Function, which returns a valid date for the given year, month, and date.

7 FormatDateTime

A Function, which formats the date based on the supplied parameters.

8 IsDate

A Function, which returns a Boolean Value whether or not the supplied parameter is a date.

9 Day

A Function, which returns an integer between 1 and 31 that represents the day of the specified date.

10 Month

A Function, which returns an integer between 1 and 12 that represents the month of the specified date.

11 Year

A Function, which returns an integer that represents the year of the specified date.

12 MonthName

A Function, which returns the name of the particular month for the specified date.

13 WeekDay

A Function, which returns an integer(1 to 7) that represents the day of the week for the specified day.

14 WeekDayName

A Function, which returns the weekday name for the specified day.

Time Functions

Sr.No. Function & Description
1 Now

A Function, which returns the current system date and time.

2 Hour

A Function, which returns an integer between 0 and 23 that represents the hour part of the given time.

3 Minute

A Function, which returns an integer between 0 and 59 that represents the minutes part of the given time.

4 Second

A Function, which returns an integer between 0 and 59 that represents the seconds part of the given time.

5 Time

A Function, which returns the current system time.

6 Timer

A Function, which returns the number of seconds and milliseconds since 12:00 AM.

7 TimeSerial

A Function, which returns the time for the specific input of hour, minute and second.

8 TimeValue

A Function, which converts the input string to a time format.

VBA — Arrays

We know very well that a variable is a container to store a value. Sometimes, developers are in a position to hold more than one value in a single variable at a time. When a series of values are stored in a single variable, then it is known as an array variable.

Array Declaration

Arrays are declared the same way a variable has been declared except that the declaration of an array variable uses parenthesis. In the following example, the size of the array is mentioned in the brackets.

'Method 1 : Using Dim
Dim arr1()	'Without Size

'Method 2 : Mentioning the Size
Dim arr2(5)  'Declared with size of 5

'Method 3 : using 'Array' Parameter
Dim arr3
arr3 = Array("apple","Orange","Grapes")
  • Although, the array size is indicated as 5, it can hold 6 values as array index starts from ZERO.

  • Array Index cannot be negative.

  • VBScript Arrays can store any type of variable in an array. Hence, an array can store an integer, string, or characters in a single array variable.

Assigning Values to an Array

The values are assigned to the array by specifying an array index value against each one of the values to be assigned. It can be a string.

Example

Add a button and add the following function.

Private Sub Constant_demo_Click()
   Dim arr(5)
   arr(0) = "1"           'Number as String
   arr(1) = "VBScript"    'String
   arr(2) = 100 		     'Number
   arr(3) = 2.45 		     'Decimal Number
   arr(4) = #10/07/2013#  'Date
   arr(5) = #12.45 PM#    'Time
  
   msgbox("Value stored in Array index 0 : " & arr(0))
   msgbox("Value stored in Array index 1 : " & arr(1))
   msgbox("Value stored in Array index 2 : " & arr(2))
   msgbox("Value stored in Array index 3 : " & arr(3))
   msgbox("Value stored in Array index 4 : " & arr(4))
   msgbox("Value stored in Array index 5 : " & arr(5))
End Sub

When you execute the above function, it produces the following output.

Value stored in Array index 0 : 1
Value stored in Array index 1 : VBScript
Value stored in Array index 2 : 100
Value stored in Array index 3 : 2.45
Value stored in Array index 4 : 7/10/2013
Value stored in Array index 5 : 12:45:00 PM

Multi-Dimensional Arrays

Arrays are not just limited to a single dimension, however, they can have a maximum of 60 dimensions. Two-dimensional arrays are the most commonly used ones.

Example

In the following example, a multi-dimensional array is declared with 3 rows and 4 columns.

Private Sub Constant_demo_Click()
   Dim arr(2,3) as Variant	' Which has 3 rows and 4 columns
   arr(0,0) = "Apple" 
   arr(0,1) = "Orange"
   arr(0,2) = "Grapes"           
   arr(0,3) = "pineapple" 
   arr(1,0) = "cucumber"           
   arr(1,1) = "beans"           
   arr(1,2) = "carrot"           
   arr(1,3) = "tomato"           
   arr(2,0) = "potato"             
   arr(2,1) = "sandwitch"            
   arr(2,2) = "coffee"             
   arr(2,3) = "nuts"            
           
   msgbox("Value in Array index 0,1 : " &  arr(0,1))
   msgbox("Value in Array index 2,2 : " &  arr(2,2))
End Sub

When you execute the above function, it produces the following output.

Value stored in Array index : 0 , 1 : Orange
Value stored in Array index : 2 , 2 : coffee

ReDim Statement

ReDim statement is used to declare dynamic-array variables and allocate or reallocate storage space.

Syntax

ReDim [Preserve] varname(subscripts) [, varname(subscripts)]

Parameter Description

  • Preserve − An optional parameter used to preserve the data in an existing array when you change the size of the last dimension.

  • Varname − A required parameter, which denotes the name of the variable, which should follow the standard variable naming conventions.

  • Subscripts − A required parameter, which indicates the size of the array.

Example

In the following example, an array has been redefined and then the values preserved when the existing size of the array is changed.

Note − Upon resizing an array smaller than it was originally, the data in the eliminated elements will be lost.

Private Sub Constant_demo_Click()
   Dim a() as variant
   i = 0
   redim a(5)
   a(0) = "XYZ"
   a(1) = 41.25
   a(2) = 22
  
   REDIM PRESERVE a(7)
   For i = 3 to 7
   a(i) = i
   Next
  
   'to Fetch the output
   For i = 0 to ubound(a)
      Msgbox a(i)
   Next
End Sub

When you execute the above function, it produces the following output.

XYZ
41.25
22
3
4
5
6
7

Array Methods

There are various inbuilt functions within VBScript which help the developers to handle arrays effectively. All the methods that are used in conjunction with arrays are listed below. Please click on the method name to know about it in detail.

Sr.No. Function & Description
1 LBound

A Function, which returns an integer that corresponds to the smallest subscript of the given arrays.

2 UBound

A Function, which returns an integer that corresponds to the largest subscript of the given arrays.

3 Split

A Function, which returns an array that contains a specified number of values. Split based on a delimiter.

4 Join

A Function, which returns a string that contains a specified number of substrings in an array. This is an exact opposite function of Split Method.

5 Filter

A Function, which returns a zero based array that contains a subset of a string array based on a specific filter criteria.

6 IsArray

A Function, which returns a boolean value that indicates whether or not the input variable is an array.

7 Erase

A Function, which recovers the allocated memory for the array variables.

VBA — User Defined Functions

A function is a group of reusable code which can be called anywhere in your program. This eliminates the need of writing the same code over and over again. This enables the programmers to divide a big program into a number of small and manageable functions.

Apart from inbuilt functions, VBA allows to write user-defined functions as well. In this chapter, you will learn how to write your own functions in VBA.

Function Definition

A VBA function can have an optional return statement. This is required if you want to return a value from a function.

For example, you can pass two numbers in a function and then you can expect from the function to return their multiplication in your calling program.

Note − A function can return multiple values separated by a comma as an array assigned to the function name itself.

Before we use a function, we need to define that particular function. The most common way to define a function in VBA is by using the Function keyword, followed by a unique function name and it may or may not carry a list of parameters and a statement with End Function keyword, which indicates the end of the function. Following is the basic syntax.

Syntax

Add a button and add the following function.

Function Functionname(parameter-list)
   statement 1
   statement 2
   statement 3
   .......
   statement n
End Function

Example

Add the following function which returns the area. Note that a value/values can be returned with the function name itself.

Function findArea(Length As Double, Optional Width As Variant)
   If IsMissing(Width) Then
      findArea = Length * Length
   Else
      findArea = Length * Width
   End If
End Function

Calling a Function

To invoke a function, call the function using the function name as shown in the following screenshot.

Decision making statements in VBA

The output of the area as shown below will be displayed to the user.

Decision making statements in VBA

VBA — Sub Procedure

Sub Procedures are similar to functions, however there are a few differences.

  • Sub procedures DO NOT Return a value while functions may or may not return a value.

  • Sub procedures CAN be called without a call keyword.

  • Sub procedures are always enclosed within Sub and End Sub statements.

Example

Sub Area(x As Double, y As Double)
   MsgBox x * y
End Sub

Calling Procedures

To invoke a Procedure somewhere in the script, you can make a call from a function. We will not be able to use the same way as that of a function as sub procedure WILL NOT return a value.

Function findArea(Length As Double, Width As Variant)
   area Length, Width    ' To Calculate Area 'area' sub proc is called
End Function

Now you will be able to call the function only but not the sub procedure as shown in the following screenshot.

Sub Procedure in VBA

The area is calculated and shown only in the Message box.

Calculate Area Sub 2 in VBA

The result cell displays ZERO as the area value is NOT returned from the function. In short, you cannot make a direct call to a sub procedure from the excel worksheet.

Calculate Area Sub 3 in VBA

VBA — Events

VBA, an event-driven programming can be triggered when you change a cell or range of cell values manually. Change event may make things easier, but you can very quickly end a page full of formatting. There are two kinds of events.

  • Worksheet Events
  • Workbook Events

Worksheet Events

Worksheet Events are triggered when there is a change in the worksheet. It is created by performing a right-click on the sheet tab and choosing ‘view code’, and later pasting the code.

The user can select each one of those worksheets and choose «WorkSheet» from the drop down to get the list of all supported Worksheet events.

Input Box Demo

Following are the supported worksheet events that can be added by the user.

Private Sub Worksheet_Activate() 
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)    
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 
Private Sub Worksheet_Calculate() 
Private Sub Worksheet_Change(ByVal Target As Range) 
Private Sub Worksheet_Deactivate() 
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Example

Let us say, we just need to display a message before double click.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   MsgBox "Before Double Click"
End Sub

Output

Upon double-clicking on any cell, the message box is displayed to the user as shown in the following screenshot.

Input Box Demo

Workbook Events

Workbook events are triggered when there is a change in the workbook on the whole. We can add the code for workbook events by selecting the ‘ThisWorkbook’ and selecting ‘workbook’ from the dropdown as shown in the following screenshot. Immediately Workbook_open sub procedure is displayed to the user as seen in the following screenshot.

Input Box Demo

Following are the supported Workbook events that can be added by the user.

Private Sub Workbook_AddinUninstall() 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Private Sub Workbook_BeforePrint(Cancel As Boolean) 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Private Sub Workbook_Deactivate() 
Private Sub Workbook_NewSheet(ByVal Sh As Object) 
Private Sub Workbook_Open() 
Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 
Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 
Private Sub Workbook_WindowActivate(ByVal Wn As Window) 
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) 
Private Sub Workbook_WindowResize(ByVal Wn As Window)

Example

Let us say, we just need to display a message to the user that a new sheet is created successfully, whenever a new sheet is created.

Private Sub Workbook_NewSheet(ByVal Sh As Object)
   MsgBox "New Sheet Created Successfully"
End Sub

Output

Upon creating a new excel sheet, a message is displayed to the user as shown in the following screenshot.

Input Box Demo

VBA — Error Handling

There are three types of errors in programming: (a) Syntax Errors, (b) Runtime Errors, and (c) Logical Errors.

Syntax errors

Syntax errors, also called as parsing errors, occur at the interpretation time for VBScript. For example, the following line causes a syntax error because it is missing a closing parenthesis.

Function ErrorHanlding_Demo()
   dim x,y
   x = "Tutorialspoint"
   y = Ucase(x
End Function

Runtime errors

Runtime errors, also called exceptions, occur during execution, after interpretation.

For example, the following line causes a runtime error because here the syntax is correct but at runtime it is trying to call fnmultiply, which is a non-existing function.

Function ErrorHanlding_Demo1()
   Dim x,y
   x = 10
   y = 20
   z = fnadd(x,y)
   a = fnmultiply(x,y)
End Function

Function fnadd(x,y)
   fnadd = x + y
End Function

Logical Errors

Logical errors can be the most difficult type of errors to track down. These errors are not the result of a syntax or runtime error. Instead, they occur when you make a mistake in the logic that drives your script and you do not get the result you expected.

You cannot catch those errors, because it depends on your business requirement what type of logic you want to put in your program.

For example, dividing a number by zero or a script that is written which enters into infinite loop.

Err Object

Assume if we have a runtime error, then the execution stops by displaying the error message. As a developer, if we want to capture the error, then Error Object is used.

Example

In the following example, Err.Number gives the error number and Err.Description gives the error description.

Err.Raise 6   ' Raise an overflow error.
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear   ' Clear the error.

Error Handling

VBA enables an error-handling routine and can also be used to disable an error-handling routine. Without an On Error statement, any run-time error that occurs is fatal: an error message is displayed, and the execution stops abruptly.

On Error { GoTo [ line | 0 | -1 ] | Resume Next }
Sr.No. Keyword & Description
1

GoTo line

Enables the error-handling routine that starts at the line specified in the required line argument. The specified line must be in the same procedure as the On Error statement, or a compile-time error will occur.

2

GoTo 0

Disables the enabled error handler in the current procedure and resets it to Nothing.

3

GoTo -1

Disables the enabled exception in the current procedure and resets it to Nothing.

4

Resume Next

Specifies that when a run-time error occurs, the control goes to the statement immediately following the statement where the error occurred, and the execution continues from that point.

Example

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x, y, z As Integer
   x = 50
   y = 0
   z = x / y   ' Divide by ZERO Error Raises
  
   ErrorHandler:    ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 10   ' Divide by zero error
         MsgBox ("You attempted to divide by zero!")
      Case Else
         MsgBox "UNKNOWN ERROR  - Error# " & Err.Number & " : " & Err.Description
   End Select
   Resume Next
End Sub

VBA — Excel Objects

When programming using VBA, there are few important objects that a user would be dealing with.

  • Application Objects
  • Workbook Objects
  • Worksheet Objects
  • Range Objects

Application Objects

The Application object consists of the following −

  • Application-wide settings and options.
  • Methods that return top-level objects, such as ActiveCell, ActiveSheet, and so on.

Example

'Example 1 :
Set xlapp = CreateObject("Excel.Sheet") 
xlapp.Application.Workbooks.Open "C:test.xls"

'Example 2 :
Application.Windows("test.xls").Activate

'Example 3:
Application.ActiveCell.Font.Bold = True

Workbook Objects

The Workbook object is a member of the Workbooks collection and contains all the Workbook objects currently open in Microsoft Excel.

Example

'Ex 1 : To close Workbooks
Workbooks.Close

'Ex 2 : To Add an Empty Work Book
Workbooks.Add

'Ex 3: To Open a Workbook
Workbooks.Open FileName:="Test.xls", ReadOnly:=True

'Ex : 4 - To Activate WorkBooks
Workbooks("Test.xls").Worksheets("Sheet1").Activate

Worksheet Objects

The Worksheet object is a member of the Worksheets collection and contains all the Worksheet objects in a workbook.

Example

'Ex 1 : To make it Invisible
Worksheets(1).Visible = False

'Ex 2 : To protect an WorkSheet
Worksheets("Sheet1").Protect password:=strPassword, scenarios:=True

Range Objects

Range Objects represent a cell, a row, a column, or a selection of cells containing one or more continuous blocks of cells.

'Ex 1 : To Put a value in the cell A5
Worksheets("Sheet1").Range("A5").Value = "5235"

'Ex 2 : To put a value in range of Cells
Worksheets("Sheet1").Range("A1:A4").Value = 5

VBA — Text Files

You can also read Excel File and write the contents of the cell into a Text File using VBA. VBA allows the users to work with text files using two methods −

  • File System Object
  • using Write Command

File System Object (FSO)

As the name suggests, FSOs help the developers to work with drives, folders, and files. In this section, we will discuss how to use a FSO.

Sr.No. Object Type & Description
1

Drive

Drive is an Object. Contains methods and properties that allow you to gather information about a drive attached to the system.

2

Drives

Drives is a Collection. It provides a list of the drives attached to the system, either physically or logically.

3

File

File is an Object. It contains methods and properties that allow developers to create, delete, or move a file.

4

Files

Files is a Collection. It provides a list of all the files contained within a folder.

5

Folder

Folder is an Object. It provides methods and properties that allow the developers to create, delete, or move folders.

6

Folders

Folders is a Collection. It provides a list of all the folders within a folder.

7

TextStream

TextStream is an Object. It enables the developers to read and write text files.

Drive

Drive is an object, which provides access to the properties of a particular disk drive or network share. Following properties are supported by Drive object −

  • AvailableSpace
  • DriveLetter
  • DriveType
  • FileSystem
  • FreeSpace
  • IsReady
  • Path
  • RootFolder
  • SerialNumber
  • ShareName
  • TotalSize
  • VolumeName

Example

Step 1 − Before proceeding to scripting using FSO, we should enable Microsoft Scripting Runtime. To do the same, navigate to Tools → References as shown in the following screenshot.

Excel FSO in VBScript

Step 2 − Add «Microsoft Scripting RunTime» and Click OK.

Excel FSO in VBScript

Step 3 − Add Data that you would like to write in a Text File and add a Command Button.

Excel FSO in VBScript

Step 4 − Now it is time to Script.

Private Sub fn_write_to_text_Click()
   Dim FilePath As String
   Dim CellData As String
   Dim LastCol As Long
   Dim LastRow As Long
  
   Dim fso As FileSystemObject
   Set fso = New FileSystemObject
   Dim stream As TextStream
  
   LastCol = ActiveSheet.UsedRange.Columns.Count
   LastRow = ActiveSheet.UsedRange.Rows.Count
    
   ' Create a TextStream.
   Set stream = fso.OpenTextFile("D:TrySupport.log", ForWriting, True)
  
   CellData = ""
  
   For i = 1 To LastRow
      For j = 1 To LastCol
         CellData = Trim(ActiveCell(i, j).Value)
         stream.WriteLine "The Value at location (" & i & "," & j & ")" & CellData
      Next j
   Next i
  
   stream.Close
   MsgBox ("Job Done")
End Sub

Output

When executing the script, ensure that you place the cursor in the first cell of the worksheet. The Support.log file is created as shown in the following screenshot under «D:Try».

Excel FSO in VBScript

The Contents of the file are shown in the following screenshot.

Excel FSO in VBScript

Write Command

Unlike FSO, we need NOT add any references, however, we will NOT be able to work with drives, files and folders. We will be able to just add the stream to the text file.

Example

Private Sub fn_write_to_text_Click()
   Dim FilePath As String
   Dim CellData As String
   Dim LastCol As Long
   Dim LastRow As Long
  
   LastCol = ActiveSheet.UsedRange.Columns.Count
   LastRow = ActiveSheet.UsedRange.Rows.Count
    
   FilePath = "D:Trywrite.txt"
   Open FilePath For Output As #2
  
   CellData = ""
   For i = 1 To LastRow
      For j = 1 To LastCol
         CellData = "The Value at location (" & i & "," & j & ")" & Trim(ActiveCell(i, j).Value)
         Write #2, CellData
      Next j
   Next i
  
   Close #2
   MsgBox ("Job Done")
End Sub

Output

Upon executing the script, the «write.txt» file is created in the location «D:Try» as shown in the following screenshot.

Excel FSO in VBScript

The contents of the file are shown in the following screenshot.

Excel FSO in VBScript

VBA — Programming Charts

Using VBA, you can generate charts based on certain criteria. Let us take a look at it using an example.

Step 1 − Enter the data against which the graph has to be generated.

Graph in VBA

Step 2 − Create 3 buttons — one to generate a bar graph, another to generate a pie chart, and another to generate a column chart.

Graph in VBA

Step 3 − Develop a Macro to generate each one of these type of charts.

' Procedure to Generate Pie Chart
Private Sub fn_generate_pie_graph_Click()
   Dim cht As ChartObject
   For Each cht In Worksheets(1).ChartObjects
      cht.Chart.Type = xlPie
   Next cht
End Sub

' Procedure to Generate Bar Graph
Private Sub fn_Generate_Bar_Graph_Click()
   Dim cht As ChartObject
   For Each cht In Worksheets(1).ChartObjects
      cht.Chart.Type = xlBar
   Next cht
End Sub

' Procedure to Generate Column Graph
Private Sub fn_generate_column_graph_Click()
   Dim cht As ChartObject
   For Each cht In Worksheets(1).ChartObjects
      cht.Chart.Type = xlColumn
   Next cht
End Sub

Step 4 − Upon clicking the corresponding button, the chart is created. In the following output, click on generate Pie Chart button.

Graph in VBA

VBA — User Forms

A User Form is a custom-built dialog box that makes a user data entry more controllable and easier to use for the user. In this chapter, you will learn to design a simple form and add data into excel.

Step 1 − Navigate to VBA Window by pressing Alt+F11 and Navigate to «Insert» Menu and select «User Form». Upon selecting, the user form is displayed as shown in the following screenshot.

Decision making statements in VBScript

Step 2 − Design the forms using the given controls.

Decision making statements in VBScript

Step 3 − After adding each control, the controls have to be named. Caption corresponds to what appears on the form and name corresponds to the logical name that will be appearing when you write VBA code for that element.

Decision making statements in VBScript

Step 4 − Following are the names against each one of the added controls.

Control Logical Name Caption
From frmempform Employee Form
Employee ID Label Box empid Employee ID
firstname Label Box firstname First Name
lastname Label Box lastname Last Name
dob Label Box dob Date of Birth
mailid Label Box mailid Email ID
Passportholder Label Box Passportholder Passport Holder
Emp ID Text Box txtempid NOT Applicable
First Name Text Box txtfirstname NOT Applicable
Last Name Text Box txtlastname NOT Applicable
Email ID Text Box txtemailid NOT Applicable
Date Combo Box cmbdate NOT Applicable
Month Combo Box cmbmonth NOT Applicable
Year Combo Box cmbyear NOT Applicable
Yes Radio Button radioyes Yes
No Radio Button radiono No
Submit Button btnsubmit Submit
Cancel Button btncancel Cancel

Step 5 − Add the code for the form load event by performing a right-click on the form and selecting ‘View Code’.

Decision making statements in VBScript

Step 6 − Select ‘Userform’ from the objects drop-down and select ‘Initialize’ method as shown in the following screenshot.

Decision making statements in VBScript

Step 7 − Upon Loading the form, ensure that the text boxes are cleared, drop-down boxes are filled and Radio buttons are reset.

Private Sub UserForm_Initialize()
   'Empty Emp ID Text box and Set the Cursor 
   txtempid.Value = ""
   txtempid.SetFocus
   
   'Empty all other text box fields
   txtfirstname.Value = ""
   txtlastname.Value = ""
   txtemailid.Value = ""
   
   'Clear All Date of Birth Related Fields
   cmbdate.Clear
   cmbmonth.Clear
   cmbyear.Clear
   
   'Fill Date Drop Down box - Takes 1 to 31
   With cmbdate
      .AddItem "1"
      .AddItem "2"
      .AddItem "3"
      .AddItem "4"
      .AddItem "5"
      .AddItem "6"
      .AddItem "7"
      .AddItem "8"
      .AddItem "9"
      .AddItem "10"
      .AddItem "11"
      .AddItem "12"
      .AddItem "13"
      .AddItem "14"
      .AddItem "15"
      .AddItem "16"
      .AddItem "17"
      .AddItem "18"
      .AddItem "19"
      .AddItem "20"
      .AddItem "21"
      .AddItem "22"
      .AddItem "23"
      .AddItem "24"
      .AddItem "25"
      .AddItem "26"
      .AddItem "27"
      .AddItem "28"
      .AddItem "29"
      .AddItem "30"
      .AddItem "31"
   End With
   
   'Fill Month Drop Down box - Takes Jan to Dec
   With cmbmonth
      .AddItem "JAN"
      .AddItem "FEB"
      .AddItem "MAR"
      .AddItem "APR"
      .AddItem "MAY"
      .AddItem "JUN"
      .AddItem "JUL"
      .AddItem "AUG"
      .AddItem "SEP"
      .AddItem "OCT"
      .AddItem "NOV"
      .AddItem "DEC"
   End With
   
   'Fill Year Drop Down box - Takes 1980 to 2014
   With cmbyear
      .AddItem "1980"
      .AddItem "1981"
      .AddItem "1982"
      .AddItem "1983"
      .AddItem "1984"
      .AddItem "1985"
      .AddItem "1986"
      .AddItem "1987"
      .AddItem "1988"
      .AddItem "1989"
      .AddItem "1990"
      .AddItem "1991"
      .AddItem "1992"
      .AddItem "1993"
      .AddItem "1994"
      .AddItem "1995"
      .AddItem "1996"
      .AddItem "1997"
      .AddItem "1998"
      .AddItem "1999"
      .AddItem "2000"
      .AddItem "2001"
      .AddItem "2002"
      .AddItem "2003"
      .AddItem "2004"
      .AddItem "2005"
      .AddItem "2006"
      .AddItem "2007"
      .AddItem "2008"
      .AddItem "2009"
      .AddItem "2010"
      .AddItem "2011"
      .AddItem "2012"
      .AddItem "2013"
      .AddItem "2014"
   End With
   
   'Reset Radio Button. Set it to False when form loads.
   radioyes.Value = False
   radiono.Value = False

End Sub

Step 8 − Now add the code to the Submit button. Upon clicking the submit button, the user should be able to add the values into the worksheet.

Private Sub btnsubmit_Click()
   Dim emptyRow As Long
  
   'Make Sheet1 active
   Sheet1.Activate
  
   'Determine emptyRow
   emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1
  
   'Transfer information
   Cells(emptyRow, 1).Value = txtempid.Value
   Cells(emptyRow, 2).Value = txtfirstname.Value
   Cells(emptyRow, 3).Value = txtlastname.Value
   Cells(emptyRow, 4).Value = cmbdate.Value & "/" & cmbmonth.Value & "/" & cmbyear.Value
   Cells(emptyRow, 5).Value = txtemailid.Value
  
   If radioyes.Value = True Then
      Cells(emptyRow, 6).Value = "Yes"
   Else
      Cells(emptyRow, 6).Value = "No"
   End If
End Sub

Step 9 − Add a method to close the form when the user clicks the Cancel button.

Private Sub btncancel_Click()
   Unload Me
End Sub

Step 10 − Execute the form by clicking the «Run» button. Enter the values into the form and click the ‘Submit’ button. Automatically the values will flow into the worksheet as shown in the following screenshot.

Decision making statements in VBScript

Глава 1

Краткое руководство по VBA

Цель данной главы — ознакомить читателя с основами программирования на языке Visual Basic for Applications (VBA), который встроен в пакет Microsoft Office.

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

Знакомство с VBA

VBA — это язык программирования, поддерживаемый большинством приложений пакета Microsoft Office. Для запуска среды программирования VBA можно использовать сочетание клавиш Alt+F11.

Возможности VBA

Благодаря высокой степени интеграции в приложения язык VBA позволяет программисту легко применять существующие возможности Microsoft Office для решения специфических задач. Не менее легко VBA позволяет добавлять в приложения этого пакета новые возможности, увеличивая функциональность приложений и удобство работы с ними.

Применительно к Excel программирование на VBA позволяет реализовывать следующие возможности (естественно, это далеко не полный список):

• добавление функций для специфических расчетов;

• ускорение ввода данных в таблицу;

• автоматизацию типичных, часто выполняемых пользователем действий;

• создание команд меню, панелей инструментов как на основе уже имеющихся, так и выполняющих совершенно новые действия;

• повышение наглядности данных (например, с помощью различной окраски ячеек);

• автоматизацию обработки больших объемов данных;

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

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

Структура проекта VBA

Внешний вид редактора VBА с открытым проектом представлен на рис. 1.1.

Рис. 1.1. Проект VBA

В редакторе открыты три окна: слева вверху — окно структуры проекта (Project), слева внизу — окно свойств (Properties) и справа — окно с текстом программы модуля. С помощью окна Project (Проект) можно просматривать структуру проекта, добавлять и удалять элементы проекта, открывать для редактирования содержимое модуля (двойным щелчком на значке соответствующего модуля). Окно Properties (Свойства) используется для задания свойств выделенных элементов проекта.

VBA-проект в Microsoft Excel может содержать следующие элементы:

• модули (стандартные модули VBA);

• модули класса;

• модули рабочей книги;

• модули рабочих листов;

• модули диаграмм;

• формы.

Стандартный модуль VBA

Стандартный модуль VBA — это элемент проекта, который содержит программный код, непосредственно используемый остальными элементами проекта (глобальные функции, переменные, константы и т. д.). В окне структуры проекта стандартные модули группируются в папку Modules.

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

Модуль класса

Модуль класса — это модуль, в котором записывается программный код, реализующий работу пользовательских (созданных программистом) классов. В окне структуры проекта такие модули группируются в папку Class Modules.

Модуль рабочей книги

Модуль рабочей книги (ЭтаКнига в папке Microsoft Excel Objects) — это модуль класса, в котором реализуются дополнительные возможности по манипулированию рабочей книгой. Программы, записанные в этом модуле, могут напрямую обращаться к свойствам и методам объекта рабочей книги (см. описание модулей класса в конце главы). Отличием модуля рабочей книги от обычного модуля класса является то, что из программы на VBA нельзя создать экземпляр объекта рабочей книги — он создается автоматически.

Модуль рабочего листа

Модуль рабочего листа (папка Microsoft Excel Objects) — это модуль класса, в котором реализуются дополнительные возможности по манипулированию определенными рабочими листами книги. Программы, записанные в этом модуле, могут напрямую обращаться к свойствам и методам объекта рабочего листа. Из программы на VBA также нельзя создать экземпляр объекта конкретного рабочего листа — можно создать только новый рабочий лист с пустым модулем.

Модуль диаграммы

Модуль диаграммы (папка Microsoft Excel Objects) — это модуль класса, в котором реализуются дополнительные возможности по манипулированию диаграммами, вынесенными на отдельные листы рабочей книги. Особенности модуля диаграммы аналогичны особенностям модуля рабочего листа.

Форма

Форма (папка Forms) — это элемент проекта VBA, с помощью которого можно создавать диалоговые окна для взаимодействия с пользователем. Форма состоит из двух частей: модуля формы и собственно формы (диалогового окна).

Модуль формы — это модуль класса, в котором реализуется поведение формы. Использование этого модуля аналогично использованию обычного модуля класса. Для открытия модуля формы служит пункт View Code (Просмотр кода) контекстного меню, которое вызывается щелчком правой кнопки мыши на значке формы в окне Project (Проект).

Для задания внешнего вида диалогового окна используется редактор форм, который открывается с помощью пункта View Object (Просмотр объекта) контекстного меню. Форма, открытая для редактирования внешнего вида, показана на рис. 1.2.

Рис. 1.2. Редактирование формы

Для изменения свойств открытой формы используется окно Properties (Свойства). В окне ТооШох (Панель инструментов) можно выбирать элементы управления, добавляемые в форму. После добавления любого элемента управленияс помощью двойнго щелчка кнопкой мыши на нем можно перейти к редактированию соответствующего кода в модуле формы.

Структура модуля VBA

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

1. Объявления переменных, директивы (с использованием ключевого слова Option), объявления API-функций.

2. Объявления и реализация процедур и функций.

Соглашения, применяемые при описании синтаксиса VBA

В данном разделе приводится описание элементов, которые используются для формального задания синтаксиса конструкций языка VBA. Сведения об этих элементах приведены в табл. 1.1.

Таблица 1.1. Элементы описания синтаксических конструкций VBA

Примечание

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

Чтобы сказанное выше стало более понятным, ниже приведен пример формального задания синтаксической конструкции языка VBA. В качестве примера взят формат упрощенного объявления локальной переменной (смысл всех элементов данной конструкции будет полностью раскрыт в последующих разделах главы):

Dim Static Имя [As Имя_типа][, Имя_переменной [As Имя_типа]]…

Приведенная запись означает, что строка объявления локальной переменной должна начинаться инструкцией Dim или Static. После инструкции должен следовать идеитификатор переменной. Необязательным элементом конструкции является указание типа переменной. Но если тип указывается, то значение в квадратных скобках (первых) должно быть использовано полностью, то есть ключевое слово As не должно применяться без указания имени типа. Объявления переменных можно продолжить в этой же строке без повторного использования инструкции Dim, но разделяя их запятой (см. вторые скобки). Подобные объявления можно продолжать в строке до бесконечности (об этом говорит использование многоточия после вторых скобок).

Примеры объявлений переменных, удовлетворяющие указанному формату, приведены ниже:

Dim intPos As Integer

Dim varValue, intValue As Integer

Static strText As String

Static var1 As Variant, var2 As Variant, var3 As Variant

Комментарии в программе

В VBA предусмотрены два способа введения комментариев в программы. Первый — это использование ключевого слова Rem для обозначения начала комментария. Второй — использование вместо Rem апострофа (). Главным различием этих двух способов является то, что ключевое слово Rem должно находиться в начале строки программы. При этом вся строка является комментарием. Например:

Rem Объявление переменной

Dim intRes As Integer

Rem Присвоение значения переменной

intRes = 123

Комментарий же, вводимый с помощью апострофа, может быть расположен как в отдельной строке, так и на одной строке с другими инструкциями (в конце этой строки):

‘ Объявление переменной

Dim intRes As Integer

intRes = 123 Присвоение значения переменной

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

‘ Длинный комментарий, текст которого не помещается _

в одной строке

или

Rem Длинный комментарий, текст которого не помещается _

в одной строке

Идентификаторы

Идентификаторами в VBA являются названия переменных, констант, функций, процедур, классов, типов данных и прочих элементов, не являющихся зарезервированными словами языка (названиями инструкций, операторов, встроенных функций и т. д.).

Среда разработки VBA поддерживает кодировку символов Unicode. Поддержка данной кодировки разработки означает, что программист может использовать в составе идентификаторов символы любого поддерживаемого алфавита (например, кириллицы).

При формировании идентификаторов необходимо учитывать следующее.

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

• Первым символом идентификатора должна быть буква.

Внимание!

VBA не различает регистр символов в идентификаторах. Это значит, что идентификаторы strmyText и strMyText будут представлять одну и ту же переменную. Это же справедливо и для идентификаторов процедур, функций, классов и т. д.

Рассмотрим примеры корректных идентификаторов VBA:

strText

CUSTOM_Data2

Функция_Суммы

РасчетПрибыли

Переменные

В данном разделе читатель ознакомится с основными особенностями использования переменных при написании программ на языке VBA.

Встроенные типы данных

VBA располагает множеством встроенных типов данных. Условно эти типы можно разделить на численные типы, строки, ссылки, типы для хранения даты и времени, объектные ссылки, массивы и особый тип для хранения значения любого типа, именуемый Variant.

Численные типы данных

Основные характеристики численных типов VBA приведены в табл. 1.2.

Таблица 1.2. Численные типы данных VBA

Примечание

Численный тип Decimal как самостоятельный тип на сегодняшний день не поддерживается. Однако его можно использовать в пределах типа Variant (о типе Variant будет рассказано далее).

Строки

Для хранения символьных данных в VBA реализована поддержка типа данных String (строка). В переменных этого типа могут храниться отдельные символы и большие фрагменты текста. Строки в VB А бывают двух видов: фиксированной и переменной длины. Разница между этими двумя типами строк понятна из их названий.

Строки фиксированной длины применяются, когда длина текста, который хранится в них, постоянна или не может превышать известный предел (например, для хранения отдельных символов). Строки фиксированной длины в ряде случаев обрабатываются быстрее строк переменной длины. Максимальный размер строки фиксированной длины — около 65 400 символов.

Строки переменной длины являются более гибким инструментом обработки текста в программах на VBA. Длина этих строк может динамически изменяться в зависимости от длины хранимого в них текста. Максимальная длина таких строк — около 2 млрд символов.

Дата и время

Для удобства работы со значениями даты и времени в VBA введен тип данных Date. Он позволяет задавать значения времени и даты в формате, удобном для восприятия, а также упрощает вычисления с временными интервалами. Этот тип данных, естественно, используется и в таблицах Excel.

Нужно заметить, что тип Date не является внутренним типом, используемым VBA для хранения даты и времени. Вместо него применяется тип Single (число с плавающей точкой). Целая часть этого числа — количество суток, прошедших с 30 декабря 1899 года, дробная — прошедшая часть текущих суток.

Тип данных Variant

В VBA предусмотрен один универсальный тип данных — Variant. Переменная этого типа может хранить значение любого поддерживаемого VBA типа (в том числе и ссылки на объекты, о которых будет рассказано ниже).

Однако при обработке переменных типа Variant тратится дополнительное время на определение и преобразование типа данных в этих переменных — самый универсальный тип данных VBA оказывается и самым медленным. Поэтому следует избегать слишком частого и неоправданного использования переменных этого типа (например, в качестве целочисленных итераторов, счетчиков и т. д.).

Когда переменная типа Variant пуста (ей не присвоено никакого значения), она заполняется специальным значением Empty.

Ссылки. Тип данных Object

Важно понимать, что в VBA переменные, предоставляющие доступ к объектам, являются только ссылками на эти объекты. В данном языке программирования невозможно получить сам объект (его двоичный код). Все операции по созданию, удалению объектов и манипулированию ими, осуществляются только с использованием ссылок.

Объекты, доступные из VBA, существуют, пока на них установлена хотя бы одна ссылка. Первая ссылка на объект устанавливается при его создании. В процессе работы можно как устанавливать новые ссылки на объект, так и удалять их с использованием специальной инструкции Set. Пусть objRef — ссылка на некоторый объект. Тогда операция установления новой ссылки будет иметь такой вид:

Set objNewRef = objRef

Теперь objNewRef ссылается на тот же объект, что и objRef. Операция же удаления ссылок будет выглядеть следующим образом:

Set objRef = Nothing

Set objNewRef = Nothing

Если на объект не было других ссылок, кроме этих, то он будет удален.

Для доступа к объектам в VBA предусмотрен тип данных Object. Он является универсальным, так как может быть ссылкой на объект любого типа.

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

Для объявления переменных элементарных типов (не массивов) в блоке объявлений модуля используется следующая инструкция:

Public Private [WithEvents] Имя_переменной [As [New] Имя_-

типа] _

[, Имя_переменной [As [New] Имя_типа]]…

Ключевые слова, записанные до первых квадратных скобок, задают область видимости переменных:

• Public — позволяет объявлять глобальные переменные и общие переменные-члены класса (о классах будет рассказано позже);

• Private — позволяет объявлять переменные, доступные только в одном модуле, и частные переменные-члены класса.

Для объявления переменных элементарных типов (не массивов) в процедурах или функциях используется такая инструкция (локальных переменных):

Dim Static [WithEvents] Имя_переменной [As [New] Имя_типа] _

[, Имя_переменной [As [New] Имя_типа]]…

Ключевые слова, записанные до первых квадратных скобок, задают время жизни переменных:

• Dim — используется для объявления локальных переменных, которые уничтожаются после выхода из процедуры;

• Static — используется для объявления локальных переменных, значения которых сохраняются между вызовами процедуры или функции.

Ключевое слово WithEvents используется для объявления переменной-обработчика событий объекта.

Имя_переменной — это идентификатор объявляемой переменной.

Имя_типа — название типа данных объявляемой переменной.

Если конструкция [As [New] Имя_типа] не используется, то типом объявляемой переменной автоматически становится тип Variant.

Если используется ключевое слово New, то создается новый объект. New нельзя использовать совместно с WithEvents, а также при объявлении переменной типа Object и если тип Имя_типа не является объектным.

Ниже приведены примеры объявления переменных на VBA:

Public intData As Integer

Private intCount As Integer, varData

Dim strText As String

Static a, b, c

Dim objRef As Object

Dim objCtrl As New Control

Внимание!

При объявлении в одной строке нескольких переменных слово As относится только к переменной, непосредственно после идентификатора которой оно следует. Например, при объявлении Dim а, Ь, с As Integer переменные а и b будут иметь тип Variant, а переменная с — тип Integer.

Инициализация переменных

После того как переменная объявлена, VBA производит ее инициализацию указанным ниже образом.

• Переменным численных типов автоматически присваивается нулевое значение.

• Строки переменной длины после объявления являются пустыми (с нулевой длиной). Строки фиксированной длины заполняются нулевыми символами.

• Данные типа Date инициализируются значением 00:00:00 30.12.1899 (это равняется нулю при представлении даты в численном формате, о котором было рассказано выше).

• Все переменные типа Object и подобные (то есть ссылки на объекты определенного типа) принимают значение Nothing, если при их объявлении не создан новый объект (не использовалось New).

Явное и неявное объявление переменных

Рассмотренное выше объявление переменных называется явным.

VBA также поддерживает неявное объявление переменных. Под неявным объявлением подразумевается возможность использования переменной без ее объявления посредством инструкции Dim, Static, Private или Public. При первом обращении к такой переменной для нее автоматически выделяется память и происходит ее инициализация. Следует отметить, что все неявно объявленные переменные имеют тип Variant.

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

К примеру, можно очень долго разбираться, почему же после вычисления такого выражения, как dblSalaryAccount = dblSalaryAcount * 10. 5, значение переменной dblSararyAccount стало равным нулю, если до этого оно было равно 5.37 5. Все дело в небольшой ошибке в названии идентификатора переменной, в результате которой создается новая переменная dblSalaryAcount, которая инициализируется нулевым значением. В случае использования явного объявления переменных подобных ошибок в программе быть не может, потому что каждый раз при обнаружении необъявленного идентификатора VBA выдает ошибку.

Для включения требования обязательного объявления переменных используется директива Option Explicit. Чтобы данная директива добавлялась в каждый новый модуль автоматически, нужно с помощью меню Tools → Options (Сервис → Параметры) редактора VBA открыть диалоговое окно Options (Параметры) и на вкладке Editor (Редактор) установить флажок Require Variable Declaration (Явное описание переменных).

Константы

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

[Public Private] Const Имя_константы [As Имя_типа] = Значение

Два ключевых слова в первых скобках задают область видимости константы:

• Public — используется для объявления глобальных констант;

• Private — используется для объявления констант, доступных только в том модуле, где они объявлены.

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

Имя_константы — задает идентификатор константы.

Значение — константное значение (например, «Строка1», 1.245 ит. д.) либо выражение, в число аргументов которого не входят переменные и функции.

Если тип константы не задан, то он автоматически выбирается VBA исходя из ее значения. Ниже приводятся примеры объявления констант:

Const PI As Double = 3.14159265359

Public Const MyConstString = «MyConst»

Private Const НазваниеТаблицы As String = «Отчеты»

Операторы

Язык VBA содержит большое количество встроенных операторов, которые позволяют выполнять разнообразные действия над всеми встроенными в VBA типами. Операторы и их операнды по определенным правилам составляются в выражения. Данный раздел посвящен описанию операторов, предоставляемых VBA-npoграммисту.

Операторы для работы с численными значениями

Информация обо всех операторах для работы с численными значениями приведена в табл. 1.3.

Таблица 1.3. Операторы для работы с численными значениями

Примечание

Оператор «+» может использоваться и для соединения строк. Однако bVBA существует специальный оператор «&», выполняющий эту функцию. Рекомендуется использовать для соединения строк именно оператор «&», так как это способствует легкому визуальному отделению операций над строками от операций над другими типами данных, что, в свою очередь, улучшает читаемость кода.

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

Результатом выполнения всех операторов сравнения является значение типа Boolean. Если операнды какого-либо оператора удовлетворяют его условию, то возвращается значение True, иначе возвращается значение False. Все операторы сравнения, поддерживаемые VBA, приведены в табл. 1.4.

Таблица 1.4. Операторы сравнения

Описанные операторы сравнения могут принимать в качестве операндов значения выражений любого типа, то есть фактически оперируют с типом данных Variant. Если один из операндов равен Empty, то результатом выполнения операторов будет специальное значение NULL. Если операнды несравнимы, то при выполнении описанных выше операторов генерируется ошибка: «Несоответствие типа».

Режим сравнения строковых значений можно задать с помощью директивы Option Compare. Для Excel работают два варианта данной директивы: Option Compare Text (текст сравнивается без учета регистра символов) и Opt ion Compare Binary (сравниваются бинарные коды символов, при этом автоматически учитывается их регистр). По умолчанию сравнение строк происходит согласно директиве Option Compare Binary.

В VBA реализованы два специфических оператора Like и Is, которые тоже относятся к операторам сравнения. Они также возвращают значение типа Boolean как результат сравнения.

Оператор I s используется для определения, являются ли две ссылки ссылками на один и тот же объект. Этот оператор допускает использование в качестве операндов только ссылки на объекты. Формат данного оператора такой:

Результат = Ссылка1 Is Ссылка2

Оператор Like используется для проверки, удовлетворяет ли текст в строке заданному шаблону. Формат этого оператора следующий:

Результат = Строка Like Шаблон

Перечень символов, которые могут употребляться в строке шаблона, приведен в табл. 1.5.

Таблица 1.5. Перечень возможных символов в строке шаблона

В качестве примера определим, является ли строка «15 26 ОА» номером автомобиля серии ОА или ОО. Значение строки-шаблона для этого случая будет равно «## ## О[AО]», а результатом применения оператора «15 26 ОА» Like «## ## О[АО]» будет значение True.

Для задания непрерывного диапазона символов в квадратных скобках можно воспользоваться знаком «минус» (-). При этом символы необходимо указывать в возрастающем порядке (по номеру в алфавите): [A-Z], а не [Z-A].

Примечание

Если нужно, чтобы в шаблоне присутствовали специальные символы, приведенные в табл. 1.5, то необходимо заключить соответствующие знаки в скобки: ([), (]), (#), (?), (*).

Логические операторы

В VBA введены операторы, которые используются в составе логических выражений (например, условие в инструкции If-Then-Else, которая будет рассмотрена позже). Формат логических операторов VBA (кроме импликации) и их описание приведены в табл. 1.6 (все выражения, используемые в операторах, — логические, принимающие значение True или False).

Таблица 1.6. Логические операторы VBA

Массивы

При создании программ часто приходится оперировать большими количествами данных одного типа и имеющих одинаковый смысл. Для хранения таких данных используются массивы. Массив — это совокупность значений одного типа, объединенных в одной переменной.

Язык VBA предоставляет широкие возможности для использования массивов. В нем работа с массивами значительно упрощена. Например, при выполнении программы автоматически контролируется выход за пределы массива. Также VBA-программисту при работе с массивами не нужно заботиться о выделении и освобождении памяти.

Объявление массива

Для объявления массивов в VBA используются инструкции, формат которых приведен ниже:

Public Private Имя_массива ([Размерность])[As Имя_типа] _

[, Имя_массива ([Размерность]) [As Имя_типа]]…

или

Dim Static Имя_массива ([Размерность])[As Имя_типа] _

[, Имя_массива ([Размерность]) [As Имя_типа]]…

Первая инструкция используется для объявления массивов на уровне модуля, вторая — для объявления массива в процедуре или функции (все аналогично объявлению переменных).

Объявление массива отличается от объявления любой другой переменной тем, что при объявлении массива после идентификатора переменной указывается размерность. Если размерность не указана, то создается динамический массив, размер которого можно изменять во время выполнения программы. Для динамического массива инструкция объявления является формальной: чтобы этот массив можно было использовать, к нему необходимо применить инструкцию ReDim (об этой инструкции будет рассказано далее).

При указании размерности массива необходимо учитывать, что элемент Размерность имеет следующий формат:

Нижняя_граница To Верхняя_граница Количество_элементов _

[,Нижняя_граница To Верхняя_граница Количество_элементов]…

В VBA разрешено создавать многомерные массивы с количеством измерений не более 60. Размерности измерений массива разделяются запятой.

При задании размерности в виде Нижняягранща То Верхняягранща нужно явно указывать нижнюю и верхнюю границы измерения массива (например, 50 То 100).

При задании размерности можно также просто указывать требуемое количество элементов в данном измерении массива. При таком задании в качестве нижней границы измерения используется значение по умолчанию (об изменении этого значения будет рассказано далее).

Ниже приведены примеры объявлений массивов (переменного размера, двух одномерных и двух многомерных):

Dim avarValues()

Dim astrValues(1 To 10) As String, astrValues2(10) As String

Dim aintValues(1 To 10, 1 To 3) As Integer, aintValues(10, 3)

As Integer

Задание нижней границы по умолчанию

Как было сказано ранее, при указании размерности измерения массива может использоваться значение нижней границы по умолчанию. Для задания нижней границы, используемой по умолчанию, предназначена директива Option Base. Существуют только два варианта данной директивы:

Option Base 0

и

Option Base 1

Первый вариант устанавливает нижнюю границу равной нулю (используется по умолчанию), а второй — единице.

Изменение размера массива

Язык VBA позволяет изменять размер динамического массива во время выполнения программы. Кроме того, VBA дает возможность изменять количество измерений такого массива. Для этого используется инструкция ReDim, формат которой следующий:

ReDim [Preserve] Имя_массива ([Размерность])[As Имя_типа] _

[, Имя_массива ([Размерность]) [As Имя_типа]]…

Назначение элементов данной инструкции полностью аналогично назначению одноименных элементов инструкции Dim (при использовании ее для объявления массивов). Тип элементов массива можно указывать только в том случае, если Имямассива — это идентификатор переменной типа Variant.

При выполнении инструкции ReDim без использования ключевого слова Preserve значения всех элементов, которые ранее были в массиве, теряются. Ниже приведены примеры таких инструкций:

ReDim astrValues(1 To 10), aintValues(10, 20)

ReDim varArray(2 To 4) As Boolean

Использование Preserve позволяет изменять размер массива, не теряя значений его элементов. Однако использование данного ключевого слова налагает некоторые ограничения на возможности манипулирования массивами:

• нельзя изменять количество измерений массива;

• нельзя изменять размерности измерений массива, кроме размерности последнего измерения;

• можно изменять только верхнюю границу последнего измерения массива.

Давайте рассмотрим пример использования инструкции ReDim с ключевым словом Preserve:

‘ Первая инструкция ReDim для динамического массива

ReDim astrValues(1 To 5, 1 To 10)

‘ Увеличение размера массива

ReDim Preserve astrValues(1 To 5, 1 To 25)

‘ Уменьшение размера массива

ReDim Preserve astrValues(1 To 5, 1 To 15)

Определение границ массива

Так как VBA позволяет задавать произвольную нижнюю границу массива, при написании программ крайне удобно наличие возможности узнать границы массива во время выполнения программы. Для этой цели в VBA введены две функции, формат которых следующий:

LBound(Имя_массива[, Номер_измерения])

RBound(Имя_массива[, Номер_измерения])

Функция LBound позволяет получить нижнюю границу массива, a RBound — верхнюю. Обе функции принимают в качестве аргументов идентификатор массива и номер измерения, границу которого нужно получить. Нумерация измерений начинается с единицы. Если параметр Номеризмерения опущен, то его значение принимается равным единице. Обе функции возвращают значение типа Long.

Ниже приведен пример получения нижней и верхней границ первого измерения массива avarValues (значения сохраняются в переменных типа Long):

lngLBound = LBound(avarValues)

lngRBound = RBound(avarValues)

Доступ к элементам массива

Для доступа к элементам массива в VBA используется указание номера этого элемента в круглых скобках после идентификатора переменной массива. При этом номера измерений массива разделяются запятыми. Например (для одномерного и трехмерного массивов):

intNum = aintValues(16)

intNum = aintValues(12, 32, 3)

Использование переменной Variant при работе с массивами

Язык VBA поддерживает универсальный тип данных Variant, которому находится применение и при работе с массивами. Переменной этого типа можно присваивать массив. В результате этой операции в переменной Variant формируется копия массива. Далее с такой переменной можно работать либо как с обычной переменной, либо как с массивом (использовать доступ к элементам), например:

Dim aintValues(1 To 3) As Integer

Dim varArray

‘ Присвоение массива переменной типа Variant

varArray = aintValues

‘ Доступ к элементам массива

varArray(1) = 1

varArray(2) = 2

varArray(3) = 3

Возможность присвоения массива переменной типа Variant на самом деле широко используется в VBA при передаче массивов в функции и процедуры, а также при возврате функциями массивов.

Для определения того, содержит ли переменная типа Variant массив, можно использовать функцию IsArray, имеющую следующий формат:

IsArray(Переменная)

Данная функция возвращает значение типа Boolean: True — если в переменной с именем Переменная содержится массив, и False — в противном случае.

Использование функции Array для заполнения массива

В VBA имеется возможность быстрого заполнения массива значениями. Эта возможность реализована в функции Array. Ее формат такой:

Array(Список_элементов)

В качестве аргументов функция принимает список значений, разделенных запятой. Возвращает она заполненный заданными значениями массив, сохраненный в переменной типа Variant. Ниже приведен пример использования функции Array:

Dim varArray

‘ Заполнение массива значениями

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

Коллекции

Коллекции (они же семейства и множества) — это объекты, которые позволяют хранить произвольное количество элементов любого типа. Элементы в коллекции идентифицируются уникальным ключом, которым может быть не только номер элемента в коллекции, но и значение строкового или другого типа. При программировании на VBA различные коллекции используются очень часто. Например, к коллекции Workbooks нужно обращаться для получения ссылки на объект Workbook нужной рабочей книги, к коллекции Worksheets — для получения ссылки на объект Worksheet нужного рабочего листа и т. д.

В VBA коллекции реализованы во встроенном классе Collection. Создание объекта Collection ничем не отличается от создания объекта другого типа:

Dim col As New Collection

или

Dim col As Collection

Set col = New Collection

Добавление элементов

Для добавления элементов в коллекции реализован метод Add, имеющий следующий формат:

Ссылка. Add Элемент [, Ключ][, Добавить_перед][, Добавить_после]

Единственным обязательным параметром метода Add является значение добавляемого элемента. Элемент может быть константой или переменной любого типа, кроме типа, определенного пользователем. При добавлении элемента можно указать ключ, который будет однозначно идентифицировать элемент в коллекции. Ключ — это любое значение типа Variant.

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

Конец ознакомительного фрагмента.

Время на прочтение
7 мин

Количество просмотров 315K

Приветствую всех.

В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.

VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.

Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.

Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.

Поэтому, увы, будем учить Visual Basic.

Чуть-чуть подготовки и постановка задачи

Итак, поехали. Открываем Excel.

Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.

Появилась вкладка.

Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):

То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).

Результат, которого хотим добиться, выглядит примерно так:

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

Кодим

Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».

И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».

Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:

Sub FormatPrice()End Sub

Напишем Hello World:

Sub FormatPrice()
    MsgBox "Hello World!"
End Sub

И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.

Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.

Примеры синтаксиса

' Процедура. Ничего не возвращает
' Перегрузка в VBA отсутствует
Sub foo(a As String, b As String)
    ' Exit Sub ' Это значит "выйти из процедуры"
    MsgBox a + ";" + b
End Sub' Функция. Вовращает Integer
Function LengthSqr(x As Integer, y As IntegerAs Integer
    ' Exit Function
    LengthSqr = x * x + y * y
End FunctionSub FormatPrice()
    Dim s1 As String, s2 As String
    s1 = "str1"
    s2 = "str2"
    If s1 <> s2 Then
        foo "123""456" ' Скобки при вызове процедур запрещены
    End IfDim res As sTRING ' Регистр в VB не важен. Впрочем, редактор Вас поправит
    Dim i As Integer
    ' Цикл всегда состоит из нескольких строк
    For i = 1 To 10
        res = res + CStr(i) ' Конвертация чего угодно в String
        If i = 5 Then Exit For
    Next iDim x As Double
    x = Val("1.234"' Парсинг чисел
    x = x + 10
    MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
    x = 5 / 0
    MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
    x = 5 / 0
    MsgBox "OK!"
    GoTo ne

Err:
    MsgBox 

"Err!"

ne:

On Error GoTo 0 ' Отключаем обработку ошибок

    ' Циклы бывает, какие захотите
    Do While True
        Exit DoLoop 'While True
    Do 'Until False
        Exit Do
    Loop Until False
    ' А вот при вызове функций, от которых хотим получить значение, скобки нужны.
    ' Val также умеет возвращать Integer
    Select Case LengthSqr(Len("abc"), Val("4"))
    Case 24
        MsgBox "0"
    Case 25
        MsgBox "1"
    Case 26
        MsgBox "2"
    End Select' Двухмерный массив.
    ' Можно также менять размеры командой ReDim (Preserve) - см. google
    Dim arr(1 to 10, 5 to 6) As Integer
    arr(1, 6) = 8Dim coll As New Collection
    Dim coll2 As Collection
    coll.Add "item""key"
    Set coll2 = coll ' Все присваивания объектов должны производится командой Set
    MsgBox coll2("key")
    Set coll2 = New Collection
    MsgBox coll2.Count
End Sub

Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.

Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.

Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.

Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.

Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.

Кодим много и под Excel

В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.

Sub FormatPrice()
    Sheets("result").Cells.Clear
    Sheets("data").Activate
End Sub

Работа с диапазонами ячеек

Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.

Примеры работы с Range

Sheets("result").Activate
Dim r As Range
Set r = Range("A1")
r.Value = "123"
Set r = Range("A3,A5")
r.Font.Color = vbRed
r.Value = "456"
Set r = Range("A6:A7")
r.Value = "=A1+A3"

Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:

  1. Считали группы из очередной строки.
  2. Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
    1. Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
  3. После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.

Для упрощения работы рекомендую определить следующие функции-сокращения:

Function GetCol(Col As IntegerAs String
    GetCol = Chr(Asc("A") + Col)
End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As IntegerAs Range
    Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End FunctionFunction GetCell(Col As Integer, Row As IntegerAs Range
    Set GetCell = Range(GetCol(Col) + CStr(Row))
End Function

Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».

Глобальные переменные

Option Explicit ' про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3

FormatPrice

Sub FormatPrice()
    Dim I As Integer ' строка в data
    CurRow = 1
    Dim Groups(1 To GroupsCount) As String
    Dim PrGroups(1 To GroupsCount) As String

    Sheets(

"data").Activate
    I = 2
    Do While True
        If GetCell(0, I).Value = "" Then Exit Do
        ' ...
        I = I + 1
    Loop
End Sub

Теперь надо заполнить массив Groups:

На месте многоточия

Dim I2 As Integer
For I2 = 1 To GroupsCount
    Groups(I2) = GetCell(I2, I)
Next I2
' ...
For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
    PrGroups(I2) = Groups(I2)
Next I2
I =  I + 1

И создать заголовки:

На месте многоточия в предыдущем куске

For I2 = 1 To GroupsCount
    If Groups(I2) <> PrGroups(I2) Then
        Dim I3 As Integer
        For I3 = I2 To GroupsCount
            AddHeader I3, Groups(I3)
        Next I3
        Exit For
    End If
Next I2

Не забудем про процедуру AddHeader:

Перед FormatPrice

Sub AddHeader(Ty As Integer, Name As String)
    GetCellS("result", 1, CurRow).Value = Name
    CurRow = CurRow + 1
End Sub

Теперь надо перенести всякую информацию в result

For I2 = 0 To DataCount - 1
    GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
Next I2

Подогнать столбцы по ширине и выбрать лист result для показа результата

После цикла в конце FormatPrice

Sheets("Result").Activate
Columns.AutoFit

Всё. Можно любоваться первой версией.

Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:

Sub AddHeader(Ty As Integer, Name As String)
    Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
    ' Чтобы не заводить переменную и не писать каждый раз длинный вызов
    ' можно воспользоваться блоком With
    With GetCellS("result", 0, CurRow)
        .Value = Name
        .Font.Italic = True
        .Font.Name = "Cambria"
        Select Case Ty
        Case 1 ' Тип
            .Font.Bold = True
            .Font.Size = 16
        Case 2 ' Производитель
            .Font.Size = 12
        End Select
        .HorizontalAlignment = xlCenter
    End With
    CurRow = CurRow + 1
End Sub

Уже лучше:

Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:

Поэтому чуть-чуть меняем код с добавлением стиля границ:

Sub AddHeader(Ty As Integer, Name As String)
    With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
        .Merge
        .Value = Name
        .Font.Italic = True
        .Font.Name = "Cambria"
        .HorizontalAlignment = xlCenterSelect Case Ty
        Case 1 ' Тип
            .Font.Bold = True
            .Font.Size = 16
            .Borders(xlTop).Weight = xlThick
        Case 2 ' Производитель
            .Font.Size = 12
            .Borders(xlTop).Weight = xlMedium
        End Select
        .Borders(xlBottom).Weight = xlMedium ' По убыванию: xlThick, xlMedium, xlThin, xlHairline
    End With
    CurRow = CurRow + 1
End Sub

Осталось лишь добится пропусков перед началом новой группы. Это легко:

В начале FormatPrice

Dim I As Integer ' строка в  data
CurRow = 0 ' чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String

В цикле расстановки заголовков

If Groups(I2) <> PrGroups(I2) Then
    CurRow = CurRow + 1
    Dim I3 As Integer

В точности то, что и хотели.

Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.

Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.

Спасибо за внимание.

Буду рад конструктивной критике в комментариях.

UPD: Перезалил пример на Dropbox и min.us.

UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.

Понравилась статья? Поделить с друзьями:
  • Falcon eye fe 1104mhd light инструкция
  • Руководство по профилированию
  • Гкш 400 руководство по эксплуатации
  • Бактофит глазные капли инструкция цена аналоги дешевые
  • Амигренин инструкция по применению таблетки взрослым от чего помогает