Оператор For Each... Next (Visual Basic). Vba цикл for


Оператор For Each... Next (Visual Basic)

Когда выписка For Each…Next выполняется, Visual Basic возвращает коллекцию только один раз, перед началом цикла. Если блок выписки изменяет element или group, то эти изменения не влияют на итерации цикла.

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

Если element не было объявлено вне этого цикла, необходимо объявить его в инструкцию For Each. Можно объявить тип element явным образом при помощи оператора As, или можно использовать определение типа для назначения типа. В этом случае областью действия element является основная часть цикла. В то же время нельзя определять element и внутри, и снаружи цикла.

Можно дополнительно указать element в инструкции Next. Это повышает удобочитаемость программы, особенно если в ней имеются вложенные циклы For Each. При этом следует указать ту же переменную, что и в соответствующем операторе For Each.

Можно избежать изменения значения element внутри цикла. Это может сделать его более сложным для чтения и отладку кода. Изменение значения group не влияет на коллекцию или элементы, которые были определены при цикл сначала был введен.

Если циклы вложения, если выписка Next внешнего уровень вложенности обнаружении перед Next внутреннего уровня, компилятор сигнализирует об ошибке. При этом компилятор может обнаружить эту ошибку только в том случае, если в каждой инструкции Next указан element.

Если код зависит от переместить коллекцию в определенном порядке, цикл For Each…Next нет рекомендуемые варианта, если не требуется знать характеристики объекта перечислителя коллекции предоставляет. Порядок обхода не определен Visual Basic, но методом MoveNext объекта перечислителя. Это означает, что пользователь не может задать, какой элемент должен быть первым записан в element, или какой элемент должен следовать за каким-либо элементом. С помощью другой циклической структуры, например For...Next или Do...Loop, можно добиться более надежных результатов.

Тип данных element должен быть таким, чтобы тип данных элементов в group мог быть преобразован к нему.

Тип данных group должен быть ссылочным типом, который ссылается на коллекцию или массив, который доступен для перечисления. Чаще всего это означает, что group ссылается на объект, реализующий интерфейс IEnumerable из пространства имен System.Collections или интерфейс IEnumerable из пространства имен System.Collections.Generic. System.Collections.IEnumerable задает метод GetEnumerator, который возвращает объект перечислителя для коллекции. Объект перечислителя реализует интерфейс System.Collections.IEnumerator пространства имен System.Collections, а также имеет свойство Current, методы Reset и MoveNext. Visual Basic использует их для перемещения по коллекции.

Если Option Strict равно On, сужающее преобразование обычно вызывает ошибки компилятора. Однако в операторе For Each преобразования из элементов group в element оцениваются и выполняются во время выполнения и ошибка компилятора, вызванная сужающим преобразованием, может быть подавлена.

В следующем примере, назначения m как начальное значение для n не будет компилироваться при Option Strict, поскольку преобразование Long в Integer сужающее преобразование. В оператореFor Each однако, не ошибка компилятора сообщается, даже несмотря на то, что присвоение number требует того же преобразования из Long в Integer. В операторе For Each , содержащем большое число, то во время выполнения возникает ошибка, когда к большому числу применяется ToInteger.

Option Strict On  Module Module1 Sub Main() ' The assignment of m to n causes a compiler error when   ' Option Strict is on.  Dim m As Long = 987 'Dim n As Integer = m  ' The For Each loop requires the same conversion but  ' causes no errors, even when Option Strict is on.  For Each number As Integer In New Long() {45, 3, 987} Console.Write(number & " ") Next Console.WriteLine() ' Output: 45 3 987  ' Here a run-time error is raised because 9876543210  ' is too large for type Integer.  'For Each number As Integer In New Long() {45, 3, 9876543210}  ' Console.Write(number & " ")  'Next Console.ReadKey() End Sub  End Module

В начале выполнения цикла For Each...Next Visual Basic проверяет, на допустимую ли коллекцию объектов ссылается group. Если это не так, то создается исключение. В противном случае вызывается метод MoveNext и свойство Current объекта перечислителя, возвращающее первый элемент. Если MoveNext указывает, что следующий элемент отсутствует, то есть коллекция пуста, то цикл For Each останавливается и управление передается оператору, следующему за оператором Next. В противном случае Visual Basic присваивает element значение первого элемента и выполняет блок операторов.

Каждый раз, обнаруживая инструкцию Next, Visual Basic возвращается на инструкцию For Each. Снова для получения следующего элемента вызывается метод MoveNext и свойство Current, и снова в зависимости от результата либо выполняется блок, либо цикл останавливается. Этот процесс продолжается до тех пор, пока метод MoveNext не укажет на отсутствие следующего элемента, или пока не встретится оператор Exit For.

Изменение коллекции. Возвращает объект перечислителя GetEnumerator обычно не позволяет изменять коллекцию путем добавления, удаления и переупорядочивания заменить все элементы. Если пользователь изменит коллекцию после запуска цикла For Each...Next, то объект перечислителя станет недействительным, и следующая попытка обращения к элементу коллекции вызовет исключение InvalidOperationException.

Однако эта блокировка изменения не указана, Visual Basic, а реализацией интерфейса IEnumerable. Можно реализовать IEnumerable таким образом, чтобы сделать изменение коллекции во время итерации возможным. Если планируется производить такие динамические изменения, то необходимо определить характер реализации IEnumerable используемой коллекции.

Изменение элементов коллекции. Свойство объекта перечисления Current имеет модификатор ReadOnly (Visual Basic) и возвращает локальную копию каждого элемента коллекции. Это означает, что в цикле For Each...Next нельзя изменить сами элементы. Любые изменения, сделанные влияет только на локальную копию из Current и обратно не отражены в базовую коллекцию. Тем не менее, если элемент имеет ссылочный тип, то можно изменять члены экземпляра, на который он указывает. Следующий пример изменяет элемент BackColor каждого элемента thisControl. Нельзя изменить, однако сам оператор thisControl.

Sub lightBlueBackground(ByVal thisForm As System.Windows.Forms.Form) For Each thisControl As System.Windows.Forms.Control In thisForm.Controls thisControl.BackColor = System.Drawing.Color.LightBlue Next thisControl End Sub

В предыдущем примере можно изменить член BackColor каждого элемента thisControl, несмотря на то, что нельзя изменить сам thisControl .

Обход массива. Поскольку класс Array реализует интерфейс IEnumerable, все массивы имеют метод GetEnumerator. Это означает, что с помощью цикла For Each... Next можно перебирать и массивы. Тем не менее, элементы массива можно только считывать. Это изменить нельзя.

msdn.microsoft.com

Повторение под управлением циклов For...Next. VBA для чайников

Повторение под управлением циклов For...Next

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

Упрощенно синтаксис структуры For. . . Next можно представить так:

For счетчик = начало То конец

(операторы, выполняющиеся при каждом проходе цикла)

Next счетчик

В следующем примере для отображения сообщения при каждом проходе цикла в процедуре используется окно Immediate (в редакторе Visual Basic окно Immediate открывается нажатием клавиш <Ctrl+G>):

Sub CountToTen()

Dim j As Integer

For j = 1 To 10

Debug.Print "Дубль № " & j

Next j

End Sub

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

Важные замечания по поводу циклов For.. .Next

Старайтесь, чтобы ваш программный код всегда оставался понятным. Используйте 1 в качестве начального значения для цикла For. . . Next, если только у вас нет серьезных причин выбрать для этого другое число.

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

В операторе Next счетчик, завершающем цикл For. . . Next, имя переменной-счетчика указывать не обязательно - ключевое слово Next автоматически вычислит следующее значение счетчика и отошлет VBA в начало структуры. Однако определенно стоит приучить себя включать имя счетчика в оператор Next.

Тогда даже в случае нескольких вложенных циклов For. . .Next вы всегда сможете с первого взгляда сказать, какому циклу принадлежит данный оператор Next. He меняйте значение счетчика внутри цикла For. . .Next. Поскольку счетчик является обычной переменной, можно - а иногда и заманчиво - создать программный код, меняющий значение счетчика. Не поддавайтесь!

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

Хотя и можно значение конец для цикла For . . . Next задать переменной, изменение значения такой переменной после начала выполнения цикла не повлияет на процесс выполнения. Цикл все равно будет выполнен столько раз, сколько задано оригинальным значением конец.

Поделитесь на страничке

Следующая глава >

it.wikireading.ru

Урок 10 по VBA - Цикл for each

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

Именно для таких случае был придуман цикл vba for each next, который содержит следующий синтаксис:

For Each элемент In коллекция[exit for]Операторы[exit for]Next элемент

Как видим, синтаксис довольно схож с циклом for next, но тут не надо задавать начальные и конечные значения, а также отсутствует шаг счетчика.

Элемент – это переменная, которая будет хранить значение при каждой итерации (переборе коллекции)

Коллекция – собственно, то, что нам надо обработать

Как видим, тут тоже можно использовать выражение Exit For для выхода из цикла.

Давайте рассмотрим такой пример: в редакторе кода VBA создадим форму с именем SubForm, на поверхность формы добавим три объекта:

Текстовая метка – объект Label, разместите метку в самом верху, она нужна лишь для информирования

Список – объект List, в нем будет выводиться список всех папок на диске D.

Кнопка – объект CommandButton, при нажатии на кнопку будет вызываться соответствующая подпрограмма.

Внешний вид формы можно увидеть на рисунке.

Также нам надо добавить в редактор новый модуль (макрос), выберите в меню Insert пункт Module, имя модуля пусть будет SubModule. В редакторе кода для модуля пропишите:

Sub SubModule()     SubForm.Show End Sub

Этот код связывает макрос и форму, при запуске макроса произойдет вывод формы (свойство Show).

Теперь настало самое интересно, в редакторе кода для формы пропишите:

Private Sub GetFolders()     ' формируем ссылку на объект FileSystemObject     Set FSO = CreateObject("Scripting.FileSystemObject")     ' получаем доступ к диску D:\     Set Drive = FSO.GetFolder("D:\")     ' фрмируем коллекцию каталогов     Set Folders = Drive.SubFolders       'устанавливаем свойства списка     With ListBox1         .ColumnHeads = False         .MultiSelect = fmMultiSelectSingle     End With       'Начинаем перебор коллекции     For Each Folder In Folders         ListBox1.AddItem Folder.Name     Next   End Sub Private Sub CommandButton1_Click()     'Вызываем процедуру     Call GetFolders End Sub   Private Sub UserForm_Initialize()     Label1.Caption = "Списк каталогов на D:\\"     Label1.FontSize = 15     Label1.ForeColor = vbBlue       CommandButton1.Caption = "Список" End Sub

В самом начале мы объявили процедуру GetFolder, в которой происходит подключение внешнего объект Scripting.FileSystemObject (ознакомится с методами и свойствами данного компонента можно в статье “Объект FileSystemObect”), он отвечает за работу с файловой системой. Далее происходит доступ к диску D и получение коллекции все папок, хранящихся на нем (Drive.SubFolders). Хорошо, теперь переменная Folders является коллекцией и ее можно обработать с помощью цикла for each vba языка. Обратите внимание, что ссылка на объект создается с помощью ключевого слова set. Что бы заполнить список (ListBox), мы используем метод AddItem, после которого следует строка Folder.Name – имя папки.

А вот пример вывода списка специальных папок Windows (специальные папки – папки, которые автоматически создаются системой: мои документы, каталог со шрифтами, системный каталог и так далее):

Private Sub GetFolders() Dim WshShell, SpecObj, i     ' формируем ссылку на объект Wscript.Shell     Set WshShell = CreateObject("Wscript.Shell")     ' получаем доступ к специальным папкам     Set SpecObj = WshShell.SpecialFolders       'устанавливаем свойства списка     With ListBox1         .ColumnHeads = False         .MultiSelect = fmMultiSelectSingle     End With       'Начинаем перебор коллекции     For Each i In SpecObj         ListBox1.AddItem i     Next   End Sub

Тут мы использовали объект WScript.Shell для получения списка специальных папок, ознакомится с его методами и свойствами можно в статье (объект Wscript.Shell). И так, в следующей статье мы рассмотрим цикл do loop языка Visual Basic for Applications, который позволяет задавать условие выполнения операций.

scriptcoding.ru

Работа с циклами в VBA:loop, for each, for next

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

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

Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз. Ниже приведен общий вид оператора цикла в VBA.

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

for цикл

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

Синтаксис

Ниже приведен синтаксис цикла for в VBA.

For counter = start To end [Step stepcount] [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] .... [statement n] Next

Диаграмма потока

Ниже приведен поток управления в режиме Loop -

  • Первый шаг выполняется. Этот шаг позволяет инициализировать любые переменные управления контурами и увеличивать переменную счетчика шагов.
  • Во-вторых, условие оценивается. Если это правда, выполняется тело цикла. Если оно ложно, тело цикла не выполняется, и поток управления переходит к следующему оператору сразу после цикла For.
  • После выполнения цикла цикла For поток управления переходит к следующему оператору. Этот оператор позволяет вам обновлять любые переменные управления циклом. Он обновляется на основе значения счетчика шагов.
  • Условие теперь оценивается снова. Если это правда, цикл выполняется, и процесс повторяется (тело цикла, затем увеличивают шаг, а затем снова условие). После того, как условие становится ложным, цикл For заканчивается.

пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 MsgBox "The value is i is : " & i Next End Sub

Когда приведенный выше код компилируется и выполняется, он производит следующий результат.

The value is i is : 0The value is i is : 2The value is i is : 4The value is i is : 6The value is i is : 8The value is i is : 10

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

for ... loop

Для каждого цикла используется для выполнения оператора или группы операторов для каждого элемента в массиве или коллекции.

Для каждого цикла аналогичен For Loop; однако цикл выполняется для каждого элемента в массиве или группе. Следовательно, счетчик шагов не будет существовать в этом типе цикла. Он в основном используется с массивами или используется в контексте объектов файловой системы, чтобы работать рекурсивно.

Синтаксис

Ниже приведен синтаксис цикла For Each в VBA.

For Each element In Group [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] Next

пример

Private Sub Constant_demo_Click() 'fruits is an array fruits = Array("apple", "orange", "cherries") Dim fruitnames As Variant 'iterating using For each loop. For Each Item In fruits fruitnames = fruitnames & Item & Chr(10) Next MsgBox fruitnames End Sub

Когда вышеуказанный код выполняется, он печатает все имена фруктов с одним элементом в каждой строке.

appleorangecherries

Это выполняется, если в группе есть хотя бы один элемент и повторяется для каждого элемента в группе.

while..wend loop

В цикле While While ... Wend , если условие равно True, все операторы выполняются до тех пор, пока не встретится ключевое слово Wend.

Если условие ложно, цикл завершается, и элемент управления переходит к следующему оператору после ключевого слова Wend .

Синтаксис

Ниже приведен синтаксис цикла While..Wend в VBA.

While condition(s) [statements 1] [statements 2] ... [statements n] Wend

Диаграмма потока

пример

Private Sub Constant_demo_Click() Dim Counter : Counter = 10 While Counter < 15 ' Test value of Counter. Counter = Counter + 1 ' Increment Counter. msgbox "The Current Value of the Counter is : " & Counter Wend ' While loop exits if Counter Value becomes 15. End Sub

Когда вышеуказанный код выполняется, он выводит следующее в поле сообщения.

The Current Value of the Counter is : 11The Current Value of the Counter is : 12The Current Value of the Counter is : 13The Current Value of the Counter is : 14The Current Value of the Counter is : 15

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

Цикл do..while

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

Синтаксис

Ниже приведен синтаксис цикла Do ... While в VBA.

Do While condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop

Диаграмма потока

пример

В следующем примере используется цикл Do ... while для проверки состояния в начале цикла. Операторы внутри цикла выполняются, только если условие становится True.

Private Sub Constant_demo_Click() Do While i < 5 i = i + 1 msgbox "The value of i is : " & i Loop End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 1The value of i is : 2The value of i is : 3The value of i is : 4The value of i is : 5

Альтернативный синтаксис

Существует также альтернативный синтаксис для Do ... while loop, который проверяет состояние в конце цикла. Основное различие между этими двумя синтаксисами объясняется в следующем примере.

Do [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop While condition

пример

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

Private Sub Constant_demo_Click() i = 10 Do i = i + 1 MsgBox "The value of i is : " & i Loop While i < 3 'Condition is false.Hence loop is executed once. End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 11

Операторы do..While будут выполняться до тех пор, пока условие равно True. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет False.

do..intil loop

Do ... intil цикл не будет использован, когда мы хотим повторить набор операторов, пока условие ложно. Условие может быть проверено в начале цикла или в конце цикла.

Синтаксис

Ниже приведен синтаксис цикла Do..Until в VBA.

Do Until condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop

Диаграмма потока

пример

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

Private Sub Constant_demo_Click() i = 10 Do Until i>15 'Condition is False.Hence loop will be executed i = i + 1 msgbox ("The value of i is : " & i) Loop End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 11The value of i is : 12The value of i is : 13The value of i is : 14The value of i is : 15The value of i is : 16

Альтернативный синтаксис

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

Do [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop Until condition

Диаграмма потока

пример

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

Private Sub Constant_demo_Click() i = 10 Do i = i + 1 msgbox "The value of i is : " & i Loop Until i<15 'Condition is True.Hence loop is executed once. End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 11

Операторы do..Until будут выполняться до тех пор, пока условие False. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет истинным.

Записи управления циклом

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

Контрольное заявление и описание

Выход для оператора

Выход for используется , когда мы хотим , чтобы выйти из For Loop на основе определенных критериев. Когда Exit For выполняется, управление переходит к следующему оператору сразу после цикла For Loop.

Синтаксис

Ниже приведен синтаксис Exit For Statement в VBA.

Диаграмма потока

пример

В следующем примере используется Exit For . Если значение счетчика достигает 4, цикл For Loop завершается, и управление переходит к следующему утверждению сразу после цикла For Loop.

Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 'i is the counter variable and it is incremented by 2 MsgBox ("The value is i is : " & i) If i = 4 Then i = i * 10 'This is executed only if i=4 MsgBox ("The value is i is : " & i) Exit For 'Exited when i=4 End If Next End Sub

Когда вышеуказанный код выполняется, он печатает следующий вывод в окне сообщений.

The value is i is : 0The value is i is : 2The value is i is : 4The value is i is : 40

Завершает оператор цикла For и передает выполнение в оператор сразу после цикла

Exit Do

Exit Do Заявление используется , когда мы хотим , чтобы выйти из Do Loops на основе определенных критериев. Он может использоваться как в Do Do ... While, так и Do ... До циклов.

Когда Exit Do выполняется, управление переходит к следующему оператору сразу после Do Loop.

Синтаксис

Ниже приведен синтаксис выражения Exit Do в VBA.

пример

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

Private Sub Constant_demo_Click() i = 0 Do While i <= 100 If i > 10 Then Exit Do ' Loop Exits if i>10 End If MsgBox ("The Value of i is : " & i) i = i + 2 Loop End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The Value of i is : 0The Value of i is : 2The Value of i is : 4The Value of i is : 6The Value of i is : 8The Value of i is : 10

Завершает оператор Do While и передает выполнение в оператор сразу после цикла

 С уважением, авторы сайта Компьютерапия

Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

maxfad.ru