Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб раб 7

.pdf
Скачиваний:
6
Добавлен:
16.03.2016
Размер:
553.07 Кб
Скачать
обязательная инструкция

10 Если в процессе обработки изменяется копия, то сами значения,

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

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

Процедура-функция также представляет собой набор команд (операторов), различие состоит в том, что функция всегда возвращает значение, которое присваивается переменной – имени функции в теле функции. При описании функции можно указать тип возвращаемого значения.

Структура функции пользователя имеет вид:

Function <имя>([аргументы])[as <тип>] <инструкции>

<имя>=<выражение> end Function.

По аналогии с описанием переменных можно говорить об области действия (видимости, доступности) процедур и функций. Ключевые слова Sub и Function можно использовать с ключевыми словами Private, Public и Static:

Private Sub/ Function, Public Sub/ Function, Static Sub/ Function. Ключевое слово Private означает закрытую процедуру, то есть

возможен ее вызов из модуля, где она находится, и она доступна для других процедур того модуля, в котором описана. Ключевое слово Public означает открытую процедуру. Её вызов возможен из любой процедуры любого модуля в проекте. Ключевое слово Static означает, что переменные процедуры сохраняются в промежутках времени между вызовами этой процедуры.

Можно рекомендовать следующий порядок расположения инструкций в процедуре при решении любой задачи:

Sub <имя > () ‘заголовок процедуры <описание переменных> <подготовка рабочего листа> <ввод данных> <обработка данных>

<вывод результата на рабочий лист> <оформление рабочего листа>

end Sub.

11 Все инструкции (операторы процедуры) надо располагать так,

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

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

При написании кода процедуры несколько инструкций (команд) можно располагать на одной строке, разделяя их знаком двоеточие ž:¤. Для хорошего восприятия кода процедуры рекомендуется каждую инструкцию записывать отдельно в своей строке. Допускаются свободное использование пробелов. Если строка инструкции длинная и не умещается в одной строке в видимой части экрана, то ее можно продолжить на другой строке, используя знак подчеркивания ž_¤. Перед знаком подчеркивания и после него обязательно должен быть пробел.

1.4. Ввод и вывод данных

Ввод данных осуществляет встроенная функция InputBox() из библиотеки VBA или одноименная функция из библиотеки MS Excel, к которой надо обращаться в виде Application.InputBox().

Рассмотрим синтаксис функции, функция возвращает значение переменной:

<переменная > = InputBox(<сообщение>; <текст заголовка>; <значение по умолчанию>; <x>; <y>; <файл справки>; <номер темы>).

Функция InputBox() выводит диалоговое окно, в котором осуществляется ввод данных пользователем. Аргументы функции приведены в табл. 6.

Таблица 6 – Аргументы функции InputBox()

Аргумент

Описание

<сообщение>

Выводимое текстовое сообщение в диалоговом окне

<текст заголовка>

Заголовок окна , например, žввод данных¤

<значение по умолчанию>

Значение по умолчанию, выводимое в поле ввода, если

 

аргумент опущен, то поле пустое

<x>, <y>

Расстояние в пунктах по оси x и y левого угла по диагона-

 

ли окна

<файл справки>

Определяет имя файла справочной системы MS Excel, со-

 

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

 

СПРАВКА. Если аргумент указан, кнопка СПРАВКА по-

 

является в диалоговом окне

<номер темы>

Определяет номер темы – параграфа в файле справки; 6 и

 

7 аргументы используются вместе

12

При нажатии кнопки Оk в диалогом окне сообщения функции InputBox() в переменную возвращается введенное значение, имеющее тип žтекстовый¤ (String).

Функция из библиотеки MS Excel имеет вид :

< переменная> = Application.InputBox(<сообщение>; <текст заголовка>; <значение по умолчанию>; <x>; <y>; <файл справки>; <номер темы>; type).

Добавляется 9–й аргумент, который определяет тип вводимого значения:

type:= 1, возвращается число;

type:= 0, формула;

type:= 2, текст (используется по умолчанию);

type:= 8, ссылка;

type:= 16, значение žошибка¤;

type:= 32, массив значений.

Для вывода информации на экран используется функция (или процедура) MsgBox.

Синтаксис функции MsgBox() имеет вид:

<переменная> = MsgBox(<сообщение>; <кнопки>; <заголовок>, <файл справки>; <номер темы>).

В результате появляется диалоговое окно, в котором присутствуют указанные кнопки (2-й аргумент). Это числа или константы, соответствующие кнопкам (по умолчанию число):

0 – кнопка Оk, константа VbOk;

1 – кнопки ОkCancel, константа VbOkCancel;

4 – кнопки Yes/No, константа VbYes/No и др.

Здесь же можно задать вывод пиктограммы для сообщения (4 стандарта) и установить кнопку по умолчанию.

Для этого соответствующие предопределенные константы соединить со знаком ž+¤, а числа сложить.

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

Пример.

i=VbYes/No + VbCritical + VbDetaultbutton2 Res=MsgBox(®Выберете кнопку¯; i; диалог с пользовате-

лем¯).

В переменную Res возвращается код нажатой кнопки VbYes или

VbNo.

13

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

Обращение к любой процедуре осуществляется по имени процедуры:

MsgBox <аргументы>.

В этом случае скобки не используются и слева отсутствует знак

ž=¤.

Пример. MsgBox ®A =¯ & A , , ®Вывод результата¯. Выводимые данные вида А=<число>, кнопки не используются, заголовок диалогового окна žВывод результата¤. При пропуске аргумента ставим запятую.

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

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

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

Оператор присваивания имеет вид:

< переменная> = < выражение >.

Вычисленное значение выражения, арифметического или логического, присваивается переменной, стоящей слева, а не наоборот.

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

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

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

Полная форма предусматривает наличие двух ветвей обработки:

Да и Нет:

if <условие> then <ветка Да>

else

<ветка Нет> end if.

Если условие истинно, выполняются инструкции после ключевого слова then (то), затем конец ветвления end if.

14

Если ложно, выполняются инструкции после else (иначе), затем конец ветвления end if.

Запись оператора в таком виде представляет собой блочный синтаксис. Все ключевые слова записаны в отдельные строки. Конец ветвления (блока) помечается ключевым словом end if.

Можно использовать строчный синтаксис оператора, когда все ключевые слова записаны в одну строку, в этом случае ключевое слово end if не используется:

 

if <условие> then <ветка Да>

else <ветка Нет>.

Условный оператор можно использовать в краткий форме, в

этом случае ветка Нет отсутствует:

 

if

<условие> then <ветка Да>

‘строчный синтаксис

if

<условие> then

‘блочный синтаксис

<ветка Да> end If.

В операторах ветвления можно использовать простое и сложное условие:

If < условие> then.... ‘ простое условие

If < условие 1> and < условие 2> then ... ‘ проверяется сложное условие состоящее из двух простых, соединенных знаком логической операции and (см. табл. 2, табл. 3).

В любом случае операторы ветвления позволяют сделать выбор из двух альтернатив (истина или ложь).

Если необходимо сделать выбор из множества альтернатив, то используются вложенные операторы ветвления или оператор варианта (выбора).

Общий вид оператора выбора:

Select Case < Переменная или выражение> Case < Список значений 1>

<операторы 1>

Case <Список значений 2> <операторы 2>

Case < Список значений N> <операторы N>

[Case Else <операторы>]

End Select.

15 Переменная в заголовке оператора называется переключателем.

Если используется выражение, то его значение вычисляется и затем анализируется:

если оно совпадает с параметром < Список значений 1>, то выполняется <операторы 1>, затем конец выбора end Select и т.д.

если не совпадает ни с одним параметром <Список значе-

ний …>, то выполняются <операторы> после ключевого слова else. Структура Сase <Список значений>

<операторы>

может быть записана в одну строку через знак žдвоеточие¤ (:). Параметр <значения>, может быть записан в виде списка выражений, разделенных запятой: Сase <выражение 1>, <выражение2>.

Каждое выражение может быть записано в виде: <выражение 1> to <выражение 2>, например, case 1 to 10 определяет закрытый диапазон.

Запись вида: Сase IS <логическое выражение>, например, Сase IS <100 определяет открытый диапазон.

Вид: Сase IS = 1 можно записать короче Сase 1.

Вид: <выражение 1> <логическая операция> <выражение 2>, например, Case 1 or 5 можно записать короче Сase 1, 5.

Оператор выбора можно заменить условным оператором, который реализует ветвление по трем и более направлениям:

If <условие> then

<ветка Да; операторы1>

elseIf <условие2> then ‘ветка Нет для предыдущего if

<ветка Да, операторы2> elseIf <условие3> then

<ветка Да, операторы3>

[else

<ветка Нет, операторы>] End If.

Ключевое слово elseIf открывает ветку Нет в качестве вложенного оператора ветвления. Используется блочный синтаксис. Написание elseIf без пробела не требует явного указания конца вложенного оператора ветвления end If.

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

В VBA оператор цикла Do...Loop имеет 4 формы употребления (табл. 7).

16 Таблица 7 – Виды оператора цикла Do...Loop

Вид оператора

Описание

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

Пока условие истинно, выполнять тело цикла

<операторы>

(цикл с предусловием)

Loop

 

Do

Выполнять тело цикла пока условие истинно

<операторы>

(цикл с постусловием)

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

 

Do [until <условие>]

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

<операторы>

не станет истинным, то есть пока условие ложно

Loop

(цикл с предусловием)

Do

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

<операторы>

не станет истинным, то есть пока условие ложно

Loop [until <условие>]

(цикл с постусловием)

Во всех конструкциях выражение в квадратных скобках можно опустить, то есть использовать оператор в виде:

Do <операторы>

Loop.

Имеется в виду, выполнять тело цикла, пока Истина. Указанные синтаксические варианты записи оператора цикла соответствуют базовой структуре алгоритмов – циклу ДО (Until) и циклу ПОКА (While).

Тело цикла - это конструкции, заключенные между ключевыми словами Do и Loop, определяет их многократное повторение. Цикл с предусловием означает проверку условия перед выполнением тела цикла. Цикл с постусловием указывает проверку условия после выполнения тела цикла.

Оператор цикла с параметром (или с определенным числом повторений) For … Next имеет вид:

For <параметр> = <начало> to <конец> [Step <шаг>]. <операторы>

Next < параметр>.

Количество повторений цикла определяется начальным и конечным значениями параметра (счетчика), а также значением шага изменения параметра. Если шаг не указан, то по умолчанию он равен единице. Оператор цикла While … Wend имеет вид:

While <условие> <oператоры>

Wend.

17 Тело цикла выполняется, пока <условие> истинно. Если усло-

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

Для работы с коллекцией объектов используется оператор цикла

For Each … Next:

For Each < ИмяОбъекта> In <ИмяКоллекции> <oператоры>

Next.

С помощью этой конструкции можно организовать перебор всех лбъектов, принадлежащих некоторой коллекции объектов. На каждом проходе переменная цикла < ИмяОбъекта> (объектного типа) будет содержать очередной объект коллекции. Доступ к методам и свойствам объекта осуществляется через имя переменной цикла.

Для преждевременного выхода из цикла используются инструкции Exit Do и Exit For. Эти инструкции должны присутствовать в теле цикла. Как только управление в процедуре передается на одну из этих команд, сразу осуществляется выход из цикла, то есть управление передается на команду, следующую за Next или Loop.

Инструкции Exit Sub и Exit Function также выполняют преждевременное завершение процедуры или функции пользователя соответственно.

2.Обработка строковых данных

2.1.Описание строк

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

Для описания строк в VBA определены два типа данных: Строки переменной длины. Данный тип используется по умол-

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

Dim <переменная> As String.

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

18 явление отличается тем, что для строк постоянной длины нужно обя-

зательно указывать длину строки в символах:

Dim <переменная> As String * N,

где N – длина строки в символах. Ключевое слово Dim резервирует память для строковой переменной.

Например,

Dim strA As String*20

strA = ”Строковая переменная”.

При выполнении первой из указанных команд для строки strA в памяти будет выделено место в 20 байт.

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

Инструкция Option Compare указывает способ сравнения строк (Binary, Text или Database) для модуля. Если модуль не содержит инструкцию Option Compare, по умолчанию используется способ сравнения Binary, при которой результаты сравнения зависят от регистра символов.

Инструкция Option Compare Text задает сравнение строк без учета регистра символов на основе системной национальной настройки.

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

Инструкция Option Compare при ее использовании должна находиться в модуле перед любой процедурой.

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

1.С помощью операций отношения: = (равно), <> (не равно),

<(меньше), <= (меньше или равно), > (больше), >= (больше или равно).

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

результат = выражение Like образец,

где žвыражение¤ – символьное выражение, а žобразец¤ – шаблон символов. Если выражение "соответствует" шаблону, то результат – истина (True), в противном случае – ложь (False). Если вы-

19

ражение или шаблон равны Null (нулевая строка), то и результат будет равен Null. Для создания шаблонов можно использовать набор символов обобщения (табл.1).

Таблица 1– Символы для создания шаблонов

 

 

Символ

Операция соответствия

 

 

 

 

?

любой одиночный символ

 

 

 

 

*

множество (в том числе и пустое) символов

 

 

 

 

#

любой одиночный цифровой символ (0-9)

 

 

 

 

[НаборСимволов]

любой набор одиночных символов

 

 

 

 

[!НаборСимволов]

любой символ, который не входит в указанный набор

 

 

 

 

3. Путем использования встроенной функции StrComp(). Возвращает значение типа Variant (Integer), представляющее ре-

зультат сравнения строк. Синтаксис:

StrComp (strA, strB [, параметр]), где strA – любое допустимое строковое выражение; strB – любое допустимое строковое выражение;

[параметр] – необязательный аргумент. Указывает способ сравнения строк. Агумент параметр может быть опущен или иметь значение 0, 1 или 2. Чтобы выполнить двоичное сравнение, следует указать 0 (это значение используется по умолчанию). Чтобы выполнить посимвольное сравнение без учета регистра, следует указать 1, и 2 – для выполнения сравнения на основании сведений, содержащихся в базе данных. Если аргумент параметр имеет значение Null, возникает ошибка. Если аргумент параметр опущен, способ сравнения строк определяется значением параметра инструкции Option Compare:

strA < strB, то значение функции StrComp=-1; strA = strB, то значение функции StrComp = 0; strA > strB, то значение функции StrComp=1; strA = Null или strB = Null, то StrComp = Null.

При объединении двух и более строк используется операция сцепления (конкатенации) строк, которая реализуется с помощью оператора &.

Рассмотрим пример.