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

ОПП_Лекция№1(2014)

.pdf
Скачиваний:
10
Добавлен:
30.05.2015
Размер:
4.11 Mб
Скачать

Инструкции управления порядком выполнения команд

Инструкция If …Then…Else.Синтаксис:

If <условие>Then<инструкция> [Else<инструкция>]

Заметим, что компонента Elseможет быть опущена. Такая форма предполагает размещение всей инструкции в одной строке. Как правило, группы Then и Else включают не одну инструкцию. В этом случае инструкция If принимает следующую форму:

If <условие>Then<инструкция1> <инструкция2>

. . .

<инструкцияn> [Else<инструкция1> <инструкция2>

. . .

<инструкцияm>] EndIf

Инструкция SelectCase.Синтаксис:

SelectCase<выражение> Case<значение1> <инструкция1> <инструкция2>

...

<инструкцияn1> [Case<значение2> <инструкция1> <инструкция1>

<инструкцияn2>

Case<значениеm> <инструкция1> <инструкция2>

<инструкцияnm>] [CaseElse <инструкция1> <инструкция2>

<инструкцияk>] EndSelect

,где значение1, значение2, …, значениеm - значения выражения, указанного в компоненте SelectCase.

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

Замечание.Параметр выражение- любое числовое или строковое выражение.

Инструкции управления порядком выполнения команд

Циклпо условию(условныйцикл).

Инструкция имеет четыре варианта синтаксиса: Вариант 1.

Do While<условие> <инструкция1> <инструкция2>

<инструкцияn> Loop

Инструкции цикла выполняются, пока остается истиннымзначение параметра условие. Вариант 2.

Do Until<условие> <инструкция1> <инструкция2>

<инструкцияn> Loop

Инструкции цикла выполняются, пока остается ложнымзначение параметра условие. Вариант 3.

Do <инструкция1> <инструкция2>

<инструкцияn> LoopWhile<условие>

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

Вариант 4.

Do <инструкция1> <инструкция2>

<инструкцияn> LoopUntil<условие>

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

Пример организации цикла: Counter = 100

Do While Counter>0 (инструкции тела цикла) Counter= Counter-1

Loop

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

Инструкции управления порядком выполнения команд

Безусловныйвыходиз цикла.

Инструкция Exit Do позволяет осуществить принудительный выход из цикла путем безусловной передачи управления на инструкцию, непосредственно следующую за циклом.

Пример использования инструкции Exit Do.

Counter= 99

Do UntilCounter<= 0

If Counter> 50 Then

MsgBox“Начальноезначениебольшемаксимальнодопустимого.Ошибка_ ввода!”

Exit Do

End If

(инструкции ввода данных)

Counter=Counter-1

Loop

Циклпо счетчику.Синтаксис:

For<переменная_счетчик>= <начало>To <конец>[Step<шаг>] <инструкция1> <инструкция2>

<инструкцияn> Next<переменная_счетчик>

Параметр переменная_счетчик- это числовая переменная, значение которой автоматически увеличивается на величину значения необязательного параметра шаг. Если компонента Step опущена, шаг по умолчанию устанавливается равным 1.

Пример 1: Счет в прямом направлении.

For Counter=1To 100

(инструкциитела цикла)

Next Counter

Пример 2. Счет в обратном направлении.

For Counter=100To 1 Step -1 (инструкциитела цикла) Next Counter

Замечание.Инструкция Exit For позволяет осуществить безусловный выход из цикла For… Next.

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

Структура процедуры. Упрощенный синтаксис:

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

End Sub

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

Статус Private ограничивает действие процедуры модулем, в котором она описана. Список_аргументов - это перечень через запятую описаний аргументов процедуры. Упрощеннаяструктура описания одного аргумента имеет вид:

[ByVal| ByRef]<имя_аргумента>[As <тип>] [=<значение>]

Альтернативныеключи ByVal и ByRef определяют способпередачиаргумента в процедуру. ByVal – передача аргумента по значению; т.е. при вызове процедуры будет создаваться локальная копия переменной с начальнымпередаваемым значением.

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

Структура функции. Упрощенный синтаксис:

[Private | Public] Function <имя>([<список_аргументов>])[As <тип_результата>] <тело функции>

End Function

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

имя=выражение(*)

Если компонента тип_результата опущена, тип результата определяется по типу значения выражения (*).

Если при выходе из функции переменной имя значение явно не присвоено, функция возвращает значение соответствующеготипа, определенное по умолчанию:

•длячисловыхтипов - это 0;

•длястрок символов - пустая строка “”;

•длятипа Variant - Empty;

•длятипа Object - Nothing.

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

ExitSub (Exit Function).

Использованиепроцедур и функций.

Рассмотрим задачу возведения значения переменной в куб. Пусть имеется описание двух переменных X и Y:

Dim Х,Y As Integer

и пусть необходимо значение переменной Y положить равным значению X3.

Решениезадачис помощьюсозданияпроцедуры:

Решениезадачис помощьюсозданияфункции:

а) Описание процедуры:

а) Описание функции:

Subcube1(ByValN AsInteger,ByRef C AsInteger)

Functioncube2(ByValN AsInteger)AsInteger

C=N*N*N

cube2=N*N*N

EndSub

EndFunction

б) Решение задачи с использованием вызова процедуры

б) Решение задачи с использованием вызова функции

cube1:

cube2:

cube1(X,Y)

Y = cube2(X)

 

 

Поддержка ООП в VBA: Создание объектных переменных

VBAпредставляет средства для использования имеющихся и создания новых объектов. Класс — это общее описание однородных по структуре объектов.

Класс задает характеристикии поведениеобъектов.

Классы в VBA оформляются в виде отдельных модулей.

Тему «Объявлениепользовательскихклассов» мы рассмотрим позднее, на одной из лекций.

Созданиеобъектныхпеременных

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

Такие переменные называются объектными и создаются одним из способов:

1.явнымуказаниемклассаобъекта;

2.ссылкойна ранеесозданныйобъект;

При любом способе создания объектная переменная представляет из себя 4-байтовую ссылку на адрес, где хранится объект. При объявлении такой переменной память для самого объекта может и не отводиться, поэтому может быть не определено и значение ссылки. Задание ссылки на объект, т.е. связывание объектной переменной с самим объектом выполняется двумя способами:

1.При раннемсвязываниив момент объявления указывается класс объекта:

Dim<Переменная>As <классОбъекта>

2.При позднем связывании переменная объявляется так:

Dim<Переменная>As Object

В этом объявлении переменная является объектом (ссылкой), но ничего не сказано о классе этого объекта. Он выяснится только динамически при выполнении программы, когда <Переменная> будет связываться с только что созданным или существующим объектом того или иного класса. Поэтому такое связывание и называется поздним,или динамическим.

Нужно заметить, что в этих первых двух случаях выполняется только объявление объектной переменной значение которой Nothing , что сообщает о том, что эта переменная не ссылается на нужный нам объект. Для выполнения связывания объектной переменной с существующим объектом используется конструкция Set.

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

Private| Public| Dim<имяОбъектнойПеременной>As New <имяКласса> Использованиеобъектов

Для обращения к свойствам или методам экземпляра класса в VBA используется точечная нотация:

перем= <имяОбъектнойПеременной>.<Свойство>' чтениесвойства

Или:

<имяОбъектнойПеременной>.<Свойство>= значение' записьсвойства

Для обращения к объектным свойствам следует использовать ключевое слово Set. Вызов методов и передача параметров аналогичны работе с обычными процедурами и функциями.

Понятие коллекции

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

•элементы в общем случае могут быть любых типов (например, коллекция элементов управления на форме - controls),но чаще всего - одного типа;

•элементы коллекции представляют линейный список;

•элементы коллекции представляют массив;

•элементы коллекции представляют словарь.

1.Коллекция как линейный список. Возможность динамического добавления нового элемента в конец списка, используя метод Add.

2.Коллекция как массив. Все элементы коллекции проиндексированы, поэтому к элементу можно обращаться по индексу (прямой доступ по индексу).

3.Коллекция как словарь. Элементы коллекции могут иметь ключи. В этом случае к элементу возможенпрямой доступ по ключу.

Отличительным признаком коллекции является присутствие символа “s” в конце ее имени (Documents- коллекция документов), в отличие от названия самого класса объектов (Document). Любой существующий элемент коллекции может быть удален, при этом в коллекции не возникает «дыр» - элементы коллекции перенумеровываются, и непрерывность значений индексов не нарушается.

Новый элемент может быть добавлен в произвольное место коллекции: как перед, так и после любого из элементов.

Класс Collectionимеет одно свойство - Count,и три метода: Add, Item,Remove.

1.Свойство Count - возвращает количество элементов в коллекции. Тип возвращаемого значения -Long.

2.Метод Add(item[,key][,before][,after]).Добавляет элементы в коллекцию.

Параметры:

item- обязательный; задает (определяет) добавляемый элемент;

key- необязательный; задается, когда элементу ставится в соответствие ключ;

before,after - необязательные; уточняют позицию вставки, задают индекс или ключ элемента.

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

1.Метод Item(key). Возвращает значение элемента списка с заданным значением ключа (или индекса).

2.Метод Remove(key).Удаляет элемент списка с заданным значением ключа (или индекса).

Пример 1. Коллекция личностей

Sub Collection()

‘Созданиеи работас коллекцией

Dim As PersonsNew Collection‘МодульклассаPerson

ужесоздан

‘Работас коллекцией,как со списком

DimAdam As New Person Adam.InitPerson“Адам”,“Первыйчеловек”, #1/1/1#

Persons.AddAdam

DimNoiAs New Person

Noi..InitPerson“Ной”,“Праведник”,#1/1/100#

Persons.AddNoi

‘Работас коллекцией,как с динамическиммассивом

DimSheakspierAs New Person Sheakspier.InitPerson“Шекспир”,“Драматург”, #4/23/1564#

Persons.Add item:=Sheakspier,after:=2

‘Работас коллекцией,как со словарем

DimPushkinAs New Person Pushkin.InitPerson“Пушкин”,“Поэт”, #6/6/1799#

Persons.Additem:=Pushkin,key:=”Гений”

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

Пример2. SubTest_of_Collection() DimmyCollectionAs NewCollection DimI As Integer

Dimn As Long

WithmyCollection n=.Count

‘Элементыимеютиндексы,но не имеютключей

.Add(2)

.Add(4)

.Add(6) ‘Добавлениенечетныхэлементовнасвоиместа

.Add“один”,“first”,1

‘before(перед1-мэлементом)

.Add“три”,“third”,,2

‘after(после2-гоэлемента)

.Add“пять”,“fifth”,,4

‘after(после4-гоэлемента)

‘Составколлекции:один 2 три 4 пять6 ‘Использование

Fori=1To n

Nexti

‘Удаление4-гои 5-гоэлементовпо заданномуиндексуи ключу

.Remove4

.Remove“fifth” n=.Count ‘n=4

Составколлекции после удаления элементов: один2 три 6

Замечание. Учитывая, что после удаления элемента коллекции все остальные элементы перенумеровываются, использование цикла по счетчику для перебора элементов коллекции в случае, когда в теле цикла элементы удаляются, приводит к ошибке (обращение к несуществующему номеру элемента). Для перебора элементов коллекции лучше использовать цикл

ForEach<переменная>In <группа> телоцикла

Next<переменная>

Переменная - параметр цикла; тип этой переменной должен либо совпадать с типом элементов коллекции, либо быть типом Object;

Группа - имя коллекции.

Объекты Range,Selection и метод Activate

Во всех приложениях MS Officeприходится иметь дело с последовательностями элементов. Например:

•рабочий лист Excel можно рассматривать как последовательность ячеек, строк, столбцов;

•документ Word - как последовательность символов, слов, предложений, абзацев.

Каждой такой последовательности соответствуют два класса объектов: один класс определяет сам элемент, а другой - последовательность, состоящую из этих элементов - коллекцию.

Класс объектов RANGEпозволяет работать с произвольной последовательностью этих элементов (частью коллекции).

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

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

Пример 1.

Range(“A1:A2”)=2

Range(“B1”)=”=A1+A2”

Пример 2.

DimmyRangeAs Range

Set myRange= ActiveDocument.Paragraphs(1).Range

ActiveDocument- активный открытый документ; это обозначение глобальногообъекта; для глобальных объектов не нужно начинать цепочку с объекта Application.

Paragraphs(1)- возвращает объект класса Paragraph(первый параграф активного документа).

Range- свойство коллекции; возвращает последовательность символов первого параграфа (точнее, ссылку на первый символ этой последовательности.

•Переменная myRangeпринимает значение ссылки на начало первого символа первого параграфа документа

МетодRange.

В ряде случаев можно определить объект класса Range, используя не свойствометодRange. Например, документ Word - объект класса Document,не имеет свойства Range,однако имеет метод Range.

Синтаксис метода: FunctionRange(Start,End) As Range

Set myRange=ActiveDocument.Range(_

Start:=ActiveDocument.Paragraphs(1).Range.Start,_ End:=ActiveDocument.Paragraphs(1).Range.End)

Текст приведенного выше примера можно сократить, используя конструкцию With

WithActiveDocument

Set myRange=.Range(_

Start:=.Paragraphs(1).Range.Start,_

End:=.Paragraphs(1).Range.End)

Объекты Range,Selection и метод Activate

Объекты Selection присутствуют во всех приложениях МО. Они задают выделенную область рабочего листа Excel,документа Word и т.д.

Заметим, что одновременно может существовать только один объект Selection, в то время как объектов Range может быть несколько:

SetmyRange1=…

SetmyRange2=…

Обе переменные могут существовать одновременно.

R1.Select

R2.Select- отменяет первое выделение.

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

Между этими объектами существует тесная связь (двойственность):

•у объекта Rangeесть метод Selection,который выделяет заданный диапазон;

•объект Selection имеет метод Range.

МетодSelection.

Синтаксис метода: Sub Selection()

Метод реализован как процедура и объекта Selection не возвращает! Создание этого объекта - результат побочного действия метода, поэтому нельзя получить ссылку на этот объект, а, следовательно, создать переменную этого класса.

Причина такого подхода очевидна - объект Selection в каждый момент времени может быть только один.

Активныеобъектыи методActivate.

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

Другим примером косвенной адресации являются активные элементы. Активный элемент может быть в своем классе только один (один активный лист, один активный документ). Обычно активный элемент находится в фокусе клавиатуры, именно ему направлен вводной поток пользователя. Сделав активным новый элемент, мы деактивируем элемент, ранее находившийся в фокусе.

Метод Activateделает активным элемент, его вызвавший.

Этим методом обладают элементы верхних уровней иерархии: Application, Window, Document,

Workbook,Worksheetи др.

Чтобы обратиться к выделенному объекту, достаточно иметь одно глобальное свойство Selection, поскольку в каждый текущий момент существует только один выделенный элемент. Активных же элементов одновременно существует несколько, по одному в каждом классе. Поэтому для каждого класса имеется свое глобальное свойство. Чтобы обратиться к активному элементу некоторого класса Z, нужно вызвать соответствующее глобальное свойство Z.Active.