Макросы excel цикл в цикле

 

mjpv

Пользователь

Сообщений: 88
Регистрация: 01.01.1970

Dim K, I As Long  
   For K = 1 To 5  
   Workbooks.OpenText Filename:=»D:11Дельта 12 х 2 м16 m» & Format(K, «00») & «.txt», Origin:=866, _  
       StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _  
       ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=True, Comma:=False, _  
       Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array( _  
       3, 1), Array(4, 1), Array(5, 1), Array(6, 1)), TrailingMinusNumbers:=True  
   Range(«A2:E32761»).Select  
   Selection.Copy  
   Windows(«1.xlsm»).Activate  
   Range(«A1»).Select  
   ActiveSheet.Paste  
   Windows(Format(K, «00») & «.txt»).Activate  
   Application.CutCopyMode = False  
   ActiveWorkbook.Close  
For I = 0 To 359  
   Range(«E» & (I + 1) + I * 90 & «:E» & I + I * 90).Select  
   Selection.Copy  
   Range(«F» & 1 + I * 90).Select  
   ActiveSheet.Paste  
Next I  
Next K  

  Не работает, подозреваю, что неправильно организовал цикл в цикле, в частости  
не знаю на счет Next. Раньше пользовался только последовательными циклами.

Анна100,

Прикрепите файл…..

Добавлено через 2 минуты
Объясните, что нужно сделать…
Т.к из того , что вы написали- ничего не понятно….

Добавлено через 4 минуты
Еще вот в этом куске:
Для чего нужен цикл по i ?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
For i = 1 To 12
Do Until Worksheets("Test").Cells(n + 3, 1).Value <> 1
If Worksheets("Test").Cells(n + 3, 1).Value = 1 Then
Worksheets("Test").Cells(n + 3, 9).Value = m1
 
ElseIf Worksheets("Test").Cells(n + 3, 1).Value = 2 Then
Worksheets("Test").Cells(n + 3, 9).Value = Application.Average(m1, m2)
 
ElseIf Worksheets("Test").Cells(n + 3, 1).Value = 3 Then
Worksheets("Test").Cells(n + 3, 9).Value = Application.Average(m1, m2, m3)
 
ElseIf Worksheets("Test").Cells(n + 3, 1).Value = 4 Then
Worksheets("Test").Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4)
 
ElseIf Worksheets("Test").Cells(n + 3, 1).Value = 5 Then
Worksheets("Test").Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5)
 
ElseIf Worksheets("Test").Cells(n + 3, 1).Value = 6 Then
Worksheets("Test").Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6)
 
ElseIf Worksheets("Test").Cells(n + 3, 1).Value = 7 Then
Worksheets("Test").Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6, m7)
 
ElseIf Worksheets("Test").Cells(n + 3, 1).Value = 8 Then
Worksheets("Test").Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6, m7)
End If
Loop
Next i

Добавлено через 33 минуты
Опять же мысли вслух…..

Если исходить , что
m1 = .Cells(n + 3, 8).Value
m2 = .Cells(n + 3 — 35, 8).Value
m3 = .Cells(n + 3 — 70, 8).Value
m4 = .Cells(n + 3 — 105, 8).Value
m5 = .Cells(n + 3 — 140, 8).Value
m6 = .Cells(n + 3 — 175, 8).Value
m7 = .Cells(n + 3 — 210, 8).Value
m8 = .Cells(n + 3 — 70, 8).Value
m9 = .Cells(n + 3 — 105, 8).Value
m10 = .Cells(n + 3 — 140, 8).Value
m11 = .Cells(n + 3 — 175, 8).Value
m12 = .Cells(n + 3 — 210, 8).Value

Должен быть не «минус» а «плюс» и для чего-то есть неиспользуемый Arr(1 to 12) то можно вместо вышеприведенного написать

Visual Basic
1
2
3
4
5
 Dim M(1 To 12) As Double
 
 For i = 1 To 12
       M(i) = .Cells(i + 3 + i * 35, 8).Value
   Next i

И считая,что в последней строке должно быть до 8 ( видно Аннушка

разлила масло

сделала очепятку..)

Цитата
Сообщение от Анна100
Посмотреть сообщение

ElseIf Worksheets(«Test»).Cells(n + 3, 1).Value = 7 Then
Worksheets(«Test»).Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6, m7)
ElseIf Worksheets(«Test»).Cells(n + 3, 1).Value = 8 Then
Worksheets(«Test»).Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6, m7)

кусок

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
If .Cells(n + 3, 1).Value = 1 Then
                            .Cells(n + 3, 9).Value = m1
 
                        ElseIf .Cells(n + 3, 1).Value = 2 Then
                            .Cells(n + 3, 9).Value = Application.Average(m1, m2)
 
                        ElseIf .Cells(n + 3, 1).Value = 3 Then
                            .Cells(n + 3, 9).Value = Application.Average(m1, m2, m3)
 
                        ElseIf .Cells(n + 3, 1).Value = 4 Then
                            .Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4)
 
                        ElseIf .Cells(n + 3, 1).Value = 5 Then
                            .Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5)
 
                        ElseIf .Cells(n + 3, 1).Value = 6 Then
                            .Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6)
 
                        ElseIf .Cells(n + 3, 1).Value = 7 Then
                            .Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6, m7)
 
                        ElseIf .Cells(n + 3, 1).Value = 8 Then
                            .Cells(n + 3, 9).Value = Application.Average(m1, m2, m3, m4, m5, m6, m7)

можно заменить на

Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim SUMM as double
For i = 1 To 8
     If .Cells(n + 3, 1).Value = i Then
       SUMM = 0
       For j = 1 To i
         SUMM = SUMM + M(j)
         .Cells(n + 3, 9).Value = SUMM / j
       Next j
     End If
   Next i

В любом случае все точки над «I» можно поставить после прикрепленного файла и разбора деталей задания.



0



На чтение 14 мин. Просмотров 18.6k.

Итог: циклы For Next — одни из самых мощных методов VBA для автоматизации общих задач в Excel. В этой статье объясняется, как работает цикл, повторяющий действия над коллекцией элементов, что экономит нам массу времени.

Уровень мастерства: Средний

For Next Code Loop Explained for VBA Excel

Содержание

  1. Сила циклов VBA
  2. Как работает цикл For Next?
  3. Два типа циклов For Next
  4. The For Each Next Loop: цикл по коллекции элементов
  5. В каком порядке работает цикл For Each?
  6. Предметы / объекты НЕ выбираются в цикле
  7. The Next Loop: циклы через набор чисел
  8. Обратный цикл
  9. Как остановить цикл раньше
  10. Переменная не требуется после ключевого слова Next
  11. Примеры макросов VBA для циклов
  12. Какую задачу хотите зациклить вы?

Сила циклов VBA

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

Можете ли вы вспомнить несколько задач, в которых вам
приходилось повторять один и тот же процесс снова и снова?

Эти задачи чрезвычайно трудоемкие и скучные!

Repetitive Excel Tasks Get Boring - VBA Loop

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

Цикл For Next — это наиболее распространенный тип цикла,
который помогает нам выполнять эти повторяющиеся задания. В этой статье мы
рассмотрим два типа For Next Loops.

Загрузите файл примера

Загрузите бесплатный файл Excel, содержащий примеры макросов
с помощью цикла For Next.

For Next Loop VBA Macro Examples.xlsm (79.0 KB)

Скачать PDF версию статьи на английском для печати.

Как работает цикл For Next?

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

Примеры коллекций:

  • Клетки в ассортименте.
  • Рабочие листы в рабочей тетради.
  • Открытые рабочие тетради на компьютере.
  • Сводные таблицы на листе.
  • Сводные поля в сводной таблице.
  • Формы на листе.
  • И любой другой объект, с которым вы взаимодействуете в Excel.

Задача цикла For Next Loop состоит в том, чтобы выполнять
одинаковые действия (строки кода) для каждого элемента в коллекции.

How a For Next Loop Works in VBA

В приведенном ниже примере содержится цикл For Next, который
проходит по каждому листу в книге и отображает каждый лист. Цикл начинается с
первого элемента в коллекции (первый лист в рабочей книге) и выполняет строку
кода между строками For и Next для каждого элемента в коллекции (каждый лист в
рабочей книге).

Sub Unhide_Multiple_Sheets()

Dim ws As Worksheet
    
    For Each ws In ActiveWorkbook.Worksheets
        ws.Visible = xlSheetVisible
    Next ws

End Sub

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

Следующий макрос отображает только те листы, которые имеют фразу «ABC Global Co.» в ячейке A1 каждого листа, и скрывает все остальные листы.

Sub Unhide_Report_Sheets()

Dim ws As Worksheet
    
    For Each ws In ActiveWorkbook.Worksheets
        If ws.Range("A1").Value = "ABC Global Co." Then
            ws.Visible = xlSheetVisible
        Else
            ws.Visible = xlSheetHidden
        End If
    Next ws

End Sub

Два типа циклов For Next

Действительно, существуют два типа For Next Loops.

  1. For Each Next
    Loops циклически просматривает коллекцию элементов.
  2. For Next Loops
    цикл через набор чисел.

Давайте посмотрим, как работает
каждый.

The For Each Next Loop: цикл по коллекции элементов

Как мы видели выше, цикл «The For Each Next Loop» позволяет нам перебирать коллекцию предметов или объектов. Это, наверное, самый распространенный цикл, который мы используем в Excel, потому что мы работаем с коллекциями объектов. Опять же, эти коллекции представляют собой ячейки в диапазоне, рабочие таблицы в рабочей книге, сводные таблицы в рабочей таблице и т.д.

For Each Next Loop Loops Through All Items Worksheets in a Collection

Мы будем использовать пример написания цикла «For Each Next Loop», чтобы просмотреть все рабочие листы в рабочей книге.

The For Each Next Loop Explained for Excel VBA

Существует четыре основных шага для написания цикла For Each Next в VBA:

  1. Объявите переменную для объекта.
  2. Напишите для каждой строки переменную и коллекцию
    ссылок.
  3. Добавьте строку (и) кода для повтора для каждого
    элемента в коллекции.
  4. Напишите следующую строку, чтобы закрыть цикл.

Давайте рассмотрим каждый из этих шагов подробно.

Шаг 1 — объявить переменную для объекта

Сначала нам нужно объявить переменную, которая будет
временно хранить ссылку на объект.

Строка Dim в верхней части макроса объявляет переменную, как объект. В этом случае объект является рабочим листом. Мы можем создать любое имя переменной, если захотим, если оно не совпадает с другой ссылкой в VBA. «Ws» — наиболее распространенное имя переменной для объекта листа, но вы можете изменить его.

Шаг 2 — Для каждой строки

Далее мы напишем оператор For Each. Это первая строка кода в цикле.

For Each ws In ActiveWorkbook.Worksheets

Первые два слова For Each. Затем мы вводим имя переменной, за которым следует слово In. Наконец, мы указываем, где располагается коллекция. В этом случае мы хотим просмотреть все рабочие листы в ActiveWorkbook. Итак, мы набираем ActiveWorkbook.Worksheets. Эта строка ссылается на все рабочие листы в ActiveWorkbook.

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

For Each ws In Workbooks("Book2.xlsx").Worksheets

Просто помните, что рабочая книга, на которую вы ссылаетесь,
должна быть открыта до запуска строки кода For Next. Конечно, мы можем
использовать метод Workbooks.Open, чтобы открыть рабочую книгу.

Шаг 3 — Добавить код для повторения для каждой итерации

После строки «For Each» мы добавляем строку(и) кода, которая будет выполняться на каждом листе. В этом примере у нас есть только одна строка кода, которая показывает лист.

ws.Visible = xlSheetVisible

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

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

Однако нам НЕ нужна эта строка с циклом For Each Next. Цикл
заботится о настройке переменной для нас для каждой итерации в цикле.

Для первой итерации в цикле ws установлен на Worksheets (1).
На следующей итерации ws устанавливается в Worksheets (2). Это продолжается,
пока цикл перебирает все листы в рабочей книге. Это очень мощно, потому что мы
можем повторно использовать переменную для ссылки на лист в цикле несколько
раз.

Шаг 4 — Next закрывает цикл

Последняя строка кода в цикле — Next.

Когда макрос попадает в эту строку кода, он делает две вещи:

  1. Во-первых, он изменяет ссылку на переменную на следующий элемент коллекции. В этом примере переменная ws изменяется для ссылки на следующий лист в рабочей книге.
  2. Во-вторых, он возвращается к выполнению строки кода непосредственно под строкой For Each. Затем он выполняет все строки кода между строками For Each и Next в порядке сверху вниз.

What Happens When the Next Line Runs in a Loop Excel VBA

Когда будет достигнут последний элемент в коллекции (рабочий лист в рабочей книге), цикл останавливается, и макрос переходит к следующей строке кода ниже строки Next.

В каком порядке работает цикл For Each?

Цикл For Each Loop всегда начинается с первого элемента в коллекции и переходит к последнему элементу в том порядке, в котором они отображаются в Excel. Это основано на номере индекса предметов в коллекции. Вот несколько примеров порядка выполнения цикла для общих объектов.

  • Рабочие листы. Начинается с первой вкладки листа в рабочей книге и возвращается к последней в том порядке, в котором вкладки отображаются в рабочей книге.
  • Рабочие книги. Начинается с первой открытой книги и циклически повторяется в порядке открытия рабочих книг. Рабочим книгам присваивается порядковый номер по мере их открытия.
  • Клетки: циклы слева направо, затем вниз. Начинается с первой ячейки в диапазоне и возвращается к следующему столбцу в той же строке, затем переходит к следующей строке.
  • Таблицы и сводные таблицы. Начинается с первого объекта, созданного на листе, и циклически повторяется в порядке создания объектов. Этот же принцип действует и для других объектов, которые вы создаете на листах, таких как фигуры, диаграммы, слайсеры и т.д.

Предметы / объекты НЕ выбираются в цикле

Важно отметить, что когда мы перебираем коллекцию объектов, каждый объект НЕ выделяется в Excel.

VBA For Each примеры

Цикл создает ссылку на элемент/объект с помощью переменной. Переменная временно установлена на ссылку на объект. Объект НЕ выбран и НЕ обязательно становится активным объектом. Для выбора объекта мы можем использовать методы Select или Activate. Вы также должны убедиться, что объекты родительского объекта выбраны первыми. Ознакомьтесь с моей статьей об объектной модели Excel и иерархии объектов в VBA, чтобы узнать больше об этом.

The Next Loop: циклы через набор чисел

Также можно использовать цикл For Next Loop для просмотра набора чисел. Это может быть полезно, когда мы перебираем элементы управления пользовательской формы, массивы или если мы хотим перебрать коллекцию в обратном направлении.

VBA For Each примеры

Основная операция цикла For Next такая же, как и для цикла
For Each. Разница заключается в формате строки For.

Шаг 1 — Объявление переменной для числа

Чтобы перебрать набор чисел, мы сначала должны объявить переменную для целого числа типа данных. Мы можем использовать Integer или Long integer.

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

Дополнительное примечание к Long: тип данных Long (целое число) содержит большее число, чем Integer. Это занимает больше памяти, но для современного компьютера это не проблема. Мы можем использовать длинные переменные все время. Буква L выглядит как цифра 1 в VBA, поэтому я теперь использую i в качестве имени переменной, хотя я использую Long в качестве типа данных. Это все зависит от личных предпочтений, и вы можете назвать переменную как хотите.

Шаг 2 — Напишите строку For

Далее мы пишем строку For. Базовая конструкция — это ключевое слово For, за которым следует имя переменной (counter), затем знак равенства, начальное значение To end value.

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

For i = 1 To ActiveWorkbook.Worksheets.Count

Эта строка кода возвращает количество листов в активной книге. Тем не менее, он не проходит по каждому листу. Цикл просто перебирает набор чисел. Мы должны создать ссылку на лист с переменной счетчика (i) в качестве номера индекса свойства Worksheets. Шаг 3 показывает эту ссылку.

Шаг 3 — Добавить код, который повторяется для каждой итерации

Остальная часть цикла работает так же, как цикл For Each. Мы можем добавить строки между строками For и Next, которые будут выполняться для каждой итерации цикла. Переменная counter может быть использована несколько раз в этих строках кода.

Worksheets(i).Visible = True

Шаг 4 — Строка Next закрывает цикл

Наконец, мы добавляем строку Next внизу.

Когда макрос запускается, он устанавливает переменную, равную первому числу в строке For. Когда макрос попадает в следующую строку, он добавляет 1 к значению переменной или увеличивает счет. Итак, я = 2 во второй итерации цикла. Он продолжает цикл, пока не будет достигнут последний номер в цикле.

По умолчанию 1 добавляется к счетчику переменных для каждой итерации в цикле. Это называется значением шага, и мы можем контролировать значение каждого шага в счетчике. Значение Step добавляется в конец строки For. Следующая строка добавит 2 к счетчику для каждой итерации в цикле.

Если вы хотите заштриховать все остальные строки на листе, вы можете использовать такой цикл.

Обратный цикл

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

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

Ключевое слово Step не является обязательным. Если вы не укажете его, тогда VBA примет значение шага 1.

Цикл в обратном направлении — это хорошо, если вы удаляете элементы.

Я напишу отдельный пост об этом, но общая идея заключается в том, что когда мы перебираем коллекцию и удаляем элементы, размер коллекции уменьшается при удалении элементов. Цикл обычно выдает ошибку, как только достигает 10-го элемента, когда в коллекции теперь только 9 элементов. Цикл в обратном направлении предотвращает эту потенциальную ошибку.

Как остановить цикл раньше

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

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

Sub Unhide_First_Sheet_Exit_For()
' Отображает первый лист, который содержит определенную фразу
' в имени листа, затем выходит из цикла.

Dim ws As Worksheet
    
    For Each ws In ActiveWorkbook.Worksheets
    
        ' Найдите лист, который начинается со слова «Отчет»
        If Left(ws.Name, 6) = "Report" Then
            
            ws.Visible = xlSheetVisible
            
            ' Выход из цикла после того, как первый лист найден
            Exit For
        
        End If
    Next ws

End Sub

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

VBA For Each примеры

Переменная не требуется после ключевого слова Next

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

Это НЕ обязательно, и вы можете не увидеть его в других примерах, которые вы найдете в Интернете. Однако мне нравится включать переменную после Next по двум причинам.

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

VBA For Each примеры

Поэтому я рекомендую добавить переменную после ключевого слова Next в качестве лучшей практики. Немного дополнительной работы заранее сэкономит время и головную боль в будущем. Доверьтесь мне!

Примеры макросов VBA для циклов

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

3 способа показать несколько листов в учебнике по Excel + VBA

Автоматическое форматирование чисел по умолчанию в сводных таблицах Excel

3 совета, как сохранить и закрыть все открытые файлы книги Excel + макрос

Макрос метрики SUBTOTAL — создание сводной таблицы всех
типов функций

Как добавить оглавление Галерея изображений в файлы Excel

Скрыть и отобразить (отфильтровать) столбцы с помощью
слайсера или раскрывающегося меню фильтра

Фильтрация сводной таблицы или среза по самой последней дате или периоду

Как изменить размер панелей Excel для разных размеров экрана

Преобразование сводной таблицы в формулы SUMIFS + бесплатный макрос VBA

Макрос VBA, чтобы скрыть все столбцы, которые содержат
значение в ячейке

Как повторять задачи с помощью кода VBA — Looping — Отличная статья с большим количеством примеров от моего друга Криса Ньюмана из The Spreadsheet Guru.

Какую задачу хотите зациклить вы?

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

For Next Loop VBA Macro Examples.xlsm (79.0 KB)

Циклы, безусловно, являются промежуточной техникой кодирования, которая вынуждает нас выйти за рамки MacroRecorder. К сожалению, записанный макрос не может создавать петли. Тем не менее, это навык, который вы сможете использовать снова и снова на протяжении всей своей карьеры для автоматизации простых и сложных задач. Понимание того, как использовать циклы, даст вам волшебную силу с Excel.

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

7.1 Операторы цикла
7.2 Вложенные циклы


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

Циклы позволяют выполнить одну или несколько строк кода несколько раз. VBA поддерживает следующие циклы:

For...Next
For Each...Next
Do... Loop

Конструкция For . . . Next. Когда число повторений известно заранее, используют цикл For . . . Next. В цикле For используется переменная, называемая переменной цикла или счетчиком цикла, которая увеличивается или уменьшается на заданную величину при каждом повторении цикла. Синтаксис этой конструкции следующий:

For counter = start To end [Step increment]
 операторы 
Next [counter]

Параметры counter (счетчик), start (начало цикла), end (конец цикла) и increment (приращение) являются числовыми.

Примечание. Параметр increment может быть как положительным, так и отрицательным. Если он положителен, параметр start должен быть меньше или равен параметру end, иначе цикл не будет выполняться. Если параметр increment отрицателен, то параметр start должен быть больше или равен значению параметра end, чтобы выполнялось тело цикла. Если параметр Step не задан, то значение параметра increment по умолчанию равно 1.

VBA выполняет цикл For в следующей последовательности:

1. Устанавливает значение переменной цикла counter в значение start.

2. Сравнивает значение переменной цикла counter и значение параметра end. Если переменная counter больше, VBA завершает выполнение цикла. (Если значение параметра increment отрицательно, то VBA прекращает выполнение цикла при условии, что значение переменной цикла counter меньше значения параметра end.)

3. Выполняет операторы тела цикла statements.

4. Увеличивает значение переменной цикла counter на 1 или на величину значения параметра increment, если он задан.

5. Повторяет шаги со 2 по 4.

Рассмотрим пример: Вычислить значение функции f(t)

при заданных a, b, n, если t изменяется от a до b с шагом Dt=(b-a)/(n-1).

Sub пример3()
Dim f() As Single
Dim a As Single, b As Single, t As Single, dt As Single
Dim i As Integer, n As Integer
Call read("a1", a) : Call read("b1", b) : Call read("c1", n)
ReDim f(1 To n - 1)
dt = (b - a) / (n - 1) : t = a
Call out("a2", "i") : Call out("b2", "t") : Call out("c2", "f(t)")
For i = 1 To n - 1
t = t + dt
If t <= -1 Then
f(i) = -1
ElseIf t > 1 Then
f(i) = 1
Else
f(i) = t
End If
Call out("a" & (2 + i), i) : Call out("b" & (2 + i), t) : Call out("c" & (2 + i), f(i))
Next i
End Sub

Конструкция For Each . . . Next

Цикл For Each . . . Next похож на цикл For . . . Next, но он повторяет группу операторов для каждого элемента из набора объектов или из массива, вместо повторения операторов заданное число раз. Он особенно полезен, когда неизвестно, сколько элементов содержится в наборе.

Синтаксис конструкции цикла For Each . . . Next таков:

For Each element In group
  операторы 
Next element

Следует помнить следующие ограничения при использовании цикла For Each . . . Next:

 Для наборов параметр element может быть только переменной типа variant, общей переменной типа object или объектом, перечисленным в Object Browser

 Для массивов параметр element может быть только переменной типа Variant

 Нельзя использовать цикл For Each . . . Next с массивом, имеющим определенный пользователем тип, так как переменная типа variant не может содержать значение определенного пользователем типа

Конструкция Do…Loop

Цикл Do применяется для выполнения блока операторов неограниченное число раз. Существует несколько разновидностей конструкции Do . . . Loop, но каждая из них вычисляет выражение-условие, чтобы определить момент выхода из цикла. Как и в случае конструкции If . . . Then условие должно быть величиной или выражением, принимающими значение False (нуль) или True (не нуль).

В следующей конструкции Do . . . Loop операторы выполняются до тех пор, пока значением условия является True (Истина):

Do While условие
  операторы 
Loop

Выполняя этот цикл, VBA сначала проверяет условие. Если условие ложно (False), он пропускает все операторы цикла. Если оно истинно (True), VBA выполняет операторы цикла, снова возвращается к оператору Do While и снова проверяет условие.

Следовательно, цикл, представленный данной конструкцией, может выполняться любое число раз, пока значением условия является не нуль или True (Истина). Отметим, что операторы тела цикла не выполняются ни разу, если при первой проверке условия оно оказывается ложным (False).

Рассмотрим пример: Вычислить сумму ряда

с заданной точностью.

Sub пример4()
Dim e As Single, x As Single, s As Single
Dim m As Single, p As Single, i As Single
Call read("a1", x) : Call read("b1", e)
s = 0: i = 1: m = 1: p = -1
Call out("a2", "i") : Call out("b2", "m") : Call out("c2", "s")
Do While Abs(m) >= e
p = -p * x
m = p / i
s = s + m
Call out("a" & (2 + i), i) : Call out("b" & (2 + i), Abs(m)) : Call out("c" & (2 + i), s)
i = i + 1
Loop
End Sub

Другая разновидность конструкции Do . . . Loop сначала выполняет операторы тела цикла, а затем проверяет условие после каждого выполнения. Эта разновидность гарантирует, что операторы тела цикла выполнятся по крайней мере один раз:

Do
  операторы 
Loop 
While условие

Две другие разновидности конструкции цикла аналогичны предыдущим, за исключением того, что цикл выполняется, пока условие ложно (False):

 Цикл не выполняется вообще или выполняется много раз:

Do Until условие

операторы Loop

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

Do

операторы

Loop Until условие

7.2 Вложенные циклы.

Можно помещать структуры управления внутрь других структур управления (например, блок If . . . Then внутрь цикла For . . . Next). Говорят, что структура управления, помещенная внутрь другой структуры управления, является вложенной.

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

При вложении в цикл одного или несколько других циклов говорят о вложенных циклах, в которых различают внешние (охватывающие) и внутренние (вложенные) циклы.

Рассмотрим пример суммирования элементов Aij матрицы A(n,m) построчно.

Sub пример5()
Dim a() As Single, s() As Single
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Call read("a1", n): Call read("b1", m)
ReDim a(1 To n, 1 To m), s(1 To n)
'Чтение матрицы
For i = 1 To n
For j = 1 To m
Call readcell(i + 1, j, a(i, j))
Next j
Next i
'Вычисление
For i = 1 To n
s(i) = 0
For j = 1 To m
s(i) = s(i) + a(i, j)
Next j
Call outcell(i + 1, m + 1, s(i))
Next i
End Sub

Заметим, что первый оператор Next закрывает внутренний цикл For, а последний оператор Next закрывает внешний цикл For. Точно так же и для вложенных операторов If, операторы End If автоматически применяются для закрытия ближайшего к нему оператора If. Вложенные структуры Do . . . Loop работают подобным же образом: самый дальний оператор Loop соответствует самому дальнему оператору Do.

При вводе/выводе элементов двумерного массива на рабочий лист Microsoft Excel удобно применять пользовательские процедуры ввода/вывода:

Sub readcell(i As Integer, j As Integer, val As Variant)
val = Лист1.Cells(i, j).Value
End Sub
Sub outcell(i As Integer, j As Integer, val As Variant)
Лист1.Cells(i, j).Value = val
End Sub

где I — номер строки, j — номер столбца рабочего листа.

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

Оператор Exit позволяет выходить непосредственно из цикла For, цикла Do, процедуры Sub или процедуры Function. Синтаксис оператора Exit прост:

For counter = start To end [Step -increment]
[блок операторов]
[Exit For]
[блок операторов] 
Next [counter]
Do [(While | Until} условие]
[блок операторов]
[Exit Do]
[блок операторов] 
Loop

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

Оператор Exit Do работает со всеми разновидностями синтаксиса цикла Do.

Операторы Exit For и Exit Do применяются, если необходимо завершить цикл немедленно, не продолжая дальнейших итераций или не ожидая выполнения блока операторов в теле цикла.

При использовании оператора Exit для выхода из цикла значения переменной цикла зависят от того, каким образом завершается выполнение цикла:

 При нормальном завершении цикла значение переменной цикла имеет на единицу больше верхней границы числа циклов

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

 При завершении цикла по концу набора переменная цикла имеет значение Nothing (Ничего), если она является переменной типа object (Объект), или значение Empty (Пусто), если она является переменной типа Variant

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

К циклам VBA относятся:

  • Цикл For
  • Цикл Do While
  • Цикл Do Until

Далее мы подробно рассмотрим каждый из этих циклов.

Содержание

  1. Оператор цикла «For» в Visual Basic
  2. Цикл «For … Next»
  3. Цикл «For Each»
  4. Оператор прерывания цикла «Exit For»
  5. Цикл «Do While» в Visual Basic
  6. Цикл «Do Until» в Visual Basic

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

For i = 1 To 10
   Total = Total + iArray(i)
Next i

В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1. Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.

For d = 0 To 10 Step 0.1
   dTotal = dTotal + d
Next d

Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

For i = 10 To 1 Step -1
   iArray(i) = i
Next i

Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Dim wSheet As Worksheet

For Each wSheet in Worksheets
   MsgBox "Найден лист: " & wSheet.Name
Next wSheet

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:

For i = 1 To 100
   If dValues(i) = dVal Then
      IndexVal = i
      Exit For
   End If
Next i

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

'Процедура Sub выводит числа Фибоначчи, не превышающие 1000
Sub Fibonacci()
   Dim i As Integer 'счётчик для обозначения позиции элемента в последовательности
   Dim iFib As Integer 'хранит текущее значение последовательности
   Dim iFib_Next As Integer 'хранит следующее значение последовательности
   Dim iStep As Integer 'хранит размер следующего приращения

   'инициализируем переменные i и iFib_Next
   i = 1
   iFib_Next = 0
   'цикл Do While будет выполняться до тех пор, пока значение
   'текущего числа Фибоначчи не превысит 1000

   Do While iFib_Next < 1000
      If i = 1 Then
         'особый случай для первого элемента последовательности
         iStep = 1
         iFib = 0
      Else
         'сохраняем размер следующего приращения перед тем, как перезаписать
         'текущее значение последовательности
         iStep = iFib
         iFib = iFib_Next
      End If

      'выводим текущее число Фибоначчи в столбце A активного рабочего листа
      'в строке с индексом i
      Cells(i, 1).Value = iFib
      'вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1
      iFib_Next = iFib + iStep
      i = i + 1
   Loop

End Sub

В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do
...
Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

iRow = 1
Do Until IsEmpty(Cells(iRow, 1))
   'Значение текущей ячейки сохраняется в массиве dCellValues
   dCellValues(iRow) = Cells(iRow, 1).Value
   iRow = iRow + 1
Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

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

Do
...
Loop Until IsEmpty(Cells(iRow, 1))

Оцените качество статьи. Нам важно ваше мнение:

Понравилась статья? Поделить с друзьями:
  • Макросы excel цикл for
  • Макросы excel функция если
  • Макросы excel работа с датами
  • Макросы excel форматирование таблицы
  • Макросы excel программирование скачать