Программирование VBA. Федеральное агентство по образованию государственное образовательное учреждение высшего профессионального образования
Скачать 2.93 Mb.
|
2.2. Переменные Переменные предназначены для хранения данных в оперативной памяти. В программе перед использованием переменные нужно объяв- лять. При объявлении переменной надо задаётся её имя и тип. Тип ука- зывает способ представления переменной. В переменных можно хранить 11 практически любые типы данных: числа, строк текста, экземпляры объ- ектов, элементы управления и т.д. В VBA различают две группы типов данных: основные, называемые иногда базовыми или встроенными, и ти- пы данных, определяемые пользователем. Базовые типы переменных Visual Basic Тип Хранимая информация Занимае- мая память Интервалы значений Целочисленные типы Byte Целые числа 1 байт от 0 до 255 Boolean Логические зна- чения 2 байта True (Истина) или False (ложно) Integer Целые числа 2 байта от -32768 до 32767 Long Integer Длинные целые числа 4 байта +/-2.1E9 Типы с плавающей точкой Single Вещественные числа одинарной точности с пла- вающей точкой 4 байта от -3.402823Е38 до - 1.401298Е-45 для отрица- тельных чисел и от 1.401298Е-45 до 3.402823Е38 для положи- тельных Double Вещественные числа двойной точности с пла- вающей точкой 8 байт от -1.7976313486232Е308 до -4.94065645841247Е- 324 для отрицательных чисел и от 4.94065645841247Е-324 до 1.7976313486232Е308 для положительных Строковые типы String (стро- ка фиксиро- ванной дли- ны) Текстовая информация (строка) 1 байт на каждый символ От 1 до 65400 String (стро- ка перемен- ной длины длины) Текстовая информация (строка) 10 байт + 1 байт на каждый символ От 0 до двух миллиардов символов Объектные типы Object Рисунок или ссылка на любой другой объект 4 байта Ссылка на объект Типы Variant 12 Variant Значения любого из перечислен- ных типов данных 16 байт для чисел, 22 байта + 1 байт на каждый символ для строк Любое числовое или стро- ковое значение Прочие типы Currency Числа, имеющие до 15 цифр до десятичной точки и 4 цифры после нее (денежные единицы) 8 байт от -922337203685477.5808 до 922337203685477.5808 Date Информация о дате и времени 8 байт от 1 января 100 г. до 31-го декабря 9999 г. Decimal Десятичное чис- ло 14 байт Целое – 29 знаков Вещественное – 27 знаков после запятой Объявление переменных может быть явным или неявным. Явное объявление Для явного определения переменных существуют разные способы. Как правило, программисты предпочитают использовать следующий синтак- сис: [Static|Public|Private] Dim <ИмяПеременной> [As <тип>] [,<ИмяПеременной>[As <тип>]]… Здесь: Dim – ключевое слово, которое означает, что объявляется пере- менная и резервируется область памяти для ее хранения; ИмяПеременной – имя переменной (идентификатор); As (Как) – ключевое слово, которое определяет тип данных для переменной; Тип – тип данных для объявляемой переменной; Private (Частный), Public (Общий) – ключевые слова, определяю- щие область видимости переменной; Static (Статический)- ключевое слово, которое определяет, сохра- няет ли переменная свое значение при завершении процедуры и выходе из неё. Примеры инструкций объявления переменных Dim Товар As String*15 Dim Цена As Currency 13 Dim Количество As Byte, Вес As Single При вводе кода программы с клавиатуры среда программирования оказывает помощь пользователю – после набора ключевого слова As и пробела раскрывается список, в котором наряду с другими типами объек- тов указаны базовые типы переменных: Тип переменной можно установить, щелкнув дважды по имени типа в этом списке. Неявное объявление В этом способе определения переменных никакие инструкции для объяв- ления переменной вообще не используются. Когда транслятор VBA пер- вый раз встречает в коде программы необъявленную переменную, то он назначает ей тип Variant, и переменная может принимать значение любого типа. Следовательно, в программе VBA, в принципе, можно вообще не ис- пользовать инструкцию Dim. Тем не менее использование типа Variant ре- комендуется использовать только в следующих случаях: для ускорения процесса отладки программы; пользователь не уверен, какой тип данных обрабатывается инст- рукцией в конкретной ситуации. Явное объявление переменных позволяет: увеличить скорость решения задачи; оптимизировать распределение памяти для переменных; документировать переменные и избежать ошибок при использова- нии одной переменной в принципиально различных ситуациях. Для того чтобы избежать неприятностей в случае ошибочной запи- си имени переменной, необходимо в общей области программного модуля помещать оператор Option Explicit. В этом случае Visual Basic будет рас- ценивать любую неявно объявленную переменную как ошибочную. 2.3. Константы Константа по определению является постоянной величиной и по- этому не меняет своего значения при выполнении программы. Константы в VBA подразделяются на константы, определяемые пользователем, и встроенные константы. Встроенная константа должна объявляться; при этом используется оператор Const, аналогичный оператору Dim: Const <ИмяКонстанты> [As <ТипДанных>] = <Выражение> 14 где <Выражение> – это любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы. Пример Const ПИ As Single = 3,14 Встроенные константы используются обычно при работе с объ- ектами приложения. Эти константы не требуют предварительного объяв- ления. Имена встроенных констант начинаются с префикса, который ука- зывает, к объекту какого приложения Microsoft Office они относятся. На- пример, встроенные константы объектов Excel имеют префикс xl, встроен- ные константы языка VBA имеют префикс vb и т.д. Например, встроенные константы vbYes и vbNo используются в функции MsgBox, предназначен- ной для вывода данных на экран. Операторы объявления переменных и констант можно размещать в любом месте программного кода, но обязательно до первого оператора, в котором переменная или пользовательская константа применяется. Хо- роший стиль программирования предполагает, что объявление перемен- ных и констант осуществляется в начале процедуры. 2.4. Строковые переменные Различают строки переменной и фиксированной длины. Строки пе- ременной длины могут содержать до двух миллиардов символов; их раз- мер заранее не определяется. Когда такой переменной присваивается значение, то размер переменной изменяется так, чтобы он соответствовал длине присвоенного строкового значения. Строка фиксированной длины – это строка постоянного размера, указанного при объявлении переменной. Если такой строке присваивается значение более длинное, то лишние символы отбрасываются. Если значе- ние, которое присваивается, короче, то остающееся место заполняется пробелами. Строковые переменные фиксированной длины должны объяв- ляться явно. Синтаксис объявления строковой переменной следующий: Dim VarName As String [ * ДлинаСтроки] где ДлинаСтроки – целочисленная переменная или константа, содержа- щая число, которое указывает длину строковой переменной. Например: Dim strMyName As String* 20 Объявляется строковая переменная фиксированной длины в 20 символов Dim intLen As Integer Intlen = 10 Dim MyName As String * Intlen Объявляется строковая переменная длиной в 10 символов. 15 2.5. Массивы представляет собой структуру, все элементы которой имеют одинако- вый тип. Массивы могут быть одномерными и многомерными. Так, для отображения отдельного столбца или отдельной строки таблицы, содер- жащей данные одинакового типа, может быть использован одномерный массив, для отображения таблицы – двумерный, а для отображения сово- купности таблиц – трёхмерный массив. Количество размерностей массива может достигать 60. В VBA массив объявляется следующим образом: [Public | Private] Dim ИмяМассива([Индексы]) [As ТипДанных] где ИмяМассива – идентификатор, определяющий имя массива; Индекс – значение номера элемента в размерности массива, зада- ваемого одним из двух способов: 1. указанием номера последнего элемента в каждой размерно- сти массива; 2. указанием номеров первого и последнего элемента в каждой размерности массива. Примечание Номера элементов (индексы) должны быть указаны целым числом. При использовании первого метода первому элементу по умолча- нию присваивается номер “ноль”. Например, объявление одномерного массива Товар из трёх элементов, каждый из которых состоит не более чем из 15 символов, по умолчанию выглядит следующим образом: Dim Товар(2) As String*15 Для обращения к элементам массива необходимо поместить в круглых скобках за идентификатором массива целочисленное выражение, например, Товар(0), Товар(К*2) – для одномерного массива и Продажи(I,L), Продажи(3,4) ) – для двумерного массива; величины I, K, L должны быть целыми. В приведённой ниже процедуре ОбъявлениеМассива1 Sub ОбъявлениеМассива1() Dim Товар(2) As String*15 Товар(0) = "Стул мягкий" MsgBox Товар(0) End Sub выражения Товар(0), Товар(1), Товар(2) являются элементами массива; инструкция Товар(0) = "Стул мягкий" присваивает первому элемен- ту массива Товар значение текстовой константы "Стул мягкий"; функция MsgBox Товар(0) выводит значение этого элемента на эк- ран: 16 Примечание Инструкция присваивания и функция MsgBox будут подробно рас- смотрены ниже. Для изменения начала нумерации индексов массива можно посту- пить одним из следующих способов. 1. Использовать инструкцию Option Base 1. При этом инструк- ция Option Base 1 должна находиться в самом начале модуля VBA, перед первой процедурой модуля, например, Option Base 1 Sub ОбъявлениеМассива2() ' Dim Товар(3) As String * 15 Товар(1) = "Стул мягкий" MsgBox Товар(1) ' End Sub По умолчанию инструкция Option Base имеет значение 0 (ноль). 2. Выполнить явное указание номера первого элемента в каждой размерности массива, например, Sub ОбъявлениеМассива3() ' Dim Товар(1 To 3) As String * 15 Товар(1) = "Стул мягкий" MsgBox Товар(1) ' End Sub При объявлении многомерного массива в поле индекса указывает- ся несколько индексов, в соответствии с размерностью массива: номер по- следней строки, номер последнего столбца и номер последней таблицы – для трёхмерного массива. Например, двумерный массив из пяти строк и десяти столбцов объявляется без использования инструкции Option Base 1 одним из следующих способов: Dim Продажи(4,9) As String или Dim Продажи(0 To 4,0 To 9) As String 17 Примечания 1. Наличие инструкции Option Base 1 не влияет на индексацию эле- ментов массива, если в его объявлении используется конструкция <нижняя граница> To <верхняя граница> Массив Продажи можно объявить так: Dim Продажи(1 To 5, 1 To 10) As String 2. Элементы массива Продажи имеют тип строковая переменная неопределённой длины. Выше рассмотрено объявление массивов, связанных с обработкой только статических данных, т.е.таких, память под которые выделяется во время компиляции и сохраняется в течение всей работы программы. В VBA существует другой способ выделения памяти под массивы, ко- торый называется динамическим, в котором память под массивы отводит- ся и может быть перераспределена во время выполнения программы. Та- кие массивы называются динамическими. Использование динамических величин предоставляет возможность подключать память динамически, что позволяет: увеличить объем обрабатываемых данных; если потребность в каких-то данных отпала до окончания про- граммы, то занятую ими память можно освободить для другой ин- формации; определять динамически изменяющееся количество реально су- ществующих элементов массива. Динамический массив объявляется следующим образом: [Public | Private] Dim ИмяМассива() [As ТипДанных] т.е. размерность динамического массива в его объявлении не указывает- ся. Пример Dim Товар() As String * 15 Перед использованием динамического массива необходимо переопреде- лить его размеры. Это выполняется при помощи инструкции ReDim, ис- пользуемой на уровне процедуры: ReDim [Preserve] ИмяМассива(Индексы) [As ТипДанных] Параметр Preserve используется для сохранения данных в сущест- вующем массиве при изменении размерности. В противном случае все старые значения элементов массива будут удалены. Однако если новый размер массива меньше, чем количество помещенных в него элементов, часть данных будет потеряна. Примеры ReDim Товар(1 To 3) As String * 15 ReDim Preserve Товар(1 To 10) As String * 15 18 При использовании параметра Preserve можно изменить размер только последней размерности, а количество размерностей изменить нельзя. Массивы типа Variant можно создавать и заполнять одновременно при помощи встроенной функции Array(<СписокЗначений>), например: Dim Товар As Variant Товар = Array(“Стул”, “Стол”, “Шкаф”) Освободить память, занимаемую элементами динамического массива, и повторно инициализировать элементы массива фиксированной дли- ны можно инструкцией Erase: Erase СписокМассивов Здесь СписокМассивов – один массив или список разделенных запя- тыми массивов. Инициализация элементов массива фиксированной длины осуществляется следующим образом: Тип массива Действие инструкции Erase Фиксированный числовой массив Устанавливает каждый элемент в нуль Фиксированный массив строк (переменной длины) Устанавливает каждый элемент на нулевую длину строки ("") Фиксированный массив строк (фиксированной длины) Устанавливает каждый элемент в нуль Фиксированный массив типа Variant Устанавливает каждый элемент в Empty Массив данных определенных пользователем типов Устанавливает каждый элемент, как будто это отдельная переменная Массив объектов Устанавливает каждый элемент в величину Nothing Если количество элементов в динамическом массиве не известно, то для его определения используется функция UBound (ИмяМассива [, Измерение]) Необязательный параметр Измерение имеет тип Variant или Long. Это целое число, указывающее размерность, для которой определяется верхняя граница индекса. Для первой размерности используется число 1, для второй – 2 и т.д. если аргумент не указывается, по умолчанию используется значение 1. Пример Dim Товар(1 To 3) As String * 15 L=UBound (Товар) Переменная L получит значение 3. Функция UBound обычно используется с функцией LBound для опре- деления размера массива, позволяющей найти наименьшее значение ин- декса указанной размерности. Формат функции: LBound (ИмяМассива [, Измерение]) 19 В объектных моделях приложений Office наряду с массивами исполь- зуются коллекции. Коллекции – это специальные объекты, которые пред- назначены для хранения наборов одинаковых элементов. Коллекции обычно удобнее, чем массивы; они изначально безразмерны и в них пре- дусмотрен стандартный набор свойств и методов. 2.6. Пользовательские типы данных VBA позволяет создавать структурные, так называемые пользова- тельские типы данных, аналогичные записям языка Pascal или языков PL/1 и COBOL. Например, если нужно обрабатывать сведения о результа- тах экзаменационной сессии, то можно создать пользовательский тип дан- ных с названием Успеваемость. Type Успеваемость ФИО As String * 20 №_Зач_кн As String * 8 Дисциплина As String * 20 Оценка As String * 20 End Type Примечание1 Пользовательский тип данных определяется вверху модуля, в процедуре которой он используется, перед началом введения кода процедуры. Если пользовательский тип данных создан, то для объявления пере- менной этого типа следует применить инструкцию Dim. Пример Sub Пользоват_Тип() Dim Студенты As Успеваемость Студенты.ФИО = InputBox("Введите ФИО") Студенты.№_Зач_кн = InputBox("№_Зач_кн") Студенты.Дисциплина = InputBox("Дисциплина") Студенты.Оценка = InputBox("Оценка") MsgBox Студенты.ФИО & Студенты.№_Зач_кн & _ Студенты.Дисциплина & Студенты.Оценка End Sub Примечание2 В инструкции Dim переменную можно объявить с тем же именем, какое определено в пользовательском типе данных. В этом случае приведённый выше пример будет иметь вид: Sub Пользоват_ТИП() Dim Успеваемость As Успеваемость Успеваемость.ФИО = InputBox("Введите ФИО") Успеваемость.№_Зач_кн = InputBox("№_Зач_кн") Успеваемость.Дисциплина = InputBox("Дисциплина") Успеваемость.Оценка = InputBox("Оценка") 20 MsgBox Успеваемость.ФИО & Успеваемость.№_Зач_кн & _ Успеваемость.Дисциплина & Успеваемость.Оценка End Sub Как правило, пользовательский тип данных определяется для масси- вов, например, так: Dim Студенты (1 to 40) As Успеваемость Все 40 элементов этого массива состоят из четырёх компонентов, как это указано в пользовательском типе данных Успеваемость. На конкрет- ный элемент массива, например, первый можно сослаться следующим об- разом. Студенты(1).ФИО = InputBox("Введите ФИО") Студенты(1). №_Зач_кн = InputBox("Введите №_Зач_кн") Студенты(1). Дисциплина = InputBox ("Введите Дисциплина") Студенты(1). Оценка= InputBox ("Введите Оценка") 2.7. Операции VBA В программах на VBA можно использовать стандартный набор опе- раций над данными. Имеются три основных типа операций: математические, отношения, логические. |