[an error occurred while processing this directive] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1-й час. Знакомство с Visual Basic for Applications 3-й час. Работа с элементами управления 4-й час. Переменные и константы 6-й час. Логика условных операторов 7-й час. Циклические вычисления 9-й час. Основные объекты Excel 11-й час. Редактор Visual Basic 15-й час. Автоматизация экранных форм 20-й час. Получение внешних данных |
4-й час. Переменные и константыЭтот час непосредственно посвящен программированию на VBA. Мы рассмотрим пять основных понятий языка VBA: модули, процедуры, переменные, константы и область видимости переменных и констант. В этом часе будут рассмотрены следующие вопросы.
Модуль: дом для кода VBAКод VBA должен где-то находиться, и это "где-то" называется модулем. Различают два основных типа модулей: модули классов и стандартные модули. Каждая содержащаяся в стандартном модуле процедура является либо процедурой-функцией, либо процедурой-подпрограммой (различия между ними мы рассмотрим позднее в этом часе). Официально модуль определяется как совокупность объявлений (описательная часть) и процедур, хранящихся как единое целое. VBA позволяет создавать собственные объекты. Модули классов содержат описание таких объектов. В своей работе в основном вы будете использовать стандартные модули (которые в дальнейшем будем называть просто модулями). Можно самостоятельно создать модуль или предоставить Excel возможность создать его автоматически, например при записи макроса. До тех пор пока ваши процедуры сохраняются в открытой рабочей книге, Excel и VBA не обращают особого внимания на модули, содержащие эти процедуры. Обзор процедурДо сих пор мы использовали один термин, не объясняя его. Этот термин - процедура. Восполняем этот пробел "расплывчатым" определением: процедура - любая совокупность кода VBA, рассматриваемая как единое целое. Как правило, процедура состоит из операторов, выполняющих какую-либо задачу или вычисляющих значение. Каждая процедура идентифицируется своим уникальным именем. Существуют два типа процедур: процедура-подпрограмма и процедура-функция (будем их называть просто подпрограммой и функцией). Подпрограмма выполняет один или несколько операторов и не возвращает значения. Примером подпрограммы является код макроса - макрос может записать только подпрограмму, но не функцию. В листинге 4.1 показан пример подпрограммы. Листинг 4.1. Пример подпрограммы
Часто выполнение процедуры является реакцией на какое-либо событие (event). В этом случае говорят, что процедура обрабатывает событие. Чтобы узнать, что это за событие, надо посмотреть на имя процедуры. Имя процедуры состоит из названия объекта, cmdБольшойШрифт, и события, Click (щелчок), которое отделяется от названия объекта символом подчеркивания. Для тех, кто еще не догадался, сообщаю, в данном случае процедура выполняется в ответ на щелчок на командной кнопке, которая имеет имя cmdБольшойШрифт. Процедура-функция (напомню, что мы договорились называть ее просто функцией) в отличие от подпрограммы возвращает какое-либо значение. Это значение часто является результатом вычислений или результатом тестирования чего-либо (в этом случае возвращается логическое значение ИСТИНА или ЛОЖЬ). Как уже упоминалось ранее, вы можете использовать VBA для создания собственных функций. Затем эти функции можно применить при создании формул в ячейках рабочего листа. Листинг 4.2. содержит пример простой функции, вычисляющей торговую наценку в размере 10% от цены. Листинг 4.2. Пример простой функции
Отметим, что функция использует аргумент Цена, который определяет величину наценки. (Аргументы могут иметь как функции, так и подпрограммы.) Аргумент Цена может быть числом или ссылкой на ячейку рабочего листа. Величина наценки является тем значением, которое возвращает функция. Применение этой функции показано на рис. 4.1.
Рис. 4.1. Использование созданной функции Наценка Создание процедурСоздание первой процедуры требует выполнения двух последовательных шагов: сначала надо вставить модуль в рабочую книгу, а затем в этом модуле написать процедуру. Для любого создаваемого приложения надо создать свой модуль. Приложение может содержать несколько модулей, но это не обязательно. Некоторые разработчики предпочитают иметь много модулей, так как в этом случае они могут организовать их по назначению, виду и т.п. Процедура, созданная нами в следующем примере, будет выводить на экран окно сообщения. Для создания этой процедуры выполните следующие действия.
Если вы не видите окно проектов, нажмите комбинацию клавиш <Ctrl+R>. В верхней части окна кода модуля вы увидите оператор Option Explicit (явное описание опций), который принуждает явно описывать все переменные с помощью операторов Dim, Private, Public, ReDim и Static. Если вы попытаетесь использовать переменную без ее объявления, то при компиляции кода будет выдана ошибка. Этот оператор в новом модуле появляется не всегда, а только тогда, когда в диалоговом окне Options на вкладке Editor установлен флажок опции Require Variable Declaration (Требовать объявления переменных). Диалоговое окно Options открывается командой Tools > Options (Сервис > Параметры).
Рис. 4.2. Окно проектов позволяет следить за компонентами приложений
После того как вы введете MsgBox и нажмете клавишу пробела, появится окно с информацией о данном операторе. Делать отступ текста с помощью клавиши <Таb> не обязательно. Отступ делается для более легкого чтения кода.
Рис. 4.3. Это диалоговое окно помогает в создании подпрограмм и функций
Рис. 4.4. Новая процедура начинается оператором Public Sub и заканчивается оператором End Sub
Рис. 4.5. Ваша первая процедура имеет всего три строчки кода VBA VBA требует выполнения определенных правил для имен подпрограмм и функций. Эти правила таковы.
Выполнение процедурыПосле создания процедуры вы можете ее сразу выполнить. Для этого существует несколько путей. Можно использовать команду Run Sub/UserForm (Выполнить подпрограмму/экранную форму) из меню Run (Выполнить) или щелкнуть на кнопке Run Sub/UserForm стандартной панели инструментов, или нажать клавишу <F5>. Итак, чтобы выполнить нашу процедуру, сделайте следующее.
Рис. 4.6. Всего одна строка кода процедуры - в результате симпатичное окно сообщения! Сохранение изменений в модулеЧтобы сохранить новую процедуру, надо сохранить рабочую книгу, где находится эта процедура. Можно сохранить рабочую книгу из редактора Visual Basic. Для этого выполните следующие действия.
ПеременныеПеременная - это место хранения значений. Переменная содержит данные, которые могут быть разными в различные моменты выполнения приложения и могут изменяться во время выполнения приложения. Для иллюстрации "полезности" переменных напишем простую процедуру.
Не беспокойтесь о синтаксисе оператора InputBox. Более подробно этот оператор будет рассмотрен в 6-м часе "Логика условных операторов".
Где теперь ваше имя? Как найти и сохранить то, что пользователь ввел с помощью окна ввода? Вот для того и необходима переменная, чтобы сохранить все, что введет пользователь. Типы данныхПервый шаг на пути использования переменных заключается в изучении типов данных. Тип данных переменной показывает, данные какого типа позволяет сохранять переменная. В табл. 4.1 приведен список типов данных, поддерживаемых VBA. В этой таблице также содержится информация о размере данных, т.е. об объеме памяти, выделяемом для хранения данных определенного типа. Таблица 4.1. Типы данных VBA
Отметим, что хороший программист всегда выбирает тип данных по возможности наименьшего размера. Например, если надо сохранить небольшое целое число, такое как число студентов в академической группе, то рационально выбрать тип Byte. Интересно, почему в этой ситуации Excel по умолчанию использует расточительный тип Single? Объявление переменныхТеперь, когда вы знакомы с типами данных, которые могут принимать переменные, можно приступать к созданию переменных. Для этого используется оператор Dim. Создание переменной называется объявлением переменной (declaring variable). Оператор Dim имеет следующий синтаксис:
Здесь имяпеременной обозначает имя создаваемой переменной. Правила именования переменных совпадают с правилами задания имен процедурам, типданных - один из типов данных, приведенных в табл. 4.1. Имя переменной должно начинаться с буквы и может содержать буквы, цифры и другие символы. Имя не может содержать пробелы, точки, запятые, восклицательные знаки (!) и символы @, &, $, #. Имя должно состоять не более чем из 255 символов. Следующий пример продемонстрирует использование переменных в программировании на VBA. Мы продолжим написание процедуры, которая запрашивает имя пользователя, а затем использует его в окне сообщения. Выполните следующие действия.
Полный код процедуры должен иметь следующий вид
Отступы и пустые строки в тексте процедуры не обязательны, но желательны, так как облегчают чтение кода.
Рис. 4.7. Теперь переменная сохранит введенное имя
Рис. 4.8. Окно сообщения использует значение переменной, содержащей ваше имя Вы не обязаны указывать тип данных в операторе Dim. Если не указан тип данных, то по умолчанию VBA применит тип Variant. Обычная реакция на такое сообщение: "Здорово! Пусть VBA делает всю работу - я могу не беспокоиться о типе данных". Большое заблуждение! Вы должны определять типы данных. И для этого существует много причин. Первая очевидная причина заключается в расточительстве ресурсов памяти данными типа Variant. Ни один тип данных не требует 16 или 22 байт для сохранения значений переменной - убедитесь в этом, просмотрев табл. 4.1. Другая, не совсем очевидная, но не менее важная, причина состоит в том, что VBA по-разному обрабатывает данные разных типов. Поэтому, не объявляя тип данных, вы можете получить результат, отличающийся от ожидаемого. Кроме того, в добавок к сказанному, время выполнения процедур VBA также зависит от объявленных (или необъявленных) типов данных. В качестве значимости объявления типов данных я часто привожу своим студентам следующий наглядный пример.
Так как для переменных не объявлен тип данных, то все они по умолчанию имеют тип Variant.
Соглашения об именах переменныхВ 3-м часе "Работа с элементами управления" вы познакомились с соглашениями, применяемыми к именам элементов управления. Многие разработчики придерживаются аналогичных соглашений для имен переменных. В табл. 4.2 представлены рекомендуемые префиксы для имен переменных. Таблица 4.2. Префиксы для имен переменных
Листинг 4.3 показывает примеры объявления переменных различных типов. Обратите внимание на объявление строковых переменных - если вам известно максимальное число символов в строке, то это число можно указать в объявлении переменной. В листинге 4.3 присутствуют строки, которые начинаются с одинарной кавычки ('). Это строки комментариев, которые используются для пояснения кода процедур. При выполнении процедур комментарии игнорируются. Листинг 4.3. Объявления переменных
Вы видите в этом листинге имена переменных различных типов. Большинство имен имеет префикс, записанный в нижнем регистре. Само имя переменной может состоять из букв как в верхнем, так и в нижнем регистрах. МассивыЕсли вы работали с другими языками программирования, то, вероятно, знакомы с массивами. Массив - это совокупность переменных, имеющих одинаковый тип данных и объединенных под общим именем. Элементы массива идентифицируются порядковым номером. Синтаксис объявления массива следующий:
где n - количество элементов в массиве Например, если вы хотите создать массив, содержащий имена 10-ти студентов, используйте следующий оператор:
Отметьте, что в скобке стоит число 9, а не 10. Это потому, что первый порядковый номер в перечислении элементов массива по умолчанию равен 0. Массивы эффективно применять при работе с однотипной информацией. Предположим, вам надо обработать 15 тестовых оценок. Для этого можно создать 15 переменных с помощью 15 операторов Dim. Но можно создать массив, содержащий все тестовые оценки, и использовать при этом только один оператор Dim:
В основном вы будете использовать одномерные массивы, подобные приведенным выше, но VBA поддерживает и многомерные массивы. Двумерный массив, например, по своей структуре напоминает обычную таблицу. Чтобы создать двумерный массив-таблицу размером 4×4, примените следующий оператор:
Существует возможность при объявлении массива не указывать его размер. Это позволяет задать размер массива после начала выполнения программы. Например, ваше приложение позволяет пользователю создавать собственные таблицы, предлагая ввести количество столбцов и строк для новой таблицы. Применив динамически изменяемый массив, вы не только создадите такую таблицу, но и позволите пользователю добавлять или удалять строки и столбцы в этой таблице в процессе выполнения приложения. Если при объявлении массива не указаны его размеры, то такой массив называется динамическим. Синтаксис объявления динамического массива имеет следующий вид:
Для задания размера динамического массива во время выполнения приложения используется оператор ReDim:
Аргумент размер задает новый размер массива. Для того чтобы не потерять текущее содержимое массива при задании его нового размера, в операторе ReDim используется ключевое слово Preserve:
Присвоение значений переменнымПосле объявления переменных им можно присвоить значения. В листинге 4.4 показаны примеры операторов присвоения. Отметим использование порядковых номеров при присвоении значений элементам массива. Листинг 4.4. Присвоение значений переменным
Использование константКак вы знаете, переменные используются для хранения данных, которые могут изменяться в процессе выполнения процедуры. Если надо хранить постоянную статическую информацию, не изменяющуюся при выполнении процедуры, то применяются константы. Для объявления констант и их значений используется оператор Const, имеющий следующий синтаксис:
При объявлении констант используются те же типы данных, что и при объявлении переменных. Обычно имена констант записываются прописными буквами, что позволяет легко отличать имена переменных от имен констант. Пример объявления константы:
Область видимости переменных и константДо сих пор мы изучали, как объявлять переменные и константы, но не говорили о том, где их объявлять. Их можно объявить в двух местах: внутри процедуры и в верхней части модуля, которая называется областью общих объявлений. Область объявления переменных определяет область их видимости (scope). Если переменные объявлены в процедуре, то только эта процедура их видит и знает. Другие процедуры не могут использовать эти переменные и их значения. Такие переменные называются локальными, так как они определены (локализованы) в конкретной процедуре. В этом случае также говорят, что переменные видимы на уровне процедуры. Что нужно сделать, чтобы значения определенных переменных и констант были доступны всем процедурам данного модуля? Для этого надо их объявлять в области общих объявлений модуля. Тогда все процедуры, определенные в данном модуле, могут использовать эти переменные и константы. Такие переменные и константы видимы на уровне модуля. Концепция видимости также применима и к процедурам. Существует еще третий уровень видимости, который называется глобальным (public). Переменные и константы этого уровня видимости можно использовать в любой процедуре любого модуля вашего приложения. Применение глобальных переменных очень эффективно во многих практических ситуациях, но необходимо знать, что они находятся в памяти компьютера все время выполнения приложения и, следовательно, потребляют системные ресурсы. Для создания глобальных переменных используется оператор Public, который имеет следующий синтаксис:
Для объявления глобальной константы применяется оператор вида
Глобальные переменные и константы следует объявлять в верхней части модуля в области общих объявлений. РезюмеВ этом часе основное внимание было уделено использованию и созданию переменных и констант. Была показана необходимость правильного определения типа данных. В заключение часа кратко рассмотрено такое важное понятие, как область видимости переменных и констант. Вопросы и ответыВопрос. Где надо определить переменную, чтобы можно было бы воспользоваться ею не только в текущей процедуре? Ответ. Такую глобальную переменную надо объявить в области общих объявлений модуля. Как объявить - зависит от расположения ваших процедур. Если все процедуры находятся в одном модуле, то можно использовать оператор Dim. Если процедуры локализованы в нескольких модулях, следует воспользоваться оператором Public. Вопрос. Модули хранятся отдельно от рабочих книг? Ответ. Нет, модули являются частью рабочих книг. При сохранении рабочих книг сохраняются все изменения, сделанные в модуле. Вопрос. Почему нельзя объявить все переменные как Variant? Ответ. Можно, но следует помнить, что переменные этого типа потребляют много системных ресурсов, кроме того, неправильное применение этого типа данных может негативно сказаться на производительности вашего приложения. ПрактикумС помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении. Тесты
УпражнениеСоздайте новую процедуру с именем ПеремИКонст. Создайте переменную с именем sTest типа String. Создайте константу с именем iNumber типа Integer и положите ее равной 2. Установите значение переменной sTest как “Это простой тест”. Добавьте в процедуру следующие две строчки кода, чтобы вывести на экран значения переменной sTest и константы iNumber:
Выполните процедуру. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[an error occurred while processing this directive] |