Учебно-методические материалы для студентов кафедры АСОИУ

Учебные программы » Пакеты прикладных программ » Конспект лекций

Модули VBA

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

Visual Basic поддерживает три типа модулей, которые могут быть включены в проект и использованы:

  • Стандартные модули - это модули, в которых можно описать доступные во всем проекте процедуры.
  • Модули классов содержат описание свойств, методов и событий пользовательских классов.
  • Модули форм содержат процедуры обработки событий, генерируемых элементами управления в формах проекта.

Структура модуля VBA включает два неявных (т.е. не требующих специального описания) раздела: общий (General) и объявлений (Declarations). В общем разделе задаются параметры среды (Option Base, Option Explicit), приводятся описания глобальных переменных, констант и типов. Раздел объявлений предназначен для описания процедур и функций.

Области видимости

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

Локальные переменные определены на уровне подпрограммы с помощью ключевых слов Dim или Static. Они доступны только внутри этой подпрограммы и по выходу из нее уничтожаются. Глобальные переменные объявляются на уровне модуля. Такие переменные доступны:

  • для всех подпрограмм модуля, в котором они объявлены (при объявлении с ключевым словом Private, либо Dim);
  • для всего приложения – при объявлении с ключевым словом Public;
Подпрограммы VBA могут быть объявлены на двух уровнях – уровне проекта (Public) и уровне модуля (Private). Например:
Public Sub Query(price, count) ' видимость на уровне проекта 
Private Sub Sub Query(price, count) ' видимость на уровне модуля 

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

При описании локальных переменных можно использовать ключевое слово Static. Такие переменные являются статическими и сохраняют значения между вызовами.

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

В языке программирования VBA предусмотрено несколько десятков встроенных функций. Они доступны в любой программе на языке VBA, при этом безразлично, в среде какого программного продукта мы находимся — Excel, Word, Access или, к примеру, AutoCAD. Используются они очень активно, и во многих ситуациях без них не обойтись. Встроенные функции обычно группируют по назначению: математические, строковые, преобразования типов, логические и т.п. В справке по VBA имеется подробная информация о всех встроенных функциях. Здесь же приведем краткое описание только некоторых.

Функции приведения типов

Используются для конвертации типов данных. Вот перечень этих функций: CBool(), CByte(), CCur(), CDate(), CDbl(), CDec(), CInt(), CLng(), CSng(), CStr(), CVar(), CVDate(), CVErr().

Просмотреть, что в итоге получилось, можно при помощи функции TypeName(), например:

nVar1 = CInt(InputBox("Введите значение"))
MsgBox TypeName(nVar1)  

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

  • Str() — позволяет перевести числовое значение в строковое, при этом вставляет пробел впереди для положительных чисел.
  • Val() — извлекает из строки числовое значение (до первого нечислового символа, кроме точки). Очень удобно, когда вперемежку с числовыми данными прописываются единицы измерения или валюта.
Чтобы не возникло ошибок при конвертации, можно вначале проверять значения на возможность конвертации при помощи функций IsNumeric() и IsDate(). Для проверки на соответствие специальным значениям можно использовать функции IsArray(), IsEmpty(), IsError(), IsMissing(), IsNull() и IsObject(). Все эти функции возвращают True или False в зависимости от результатов проверки переданного им значения.

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

  • Left(), Right(), Mid() — получить фрагмент строки слева, справа или из середины исходной строки соответственно.
  • Len() — получить число символов в строке.
  • LCase() и UCase() — перевести строку в нижний и верхний регистры соответственно.
  • LSet() и RSet() — заполнить строку символами без изменения длины (соответственно слева и справа). Лишние символы обрезаются, на место недостающих подставляются пробелы.
  • LTrim(), RTrim(), Trim() — убрать пробелы соответственно слева, справа или и слева, и справа.
  • Replace() — заменить в строке одну последовательность символов на другую.
  • StrComp() — сравнить две строки.
  • StrReverse() — "перевернуть" строку, разместив ее символы в обратном порядке.

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

Функций для работы с числовыми значениями в VBA очень много. Приведем только некоторые из них.

  • ABS() — эта функция возвращает абсолютное значение переданного ей числа.
  • Int(), Fix() и Round() позволяют по разному округлять числа: Int возвращает ближайшее меньшее целое, Fix() отбрасывает дробную часть, Round() округляет до указанного количества знаков после запятой.
  • Rnd() и команда Randomize используются для получения случайных значений. Обычный синтаксис при применении Rnd выглядит так:
    случайное_число = Int(минимум + (Rnd()* максимум))
    MsgBox(Int(1 + (Rnd() * 100)))  
    

    Перед вызовом функции Rnd() следует выполнить команду Randomize для инициализации генератора случайных чисел.

  • Sgn() — позволяет вернуть информацию о знаке числа. Возвращает 1, если число положительное, -1, если отрицательное и 0, если проверяемое число равно 0.

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

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

  • Date() — возвращает текущую системную дату.
  • Time() возвращает текущее системное время, а Now() — дату и время вместе.
  • DateAdd() — возможность добавить к дате указанное количество лет, кварталов, месяцев и так далее — вплоть до секунд.
  • DateDiff() — возможность получить разницу между датами.
  • DatePart() — возвращает указанную часть даты (например, только год, только месяц или только день недели).
  • DateSerial() — формирует значение даты на основе передаваемых символьных значений. То же самое делает DateValue(), отличия — в формате принимаемых значений. Аналогичным образом (для времени) работают TimeSerial() и TimeValue().
  • Day() (а также Year(), Month(), Weekday(), Hour(), Minute(), Second()) — специализированные заменители функции DatePart(), которые возвращают нужную часть даты.
  • MonthName() — возвращает имя месяца словами по его номеру. Возвращаемое значение зависит от региональных настроек. Если они русские, то вернется русское название месяца.
  • Timer() — возвращает количество секунд, прошедших с полуночи.

Функции взаимодействия с пользователем

Для организации диалога с пользователем VBA представляет две встроенные функции - MsgBox и InputBox. Окно сообщений MsgBox выводит сообщения для пользователя, а окно ввода InputBox обеспечивает возможность получения информации от пользователя.

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

Формат функции MsgBox:

MsgBox (Prompt [, Buttons] [, Title] [, HelpFile, Context]) 

Назначение параметров:

  • Prompt – строковое выражение, отображаемое как сообщение в диалоговом окне;
  • Title – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот параметр опущен, в строку заголовка помещается имя приложения, из которого запускается программа VBA;
  • HelpFile – строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне; обычно это файл, который вы уже должны были создать с помощью Windows Help Compiler. Если этот параметр указан, необходимо также указать параметр Context;
  • Context – числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот параметр указан, необходимо указать также параметр HelpFile;
  • Buttons – числовое выражение, которое задает количество и тип кнопок в диалоговом окне MsgBox. Buttons указывает также кнопку по умолчанию в диалоговом окне и содержит ли это диалоговое окно стандартные значки Windows для предупредительных сообщений и запросов пользователя. Значения Buttons можно получить из справочной системы.
Простой пример использования функции MsgBox:
Sub sample3() 
	MsgBox "Видите ли вы две кнопки?", vbYesNo + vbInformation, "Сообщение" 
End Sub 

В данном примере MsgBox применяется не в виде функции, а в виде процедуры (т.е. не возвращает никакого значения). Следовательно, код выбранной кнопки нигде не сохраняется и не может быть использован. Чтобы определить, какая кнопка была нажата, MsgBox необходимо вызвать как функцию, т.е. сохранить возвращаемое значение в переменную (Листинг 17.

Листинг 17. Использование MsgBox

Sub sample4() 
	Dim res ' объявляем переменную 
	' вызываем MsgBox и сохраняем значение в переменной 
	res = MsgBox("Видите ли вы две кнопки?", vbYesNo + vbInformation, "Сообщение") 		
	Debug.Print res ' печатаем полученное значение 
End Sub 

При выполнении этого макроса, когда пользователь выбирает кнопку Yes или No в переменной res сохраняется число, соответствующее выбранной кнопке.

Вместо возвращаемых функцией MsgBox целочисленных значений удобнее пользоваться предопределенными константами VBA. В таб. 11 приведены возвращаемые значения констант функции MsgBox.

Таблица 11. Возвращаемые значения функции MsgBox

Константа Означает, что пользователь нажал кнопку
vbAbort Стоп (Abort)
vbCancel Отмена (Cancel)
vbIgnore Пропустить (Ignore)
vbNo Нет (No)
vbOk Ок
vbRetry Повтор (Retry)
vbYes Да (Yes)

Дополним код листинга 17 проверкой возвращенного значения (листинг 18).

Листинг 18. Проверка возращаемого значения MsgBox

Sub sample5() 
	' вызываем MsgBox и сохраняем значение в переменной 
	res = MsgBox("Видите ли вы две кнопки?", vbYesNo + vbInformation, "Сообщение") 
	
	' проверяем, какая кнопка нажата 
	If res = vbYes Then : MsgBox "Вы нажали Yes", , "Результат выбора" 
	Else : MsgBox "Вы нажали No", , "Результат выбора" 
	End If 
End Sub 

Функция InputBox() выводит на экран диалоговое окно, содержащее сообщение и поле ввода, устанавливает режим ожидания ввода текста, а затем возвращает значение типа String, содержащее текст, введенный в поле. Формат функции InputBox:

InputBox (Prompt [, Title] [, Default] [, XPos] [, Ypos] [, HelpFile, Context]) 

Назначение параметров:

  • Prompt – строковое выражение, отображаемое как сообщение в диалоговом окне;
  • Title – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот параметр опущен, в строку заголовка помещается имя приложения;
  • Default – строковое выражение, отображаемое в поле ввода и используемое по умолчанию, если пользователь не введет другую строку. Если этот параметр опущен, поле ввода изображается пустым;
  • Xpos и Ypos – числовые выражения, которые указывают местоположение окна ввода и являются координатами верхнего левого угла диалогового окна; Xpos – горизонтальное расстояние от левого края окна; Ypos – вертикальное расстояние от верхнего края окна. Если эти параметры опущены, диалоговое окно выравнивается по центру экрана;
  • HelpFile – строковое выражение, определяющее имя существующего файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот параметр указан, необходимо также указать параметр Context;
  • Context – числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот параметр указан, необходимо указать также параметр HelpFile.

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

Sub sample6() 
	Dim username As String 
	username = InputBox("Введите ваше имя ", "Пример 6") 
	MsgBox ("Здравствуйте, "+username) 
End Sub 

В результате выполнения этого макроса на экран последовательно выводятся диалоговые окна ввода и вывода (рис. 5).


Рис. 5 Интерактивные функции VBA

Анатольев А.Г., 01.10.2012

Постоянный адрес этой страницы:

↑ В начало страницы