Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5401.pdf
Скачиваний:
5
Добавлен:
13.11.2022
Размер:
1.36 Mб
Скачать

22

порядке, в котором записаны. Неисполняемые операторы выполняются все сразу до начала выполнения первого исполняемого оператора. Поэтому рекомендуется записывать сначала все неисполняемые операторы, а потом все исполняемые, хотя это необязательное требование языка VBA. Это правило является общепринятым, отступления от него ухудшают читаемость программы и ничего не дают в смысле программирования.

Парадигма структурного программирования

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

Исторически первой оформленной парадигмой программирования была парадигма структурного программирования. Теоретик программирования Дейкстра Э. провел статистическую обработку большой выборки текстов реальных программ и выявил обратную зависимость качества программ (надежность, скорость отладки) от количества безусловных операторов GoTo в ней. В народе концепция структурного программирования была понята как программирование без GoTo.

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

a

b

 

 

 

c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3. Базовые структуры управления

a)Последовательное выполнение. Реализуется в бейсике операторами присваивания.

b)Ветвления по условию. Реализуется в бейсике операторами

If...Then...Else.

c)Цикл с предусловием. Реализуется в бейсике операторами Do...Loop с предусловием.

23

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

Дополнительные структуры управления в бейсике типа оператора множественного выбора Select...Case, цикла Do...Loop с постусловием, цикла перебора For...Each сохраняют принцип один вход – один выход. Операторы ограниченных переходов типа досрочного выхода из тела цикла Exit For, Exit Do позволяют писать более короткий и эффективный код той же степени структурности.

Отсюда делается вывод, что язык VBA удовлетворяет всем принципам парадигмы структурного программирования.

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

Оператор присваивания используется для присваивания значения переменной. Последовательность операторов присваивания реализует линейные алгоритмы.

Синтаксис оператора присваивания:

[Let] имяПеременной = Выражение

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

Приоритет операций: вызов функции, ^ – возведение в степень,

* и / – умножение и обычное деление, \ – целочисленное деление,

mod – остаток от целочисленного деления, + и - – сложение и вычитание.

24

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

VBA имеет общепринятый набор математических функций, некоторые из которых приведены в таблице ниже (см. табл. 2).

Таблица 2

 

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

 

 

Вызов функции

Описание

Abs(x)

абсолютная величина числа х

Atn(x)

арктангенс (в радианах)

Cos(x)

косинус, х в радианах

Exp(x)

экспонента (2.7172) в степени х

Fix(x)

целая часть числа х

Int(x)

наибольшее целое, не превышающее х

Log(x)

натуральный логарифм х, х>0

Rnd(x)

генерирует случайное число

Sgn(x)

знак числа.

 

возвращает -1 при х<0, 0 при х=0 и 1 при х>0

Sin(x)

синус, х в радианах

Sqr(x)

квадратный корень из числа х

Tan(x)

тангенс, х в радианах

Пример оператора присваивания, арифметическое выражение справа вычисляет расстояние между двумя точками:

r = sqr((x1-x2)^2+(y1-y2)^2)

Для обработки строк, вводимых пользователем через окна ввода или текстовые поля экранных форм, используются операции конкатенации строк и строковые функции. В VBA есть два оператора конкатенации строк + и &. Оператор & отличается от оператора + тем, что подвергает конкатенации не только строки, но и числа. При этом числа сначала преобразовывает в строки. Результат будет также строкой. Наиболее распространенные строковые функции сведены в таблицу (см. табл. 3).

 

25

 

 

Таблица 3

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

 

 

 

Вызов функции

 

Возвращаемый результат

 

 

 

Len(s$)

 

возвращает длину строки s$

 

 

 

 

 

 

Val(s$)

 

возвращает число, записанное в строке s$

Str(Число)

 

преобразует число в строку

 

 

 

 

 

 

Ltrim(s$)

 

удаляет из строки начальные пробелы

 

Rtrim(s$)

 

удаляет из строки конечные пробелы

Trim(s$)

 

удаляет начальные и конечные пробелы

 

 

 

 

 

 

Asc(s$)

 

преобразует в ASCII-код первый символ

 

 

строки s$

Chr(Код&)

 

преобразует код ASCII в строку из одного

 

 

символа

 

 

 

 

 

 

Mid(s$, Позиция&

 

выделяет подстроку заданной длины с

 

[, Длина&])

 

заданной позиции

Left(s$, Длина&)

 

выделяет слева подстроку заданной длины

Right(s$, Длина&)

 

выделяет справа подстроку заданной дли-

 

 

ны

 

 

 

 

 

 

InStr([Начало&,]

 

поиск подстроки, возвращает 1, если

s$, Подстрока$)

 

найдена

 

 

 

 

 

 

UCase(s$)

 

преобразует все буквы в ПРОПИСНЫЕ

LCase(s$)

 

преобразует все буквы в строчные

 

 

 

Примеры применения строковых функций:

Len(”Иван” + ”Петрович”) ’возвращает 12 Mid(”Иван Петрович”,6) ’возвращает ”Петрович” Mid(”Иван Петрович”,6,3) ’возвращает ”Пет” Left(”Иван Петрович”,4) ’возвращает ”Иван” Right(”Иван Петрович”,8) ’возвращает ”Петрович” InStr(”Иван Петрович”, ”Иван”) ’возвращает 1 InStr(2, ”Иван Петрович”, ”Иван”) ’возвращает 0

Text1.Text = 3580

Num = Val(Text1.Text)+1 ’в Num будет 3581 Str(Num) ’возвращает строку ” 3581” Ltrim(Str(Num)) ’возвращает ”3581” без пробела LCase(”VBA”) ’возвращает строку ”vba”

UCase(”Visual Basic”) ’возвращает ”VISUAL BASIC”

Asc(”2004”) ’возвращает 50 (код ASCII цифры 2)

26

Chr(50) ’возвращает строку ”2”

”Иван” & Chr(13)&Chr(10)&”Петрович” ’в две строки

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

VBA имеет большой арсенал функций для работы с файлами и файловой системой, для проверки и преобразования типов, для профессиональной работы со временем и датами, функции для работы с реестром Windows вплоть до обращений к операционной системе через интерфейс Win32API, которые в данном пособии не рассматриваются, информацию по этим вопросам можно получить в справочной системе [13, 14], либо на сайтах [15 - 18], либо в документации [19, 20].

Для инициализации сложных объектов используется оператор объектного присваивания Set. Когда создается объект, то объявление

Dim имяПеременной As Object

записывает в переменную адрес памяти, где будет храниться объект. Сам объект при этом не создается. Оператор Set связывает ссылку с реально существующим объектом. Синтаксис оператора Set (в варианте позднего связывания):

Set имяПеременной = имяОбъекта

Для программирования ветвлений в бейсике используются условный оператор и оператор выбора.

Условный оператор позволяет выполнять действия в зависимости от истинности одного условия. Имеется два варианта синтаксиса оператора: в одну строку и в форме блока.

Синтаксис оператора в одну строку:

If условие Then [операторы1] [Else операторы2]

Синтаксис оператора, расположенного на нескольких строках:

If условие1 Then [операторы1]

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

End If

Здесь условие может быть числовым или строковым выражением со значениями True или False. Операторы1 и операторы2 – это последовательности из одного или нескольких операторов. По крайней мере одна из этих последовательностей должна быть непустой. Если условие истинно (True), выполняется последовательность операторы1, если ложно (False) – операторы2.

27

’пример условного оператора в одну строку

If А > 10 Then А=А+1 : В=В+А Else C= А*В: А=С+2 ’тот же условный оператор в виде блока

If A > 10 Then

А=А+1:В=В+А

Else

С= А*В: А=С+2

End If

Для поверки более одного условия и выполнения одного из нескольких блоков операторов используется следующий синтаксис оператора If:

If условие1 Then [операторы1]

[ElseIf условие2 Then

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

...

[ElseIf условиеN Then

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

[операторыИначе]]

End If

Цепочки операторов If...Then...ElseIf обладают большой гибкостью и позволяют решить все проблемы программного ветвления. Однако по ним трудно прослеживается логика. Поэтому для наиболее часто встречающегося случая, когда необходимо сделать выбор одной из нескольких возможностей в зависимости от различных значений одного и того же выражения, предназначен оператор выбора Select...Case.

Синтаксис оператора Select...Case:

Select Case ВыражениеТест [Case СписокЗначений1

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

...

[Case списокЗначенийN [операторыN]]

[Case Else

[операторыИначе]]

End Select

Оператор Select...Case в зависимости от значения выражения выбирает и исполняет одну из последовательностей операторов операто-

ры1, операторы2,.. либо операторыИначе. ВыражениеТест может

28

быть произвольным выражением с числовым или строковым значением. СписокЗначенийN должен присутствовать в строке, начинающейся ключевым словом Case. Выражения в этом списке отделяются запятыми и могут иметь одну из форм: выражение, выражениеНижняяГраница То выражениеВерхняяГраница, Is операторСравнения выра-

жение. Первая форма задает отдельные значения, вторая и третья позволяют задавать диапазоны значений.

Циклические конструкции в VBA реализуют четыре оператора цикла:

For...Next, While...Wend, Do...Loop и For Each.

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

Синтаксис оператора For...Next:

For счетчикЦикла = начало То конец [Step шаг] Тело цикла

Next [счетчикЦикла]

Здесь счетчикЦикла – это числовая переменная. В начале выполнения цикла она принимает значение, задаваемое числовым выражением начало. Числовое выражение конец задает заключительное значение счетчика цикла. Оно вычисляется в начале выполнения цикла и не меняется, даже если входящие в него переменные изменяют в теле цикла свои значения. Числовое выражение шаг необязательно. Его значение также вычисляется в начале цикла и прибавляется к счетчику цикла всякий раз, когда завершается выполнение тела цикла и вычисление достигает строки Next [счетчикЦикла]. Если шаг цикла явно не указан, по умолчанию он равен 1. Тело цикла – это блок операторов, который будет выполнен заданное число раз. При каком значении переменной счетчикЦикла происходит завершение цикла, зависит от знака параметра шаг. Если шаг положителен, цикл завершится, когда впервые выполнится условие счетчикЦикла > конец. Если шаг цикла отрицателен, условие его завершения счетчикЦикла < конец. Это условие проверяется перед началом выполнения цикла, а затем – после каждого прибавления шага к счетчику цикла в операторе Next. Если оно выполнено, управление передается на оператор, следующий за Next, если нет – выполняются операторы из тела цикла. Выйти из цикла, не дожидаясь выполнения условия завершения, можно с помощью оператора Exit For.

Пример: k = 0

For i = 1 To 5

29

k=k+i Next i

После выполнения цикла k=15.

Оператор цикла Do...Loop используется для организации циклов с неопределенным числом повторений. Условие выхода из цикла генерируется во время выполнения цикла. Имеется четыре варианта синтаксиса этого цикла: повтор блока операторов, пока заданное условие является истинным или пока оно не станет истинным с проверкой в начале цикла или в конце цикла.

Синтаксис цикла Do...Loop с предусловием:

Do [{While | Until} условие]

тело цикла

Loop

Синтаксис цикла Do...Loop с постусловием:

Do

тело цикла

Loop [{While | Until} условие]

Здесь условие является числовым или строковым выражением со значениями True или False. Вообще оно необязательно. Значение Null условия трактуется как False. Тело цикла – это последовательность операторов, которая выполняется, пока условие остается истинным, если указано ключевое слово While или пока оно остается ложным – в вариантах цикла с ключевым словом Until. Поэтому циклы вида While условие эквивалентны циклам вида Until Not условие.

Оператор Exit Do в теле цикла прекращает цикл и передает управление на оператор, непосредственно следующий за Loop. В случае нескольких вложенных циклов Do...Loop оператор Exit Do завершает только самый внутренний цикл, в теле которого он расположен.

Оператор цикла While...Wend является частным случаем цикла Do...Loop с предусловием по While и сейчас не используется как устаревшая конструкция.

Цикл For Each повторяет заданную последовательность операторов для каждого элемента массива или коллекции.

Синтаксис оператора For Each:

For Each элемент In набор тело цикла

Next [элемент]

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

30

некоторого класса объектов. В случае цикла по массиву элемент обязан быть переменной типа Variant. Набор – это имя набора объектов (чаще всего это коллекция объектов) или массива, для элементов которых выполняется цикл. Тело цикла – последовательность операторов, выполняемая для каждого элемента набора или массива, и может содержать операторы Exit For, позволяющие прервать выполнение цикла и передать управление на оператор, следующий за Next. Обычно такой выход происходит при выполнении некоторого условия, проверяемого в операторе If...Then...Else. Указывать переменную элемент после ключевого слова Next не обязательно, но желательно для улучшения читаемости текста программы.

Пример.

For Each текущийЛист In ThisWorkbook.Worksheets If текущийЛист.Name = ”Лист16” Then

Exit For ’если имя очередного листа ”Лист16”, то цикл завершается

End If

Debug.Print текущийЛист.Name ’вывод в окно отладки

Next

В этом примере цикл будет пробегать по всем листам текущей рабочей книги Excel и в окне отладки выводить их имена до тех пор, пока не встретится рабочий лист с именем ”Лист16”. Если в рабочей книге нет листа с таким именем, то будут выведены имена всех рабочих листов.

Если в одном блоке программы предстоит выполнить несколько операций с одним объектом, это можно указать явно оператором работы с объектом With, а затем не повторять имя этого объекта при обращении к его свойствам, методам и подобъектам.

Синтаксис оператора With:

With объект [операторы] End With

Если с помощью макрорекордера (использование макрорекордера описано далее в соответствующем разделе) записать действия, связанные с вызовом диалогового окна Параметры страницы (Page Setup), то независимо от того, какие параметры и на каких вкладках были изменены, при нажатии кнопки Ok макрорекордер запишет примерно такой оператор:

With ActiveSheet.PageSetup

.LeftHeader = ””

.CenterHeader = ””

.RightHeader = ””

.LeftFooter = ””

31

.CenterFooter = ””

.RightFooter = ””

.LeftMargin = Application.InchesToPoints(0.787401575)

.RightMargin = Application.InchesToPoints(0.787401575)

.TopMargin = Application.InchesToPoints(0.984251969)

.BottomMargin = Application.InchesToPoints(0.984251969)

.HeaderMargin = Application.InchesToPoints(0.5)

.FooterMargin = Application.InchesToPoints(0.5)

.PrintHeadings = False

.PrintGridlines = False

.PrintComments = xlPrintNoComments

.PrintQuality = 600

.CenterHorizontally = False

.CenterVertically = False

.Orientation = xlPortrait

.Draft = False

.PaperSize = xlPaperA4

.FirstPageNumber = xlAutomatic

.Order = xlDownThenOver

.BlackAndWhite = False

.Zoom = 100 End With

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

Кроме рассмотренных управляющих операторов, VBA содержит рудиментарные операторы перехода по метке GoTo, перехода по метке с возвратом GoSub...Return и условные операторы перехода по меткам On...GoSub и On...GoTo. Все они необходимы только для совместимости с предыдущими версиями, их использование при разработке новых программ не рекомендуется.

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

Синтаксис оператора Веер:

Веер

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]