Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по технологической практике.doc
Скачиваний:
3
Добавлен:
01.09.2019
Размер:
2.09 Mб
Скачать

3 Элементы языка vba

Знание объектной модели, как было написано выше, раскрывает неограниченные возможности по манипулированию над программой, однако, без знания элементов языка VBA невозможно реализация алгоритмов работы с этими объектами. Язык VBA поддерживает множество популярных конструкций, таких как циклы for, do-while, do-until, переход по меткам, простые и сложные условные операторы и многое другое.

3.1 История VBA

VBA – это стандартный язык написания сценариев для приложений Microsoft, в настоящее время он входит во все приложения пакета MS Office, и даже в приложения других компаний.

VB (Visual Basic) – это продукт компании Microsoft, который выпущен с целью облегчения массовой разработки приложений для Windows. Первая версия выпущена в 1991 году. Visual Basic имеет немного общего с ранними версиями BASIC, но последний представляет собой основу, на которой построен VBA.

До появления VB, многие опытные программисты не воспринимали идею программирования на BASIC всерьез. Само название предполагает, что это не профессиональный язык. Действительно, BASIC был разраотан в начале 1960-х годов и задумывался как наглядное средство преподавания методов программирования студентам колледжей. BASIC довольно быстро приобрел большую популярность, и сейчас он поддерживается многими типами компьютеров.

Как было описано выше – VBA поддерживает множество конструкций – от современных вариантов циклов For, до старых, ассемблерных инструкций GoTo.

3.2 Комментарии

Комментарий – это описательный текст, который включается в код. VBA полностью игнорирует текст комментария. Комментарии можно использовать самым произвольным образом для описаний действий в коде (предназначение оператора не всегда очевидно, например).

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

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

3.3 Типы данных

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

В таблице 3.1 перечислены поддерживаемые в VBA типы данных.

Таблица 3.1 – встроенные типы данных VBA

Тип данных

Резервируется байт

Диапазон значений

Byte

1 байт

От 0 до 255

Boolean

2 байта

True (Истина) или False(Ложь)

Integer

2 байта

От -32768 до 32767

Long

4 байта

От -2147483648 до 2147483647

Single

4 байта

От -3,402823Е38 до -1,4011298Е-45 (для отрицательных значений); от 1,401298Е-45 до 3,402823Е38 (для положительных значений)

Double

8 байт

От –1,79769313486232Е308 до

–4,94065645841247Е-324 (отрицательные числа);

от 4,94065645841247Е-324 до

1,79769313486232Е308 (положительные числа)

Currency

8 байт

От –922337203685477,5808 до

922337203685477,5807

Таблица 2.1 – встроенные типы данных VBA (продолжение)

Тип данных

Резервируется байт

Диапазон значений

Decimal

14 байт

+/–79228162514264337593543950335 без десятичных знаков;

+/–7,9228162514264337593543950335

с 28-ю знаками после запятой

Date

8 байт

С 1 января 100 года до 31 декабря 9999 года

Object

4 байта

Любая ссылка на объект

String (переменной длины)

10 байт + длина строки

От 0 до ~ 2млрд.

String (фиксированной длины)

Длина строки

От 1 до ~65400

Variant (числа)

16 байт

Любое числовое значение в рамках диапазона данных Double

Variant (символы)

22 байта + длина строки

От 0 до ~ 2 млрд.

Пользовательский

Зависит от типа

Зависит от элемента

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

Если тип данных, для переменной, не объявлен в процедуре VBA, по умолчанию будет задан тип данных Variant. Данные с типом Variant имеют только одно, заслуживающее внимания, свойство: они изменяют свой тип, в зависимости от того, какие операции над ними выполняются. Однако, зачастую, результат операций над переменными типа Variant не оправдывают ожидания. Например, если в переменную записать числовую строку, а затем суммировать саму с собой, то в результате будет не сумма, и тип данных – число, а объединение двух строк.

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

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

Более того, явное объявление переменной в начале процедуры облегчает понимание алгоритма программы, и использование переменных фиксированного типа, увеличивает быстродействие программы в два раза.

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

3.4 Переменные

Главное предназначение VBA – обработка данных. Некоторые данные сохраняются в объектах, например, диапазонах рабочих листов. Другие данные хранятся в созданных переменных.

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

3.4.1 Правила именования переменных

VBA поддерживает несколько правил, которые ограничивают пользователя в именовании переменных:

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

- VBA не различает регистры;

- нельзя использовать в именах пробелы или точки;

- специальные символы объявления типов (#,$,%,& или !) также не применяются в имени переменной;

- названия переменных ограничены длиной 254 символов.

3.4.2 Объявление переменных

Наиболее популярный способ объявить локальную переменную – вставить оператор Dim. Между операторами Sub и End Sub. Операторы Dim обычно вводятся непосредственно после оператора Sub, перед кодом процедуры.

Ключевое слово Dim в BASIC использовалось исключительно для объявления размерности массива (от слова Dimension – Размерность). В VBA ключевое слово Dim применяется для объявления любой переменной, а не только массивов.

Синтаксис оператора Dim приведен ниже(В удобочитаемом виде. Переменные объявляются в одну строку):

Dim <переменная_1> [As <тип_данных]

[,<переменная_2> [As <тип_данных]]

[…., <переменная_n> [As <тип_данных] ]

Если часть As опущена, то переменная имеет тип данных Variant.

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

3.4.3 Область действия переменных

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

- отдельная процедура (В процедуру включается оператор Dim или Static);

- отдельный модуль (Перед первой процедурой в модуле вводится оператор Dim или Private);

- все модули (Перед первой процедурой в модуле вводится оператор Public).

3.5 Константы

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

3.5.1 Объявление констант

Константы объявляются с помощью оператора Const, аналогично объявлению с помощью оператора Dim (В удобочитаемом виде. Переменные объявляются в одну строку):

Const <переменная_1> [As <тип_данных] = <значение>

[,<переменная_2> [As <тип_данных] = <значение> ]

[…., <переменная_n> [As <тип_данных] = <значение>]

Если объявить константу в начале модуля – она будет видима во всех процедурах модуля. Если же объявить внутри процедуры или функции – то в других процедурах эта константа не будет видна.

3.6 Массивы

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

3.6.1 Объявление массивов

Массив, как и обычные переменные, объявляются с помощью операторов Dim или Public. Кроме того, можно определить количество элементов в массиве. Синтаксис объявления одного массива выглядит следующим образом:

Dim <имя_массива> ([[нижний_предел To] <верхний_предел>] ) [As <тип_данных>]

Нумерация элементов в массиве начинается с нуля, однако, это можно изменить, с помощью инструкции:

Option Base <начало_нумерации_массива>

3.6.2 Объявление многомерных массивов

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

Dim <имя_массива> ([измерение_1][,измерение_2][…][,измерение_60]) [As <тип_данных>]

Где измерение объявляется так:

[[<нижний_предел> To] <верхний_предел>]

Для обращения к элементу массива, достаточно указать номер элемента в скобках:

<имя_массива> (<номер_измерение_1>[,…][,номер_измерение_60])

Например:

MyArray(3,4)

3.6.3 Динамический массив

Динамический массив не имеет предопределенного количества элементов. Динамический массив объявляется с незаполненными значениями в скобках:

Dim <имя_массива> () [As Тип_данных]

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

3.6.4 Переменные объектов

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

- значительно упрощают программу;

- ускоряют выполнение программы.

Переменные объектов, как и обычные переменные, объявляются с помощью оператора Dim или Public, но для работы с этой переменной, необходимо связать ее с объектом, с помощью оператора Set:

Set <имя_переменной> = <объект>

3.6.5 Пользовательские типы данных

VBA позволяет создавать специальные, или пользовательские, типы данных. Определенный пользователем тип данных может облегчить управление некоторыми типами данных. Для описания пользовательского типа данных используется ключевое слово Type в начале модуля:

Type <имя_типа_данных>

<переменная_1> [As <тип_данных>]

[, <переменная_2> [As <тип_данных>] ]

[,…]

[,<переменная_n> [As <тип_данных>]

End Type

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

3.6.6 Управление объектами и коллекциями

VBA предлагает две конструкции, которые упрощают управление объектами и коллекциями:

- конструкция With-End With;

- конструкция For Each-Next.

Ниже будут рассмотрены эти конструкции.

3.6.6.1 Конструкция With-End With

Конструкция With-End With позволяет выполнять несколько операций над одним объектом. Эта конструкция позволяет удерживать ссылку на объект, чтоб упростить расшифровку ссылок. Например:

With Range(“A1:B10”).Font

.Name = “Times New Roman”

.Size = 12

.Bold = True

End With

Вышеприведенный код работает с шрифтом диапазона ячеек «А1:B10», и вместо того, чтоб три(три обращения к свойствам, в коде) раза расшифровать одну и ту же ссылку Range(“”A1:B10”).Font, With захватывает эту ссылку, и расшифровывает только ту часть, которая находится между With и End With, что значительно ускоряет время работы программы.

3.6.6.2 Конструкция For Each-Next

Как было описано выше, коллекция – это группа однородных объектов. Конструкция For Each-Next инкапсулирует цикл обращений к объектам коллекций (т.е. можно было бы работать с коллекцией, с помощью любого цикла и итератора, который стремился бы к значению, которое обозначает количество объектов в коллекции).

Синтаксис конструкции For Each-Next приведен ниже:

For Each-Next <Элемент> In <коллекция>

[инструкции]

Next [Элемент]

3.6.7 Контроль над выполнением кода

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

- операторы GoTo;

- конструкции If-Then;

- конструкции Select-Case;

- циклы For-Next;

- циклы Do While;

- циклы Do Until.

3.6.7.1 Операторы GoTo

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

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

Синтаксис оператора GoTo выглядит следующим образом:

GoTo <Метка>

Например:

Цикл: i =i+1

If (i<7)Then GoTo Цикл End If

3.6.7.2 Конструкция If-Then

Данная конструкция позволяет процедуре принимать логические решения, или, выполнять определенные инструкции, в зависимости от условий. Синтаксис конструкции таков:

If <условия> Then <инструкции_истина> [Else инструкции_ложь]

Если условие истинно, то выполняются инструкции после ключевого слова Then, иначе – либо выполняются инструкции после слова Else, а в случае отсутствия оного – программа выходит из конструкции If-Then

3.6.7.3 Конструкция Select Case

Конструкция Select Case применяется при выборе между тремя или более вариантами. Она справедлива также для двух вариантов, и является хорошей альтернативой структуре If-Then-Else. Конструкция Select Case обладает следующим синтаксисом:

Select Case <тестируемое_выражение>

[Case <список_условий>

[операторы]]

[Case Else

[операторы_по_умолчанию]]

End Select

3.6.8 Циклическая обработка инструкций

Цикл – это процесс повторения набора инструкций. В первом языке программирования – Ассемблере, циклы конструировались с помощью условных операторов, меток, и оператора GoTo. Однако от этой концепции быстро отказались, так как использование оператора GoTo делает программу невозможной для понимания. Как было описано выше, VBA поддерживает как старые, так и современные конструкции. GoTo относится к старым конструкциям, унаследованным от BASIC. Для построения циклов в VBA используются следующие конструкции:

- циклы for-next;

- циклы do while;

- циклы do until.

Все циклы имеют общую черту – для досрочного завершения цикла используется оператор Exit, с указанием имени цикла: для for-next – exit for, для do while или do until - end do.

Далее будут рассмотрены эти конструкции.

3.6.8.1 Циклы for-next

Оператор for–next является самым простым способом задания цикла. Однако, если итератор цикла изменять в теле цикла, то могут произойти непредвиденные последствия.

Этот оператор имеет следующий синтаксис:

For <счетчик> = <начало> To <конец> [Step <шаг>]

[инструкции]

Next [счетчик]

3.6.8.2 Циклы do while и do until

Do while является классической циклической структурой. В отличие от цикла For-Next, цикл Do While выполняется до тех пор, пока удовлетворяется заданное условие, цикл Do While может иметь один из двух синтаксисов:

Цикл с предусловием

Do [While <Условие>]

[инструкции]

Loop

Или с постусловием

Do

[инструкции]

Loop [While <Условие>]

Разница между Do While и Do Until заключается в условиях продолжения цикла: в цикл Do While прерывается, когда условие становится ложным, а Do Until прерывается, когда условие становится истинным (то есть выполняется, пока условие не станет выполняться).

Разница между цикла с предусловием и с постусловием заключается в моменте проверки истинности выражения: в циклах с предусловием сначала проверяется условие, затем выполняется тело цикла, а в постусловии – наоборот, сначала выполняется условие, затем проверяется выражение.

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

3.6.9 Процедуры и функции

Процедура – это последовательность операторов VBA, расположенная в модуле VBA, к которому можно получить доступ, с помощью VBE. Модуль может включать любое количество процедур.

Существует несколько способов вызвать, или выполнить, процедуры. Процедура выполняется от начала до конца (однако, выполнение процедуры можно прервать, с помощью оператора Exit).

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

Всё, что сказано ниже для процедур, справедливо для функций, с той разницей, что процедура определяется ключевым словом Sub, а функция – Function.

Функции способны вернуть некое значение в процедуру, откуда функция была вызвана. Так же, функция может быть использована в ячейке, после знака =. Например «=MyFun()» справедливо для содержимого ячейки, если функция MyFun есть в модуле и она имеет доступ Public.

3.6.9.1 Объявление процедуры

При объявлении процедуры, с использованием ключевого слова Sub, необходимо придерживаться следующего синтаксиса:

[Private | Public ] [Static] Sub <имя_процедуры> ([список_аргументов])

[инструкции]

End Sub

Процедуры могут обладать разными областями видимости:

- private – указывает на то, что процедура доступна из других процедур, но в пределах модуля;

- public – указывает на то, что процедура доступна для всех остальных модулей.