Лекция 11. Семестр 1 Циклы. Программирование циклических процессов vba. Элементы управления vba



Дата26.06.2016
Размер81 Kb.

А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 11. Семестр 1

Циклы. Программирование циклических процессов VBA. Элементы управления VBA


Содержание

Циклы. Программирование циклических процессов VBA. Элементы управления VBA 1

Управляющая инструкция For-Next 1

Управляющая инструкция While-Wend 2

Управляющая инструкция Do-Loop 3

Управляющая инструкция For-Each-Next 4

 Инструкция For-Each-Next с семействами (объектами) 5





Управляющая инструкция For-Next


      Она позволяет выполнять несколько команд заданное число раз. Рассмотрим пример 61; в нем число, записанное в переменную Base, возводится в степень, содержащуюся в переменной Power.

Sub Chap02gProc61_ForNext()

Dim Base As Integer

Dim Power As Integer

Dim Result As Integer

Dim Count1 As Integer

Base = 4

Power = 5

Result = 1

For Count1 = 1 To Power Step 1

Result = Result * Base

Next

MsgBox Base & " raised to the " & Power & "th power = " & Result

End Sub

В этой программе с помощью цикла For-Next 4 возводится в пятую степень. Надо отметить, что в VBA есть оператор возведения в степень ^, поэтому для подобного расчета достаточно написать

      Num2 = 4 ^ 5

Рассмотрим отдельные элементы инструкции For-Next.



For

Ключевое слово, отмечающее начало инструкции For-Next

Count1 = 1 То Power

      Выражение, определяющее счетчик и его начальное и конечное значения, задающие число повторений цикла. В данном случае в качестве счетчика используется переменная Count1. Ключевое слово То разделяет начальное (1) и конечное (Power) значения счетчика. При первом обращении к циклу переменной Count1 присваивается значение 1, и начинается выполнение цикла

Step 1

      Ключевое слово, задающее шаг приращения счетчика при завершении очередного цикла. Чаще всего в циклах For-Next он равен 1, но может быть любым целым числом, в том числе и отрицательным (тогда значение счетчика в каждом цикле уменьшается). В начале очередного цикла значение счетчика сравнивается с его конечным значением. Если разница положительная (значение счетчика превосходит его конечное значение), управление передается инструкции, заданной после ключевого слова Next. To же самое происходит и при отрицательной разнице. Указание ключевого слова Step и величины шага не является обязательным. Если они не определены, VBA выполняет цикл с шагом 1

Result = Result * Base

      Тело цикла. Может состоять из нескольких инструкций

Next

      Ключевое слово, отмечающее конец инструкции For-Next. При достижении ключевого слова Next значение счетчика увеличивается на величину шага, после чего управление передается на начало цикла. Затем происходит сравнение счетчика с конечным значением, и цикл при необходимости повторяется снова



Управляющая инструкция While-Wend


      Действие ее подобно действию For-Next, но группа инструкций выполняется не заданное число раз, а до соблюдения определенного условия. В программе РгосбЗ инструкция While-Wend использована для выделения определенного значения из последовательности случайных чисел.

Sub Chap02gProc63_WhileWend()

Dim LotteryEntry As Integer

LotteryEntry = 0

While LotteryEntry <> 7

LotteryEntry = Int(10 * Rnd())

Beep

Wend

MsgBox "Your number is " & LotteryEntry & ". You Win!!"

End Sub
Программа РгосбЗ гарантирует, что в информационном окне всегда отображается заданное число. Цикл While-Wend выполняется, пока значение переменной LotteryEntry не станет равным 7 (в условии использован оператор неравенства <>).
      При каждом выполнении цикла этой переменной присваивается случайное значение от 0 до 9, а затем (впрочем, без особой надобности) вызывается функция VBA Веер, подающая звуковой сигнал через внутренний динамик компьютера. Запустите эту программу несколько раз, и Вы услышите разное количество сигналов, в зависимости от того, на каком шаге генератор случайных чисел вернет число 7.

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

Рассмотрим структуру цикла While-Wend подробнее.

While

Ключевое слово, отмечающее начало инструкции While-Wend

LotteryEntry <> 7

Условие, определяющее, будет или нет выполнен цикл. Если оно соблюдено, цикл выполняется, если нет — управление передается инструкции, стоящей за ключевым словом Wend

LotteryEntry = Int(10 * Rnd())

Первая инструкция цикла

Веер

Вторая инструкция цикла

Wend

Ключевое слово, отмечающее конец инструкции While-Wend

Управляющая инструкция Do-Loop


      Она похожа на инструкцию While-Wend, однако дополнительно обладает двумя важными особенностями. Во-первых, условие завершения цикла Do-Loop можно задавать не только в его начале, но и в конце. Условие в конце цикла гарантирует, что он будет выполнен хотя бы один раз. Во-вторых, условие можно сделать критерием как выполнения цикла Do-Loop, так и его завершения. Последняя возможность в цикле While-Wend также доступна — чтобы цикл выполнялся, пока не соблюдено некоторое условие, его надо указать в инструкции While с логическим оператором Not.
      Рассмотрим несколько простых примеров. В программе Ргос6З инструкция While-Wend применялась для определения момента, когда в последовательности случайных чисел появлялась семерка. В Ргос65 та же операция осуществляется циклом Do-Loop.

      Sub Chap02gProc65_DoWhileLoop()


      Dim LotteryEntry As Integer
      LotteryEntry = 0
  Do While LotteryEntry <> 7
      LotteryEntry = Int(10 * Rnd())
      Beep
  Loop
      MsgBox "Your number is " & LotteryEntry & ". You Win!!"
      End Sub

      Как видите, эта программа мало отличается от примера 63: во-первых, перед ключевым словом While появилось слово Do, во-вторых, в конце цикла вместо Wend стоит Loop. Однако цикл Do-Loop позволяет переписать эту процедуру еще несколькими способами. В примере 66 слово While заменено словом Until, а вместо оператора неравенства в сравнении LotteryEntry и 7 задан оператор равенства.

      Sub Chap02gProc66_DoUntilLoop()
      Dim LotteryEntry As Integer
      LotteryEntry = 0
  Do Until LotteryEntry = 7
      LotteryEntry = Int(10 * Rnd())
      Beep
  Loop
      MsgBox "Your number is " & LotteryEntry & ". You Win!!"
      End Sub

      Цикл Do-Loop позволяет внести в эту процедуру еще несколько изменений. Например, в программе Ргос67 ключевое слово Do оставлено в начале цикла, а условие завершения и ключевое слово Until переместились в его конец, за ключевое слово Loop. В таком варианте цикл обязательно выполняется хотя бы один раз, поскольку условие завершения не проверяется, пока не будут выполнены все инструкции из тела цикла. Поэтому мы можем удалить инструкцию для инициализации переменной LotteryEntry.

      Sub Chap02gProc67_DoLoopUntil()
      Dim LotteryEntry As Integer

 Do
      LotteryEntry = Int(10 * Rnd())


      Beep
  Loop Until LotteryEntry =7
      MsgBox "Your number is " & LotteryEntry & ". You Win!!"
      End Sub

      А теперь заменим ключевое слово Until в конце цикла словом While. Тогда мы сможем вернуть в условие знак неравенства вместо знака равенства:

      Sub Chap02gProc68_DoLoopWhile()
      Dim LotteryEntry As Integer

Do
      LotteryEntry = Int(10 * Rnd())
      Beep
Loop While LotteryEntry <> 7
      MsgBox "Your number is " & LotteryEntry & ". You Win!!"
      End Sub

Управляющая инструкция For-Each-Next


      Инструкция For-Each-Next предназначена для выполнения одной и той же группы действий над каждым объектом семейства или элементом массива. Ниже приведен простой пример этой инструкции:

      Sub Chap02gProc71_ForEachNext()


      Dim CountryArray(5) As String
      Dim Country As Variant
      CountryArray(1) = "India"
      CountryArray(2) = "Peru"
      CountryArray(3) = "Greece"
      CountryArray(4) = "Canada"
      CountryArray(5) = "Kenya"
  For Each Country In CountryArray
      MsgBox Country
   Next
      End Sub

      В Ргос71 элементы массива CountryArray заполняются названиями стран, которые затем по очереди выводятся на экран в структуре For-Each-Next.

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


For Each

Ключевые слова, отмечающие начало инструкции For-Each-Next

Country

Переменная, которой присваиваются значения элементов группы —массива или семейства объекта. В первом случае переменная должна относиться к типу Variant Во втором случае Вы можете определить ее как Variant, Object или приписать ей конкретный объектный тип, соответствующий объектам семейства

In

Ключевое слово, отделяющее переменную от группы

CountryArray

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

MsgBox Country

Действие, которое выполняется над элементом группы

Next

Ключевое слово, отмечающее конец инструкции. Достигнув его, программа возвращается к началу цикла — инструкции For Each. Если значение переменной цикла совпадет с последним элементом группы, выполнится инструкция, написанная сразу после Next

 

Примечание

      В инструкции For-Each-Next значения элементов массива можно использовать,
но нельзя изменять. На объекты семейств это ограничение не распространяется — изменение их свойств в инструкции For-Each допустимо.

 Инструкция For-Each-Next с семействами (объектами)


Преимущества For-Each-Next при работе с массивами бесспорны, но они меркнут рядом с достоинствами этой структуры в обращении с объектами семейств. Рассмотрим простой пример.

      Sub Chap02gProc75_ForEachNextWorksheet()


      Dim SheetVar As Worksheet
  For Each SheetVar In ActiveWorkbook.Worksheets

MsgBox SheetVar.Name
  Next
      End Sub

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

Вы вправе изменить значения свойств Name рабочих листов в этом примере.

      Sub Chap02gProc76_ForEachNextWorksheet()


      Dim SheetVar As Worksheet
   For Each SheetVar In ActiveWorkbook.Worksheets
      SheetVar.Name = "Work" & SheetVar.Name
      MsgBox SheetVar.Name

Next
      End Sub

      Здесь изменяются имена листов — перед каждым из них добавляется слово Work. Для восстановления прежних имен введите следующий фрагмент кода.

      Sub Chap02gProc77_ForEachNextWorksheet()
      Dim SheetVar As Worksheet
      Dim x As Integer

x = 1

 For Each SheetVar In ActiveWorkbook.Worksheets


      SheetVar.Name = "Sheet" & x
      x = x + 1
      MsgBox SheetVar.Name


Next
      End Sub

      Инструкцию For-Each-Next можно применять и для вызова методов объектов семейства. Процедура Ргос78 создает 10 новых рабочих книг, располагает их окна мозаикой, а затем снова удаляет, оставляя лишь книгу, в которой размещена сама процедура.

      Sub Chap02gProc78_ForEachNextWorkbook()
      Dim x As Integer
      Dim Book As Workbook
 For x = 1 To 10
      Workbooks.Add


Next
      Windows.Arrange
      MsgBox "Workbooks have been arranged"
 For Each Book In Application Workbooks
      If Book Name <> ThisWorkbook.Name Then
      Book.Close
      End If
  Next
      ActiveWindow.WindowState = xlMaximized
      End Sub

      Десять новых рабочих книг создаются в цикле For-Next посредством обращения к методу Add семейства Workbooks. Затем вызывается метод Arrange семейства Windows, который упорядочивает расположение окон на экране. Далее выполнение программы приостанавливается, чтобы Вы могли увидеть результаты и прочитать сообщение в информационном окне.



(рассказать и показать лабораторную работу)


База данных защищена авторским правом ©refedu.ru 2016
обратиться к администрации

    Главная страница