MyTetra Share
Делитесь знаниями!
Все циклы VBA в одной статье
12.10.2019
20:24
Раздел: !Закладки - VBA - Меню VB-справка

Все циклы VBA в одной статье

Автор Дмитрий Якушев На чтение13 мин. Просмотров390


Рамакришна, Источники индийской мудрости

Сейчас … мы идем по кругу

Эта статья содержит полное руководство по VBA Do While и VBA While Loops. (Если вы ищете информацию о циклах VBA For и For Each, перейдите сюда)

Цикл VBA While существует, чтобы сделать его совместимым со старым кодом. Однако Microsoft рекомендует использовать цикл Do Loop, поскольку он более «структурирован и гибок». Оба этих цикла рассматриваются в этом посте.

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

Если вы ищете что-то конкретное, вы можете посмотреть содержание ниже.

Содержание

  1. Краткое руководство по VBA While Loops
  2. Введение
  3. Цикл For против цикла Do While
  4. Условия
  5. Формат цикла Do
  6. Примеры цикла Do
  7. While против Until
  8. Примеры Until и While
  9. Пример: проверка объектов
  10. Цикл Exit Do
  11. While Wend
  12. Формат цикла VBA While Wend
  13. While Wend против Do
  14. Бесконечный цикл
  15. Работа с бесконечным циклом
  16. Использование функций Worksheet вместо циклов
  17. Резюме
  18. Цикл Do While
  19. Цикл While Wend

Краткое руководство по VBA While Loops


Формат цикла

Описание

Пример

Do While … Loop

Запускается 0 или более раз, пока условие выполняется

Do While result = «Верно»
Loop

Do … Loop While

Запускается 1 или более раз, пока условие выполняется

Do 
Loop While result = «Верно»

Do Until … Loop

Запускается 0 или более раз, пока условие не будет выполнено

Do Until result <> «Верно»
Loop


Do … Until Loop

Запускается 1 или более раз, пока условие не будет выполнено

Do 
Loop Until result <> «Верно»

While … Wend
R

Запускается 0 или более раз, пока условие истинно.
Примечание: этот цикл считается устаревшим.

While result = «Верно»
Wend

Exit the Do Loop

Завершает Do

Do While i < 10
   i = GetTotal
   
If i < 0 Then
      
Exit Do
   
End If
Loop

Введение

Если вы никогда ранее не использовали циклы, тогда вы можете прочитать «Что такое циклы и зачем они вам нужны» из моего поста в журнале For Loop.

Я собираюсь сосредоточиться в основном на Do Loop в этой статье. Как я упоминал выше, мы видели, что цикл While Wend считается устаревшим. Для полноты информации я все равно его включил в эту статью.

Итак, во-первых, зачем нам нужны циклы Do While, когда у нас уже есть циклы For?

Цикл For против цикла Do While

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

' запускается 5 раз

For i = 1 To 5

 

' запускается один раз для каждого элемента коллекции

For i = 1 To coll.Count

 

' запускается один раз для каждого элемента в arr

For i = LBound(arr) To coll.lbound(arr)

 

' запускается один раз для каждого значения от 1 до значения в lastRow

For i = 1 To lastRow

 

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

For Each s In coll

Цикл Do другой. Он работает:

  • В то время как условие верно
  • Пока условие не будет выполнено

Другими словами, количество циклов в большинстве случаев не имеет значения.

Итак, что такое условие и как мы их используем?

Условия

Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как >, <, <>,> =, =.

Ниже приведены примеры условий


Условие

Истина, когда…

x < 5

x меньше 5

x <= 5

x меньше либо равен 5

x > 5

x больше 5

x >= 5

x больше либо равен 5

x = 5

x равен 5

x <> 5

x не равен 5

x > 5 And x < 10

x больше 5 И меньше 10

x = 2 Or x >10

x равен 2 ИЛИ больше 10

Range(«A1») = «Иван»


Ячейка A1 содержит текст «Иван»

Range(«A1») <> «Иван»

Ячейка A1 не содержит текст «Иван»

Вы могли заметить x = 5 как условие. Его следует путать с х = 5, при использовании в качестве назначения.

Например


1

2

3

4

5

6

7

8

' означает: значение 6 будет храниться в х

x = 6

 

' означает: х равен 6?

If x = 6

 

' означает: х равен 6?

Do While x = 6

В следующей таблице показано, как «=» используется в условиях и назначениях.


Использование «=»

Тип

Имеется в виду

Loop Until x = 5

Условие

x равен 5?

Do While x = 5

Условие

x равен 5?

If x = 5 Then

Условие

x равен 5?

For x = 1 To 5

Присваивание

Установите значение x = 1, затем = 2 и т.д.

x = 5

Присваивание

Установите значение x=5

b = 6 = 5

Присваивание и
условие

Присвойте b
результату условия
6 = 5

x = MyFunc(5,6)

Присваивание

Присвойте х
значение,
возвращаемое
функцией

Формат цикла Do

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

Do всегда в начале первой строки, а Loop всегда в конце последней строки.


1

2

Do

Loop

Мы можем добавить условие после любой строки.


1

2

3

4

5

Do [условие]

Loop

 

Do

Loop [условие]

Условию предшествует While или Until, которое дает нам эти четыре возможности


1

2

3

4

5

6

7

8

9

10

11

Do While [условие]

Loop

 

Do Until [условие]

Loop

 

Do

Loop While [условие]

 

Do

Loop Until [условие]

Давайте посмотрим на некоторые примеры, чтобы прояснить это.

Примеры цикла Do

Представьте, что вы хотите, чтобы пользователь ввел список элементов. Каждый раз, когда пользователь вводит элемент, вы печатаете его в «Immediate Window». Когда пользователь вводит пустую строку, вы хотите, чтобы приложение закрывалось.

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

Следующий код показывает это


1

2

3

4

5

6

7

8

9

10

Dim sCommand As String

 

   Do

       ' Получить пользовательский ввод

       sCommand = InputBox("Пожалуйста, введите элемент")

 

       ' Печать в Immediate Window (Ctrl + G для просмотра)

       Debug.Print sCommand

 

   Loop While sCommand <> ""

Код входит в цикл и продолжается до тех пор, пока не достигнет строки «Loop While». На этом этапе он проверяет, оценивается ли условие как истинное или ложное.

Если условие оценивается как ложное, то код выходит из цикла и продолжается.
Если условие оценивается как истинное, то код возвращается к строке Do и снова проходит через цикл.
Разница между наличием условия на линии Do и на линии Loop очень проста.

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Sub GetInput()

 

    Dim sCommand As String

 

    ' Условие в начале

    Do While sCommand <> "н"

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")

    Loop

 

    ' Условие в конце

    Do

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")

    Loop While sCommand <> "н"

 

End Sub

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

Однако, если мы установим для sCommand значение «н» до запуска цикла «Do While», код не войдет в цикл.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Sub GetInput2()

 

    Dim sCommand As String

    sCommand = "н"

 

    ' Цикл не будет работать, поскольку команда "н"

    Do Whilel sCommand <> "н"

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")

    Loop

 

    ' Цикл все равно будет запущен хотя бы один раз

    Do

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")

    Loop While sCommand <> "н"

 

End Sub

Второй цикл в вышеприведенном примере (то есть Loop While) всегда будет запускаться хотя бы один раз.

While против Until

При использовании Do Loop условию должно предшествовать Until или While.

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

Например:

  • Оставьте одежду, пока не пойдет дождь
  • Оставь одежду, пока не идет дождь

Другой пример:

  • Оставайся в постели, пока не станет светло
  • Оставайся в постели, пока темно

Еще один пример:

  • повторять, пока число не станет больше или равно десяти
  • повторить пока счет меньше десяти

Как видите, использование Until и While — это просто противоположный способ написания одного и того же условия.

Примеры Until и While

Следующий код показывает циклы «While» и «Until» рядом. Как видите, единственная разница в том, что условие полностью изменено.

Примечание: знаки <> означают «не равно».


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Sub GetInput()

 

    Dim sCommand As String

 

    ' Условие в начале

    Do Until sCommand = "н"

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")

    Loop

 

    Do While sCommand <> "н"

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")

    Loop

 

    ' Условие в конце

    Do

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")

    Loop Until sCommand = "н"

 

    Do

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")

    Loop While sCommand <> "н"

 

End Sub

  • Первый цикл: запускается только в том случае, если sCommand не равен ‘н’.
  • Второй цикл: запускается только в том случае, если sCommand не равен ‘н’.
  • Третий цикл: будет запущен хотя бы один раз перед проверкой sCommand.
  • Четвертый цикл: будет запущен хотя бы один раз перед проверкой sCommand.

Пример: проверка объектов

Примером использования Until и While является проверка объектов. Когда объект не был назначен, он имеет значение Nothing.

Поэтому, когда мы объявляем переменную книги в следующем примере, она имеет значение Nothing, пока мы не назначим ее Workbook.


1

Dim wrk As Workbook

Противоположностью Nothing не является Nothing, что может сбить с толку.

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

Вы можете увидеть пример кода здесь:


1

2

3

4

5

6

7

Dim wrk As Workbook

    Set wrk = GetFirstWorkbook()

 

    Do Until wrk Is Nothing

        Debug.Print wrk.Name

        Set wrk = GetNextWorkbook()

    Loop

Написание этого кода с использованием Do While было бы более запутанным, так как условие Not Is Nothing


1

2

3

4

5

6

7

Dim wrk As Workbook

    Set wrk = GetFirstWorkbook()

 

    Do While Not wrk Is Nothing

        Debug.Print wrk.Name

        Set wrk = GetNextWorkbook()

    Loop

Это делает код более понятным, и наличие четких условий — всегда хорошо. Честно говоря, разница маленькая, и выбор между «While» и «Until» действительно сводится к личному выбору.

Цикл Exit Do

Мы можем выйти из любого цикла Do с помощью оператора Exit Do.

Следующий код показывает пример использования Exit Do


1

2

3

4

5

6

Do While i < 1000

     If Cells(i,1) = "Найдено" Then

         Exit Do

     End If

     i = i + 1

Loop

В этом случае мы выходим из цикла Do Loop, если ячейка содержит текст «Найдено».

While Wend

Этот цикл в VBA, чтобы сделать его совместимым со старым кодом. Microsoft рекомендует использовать циклы Do, поскольку они более структурированы.

Из MSDN: «Оператор Do… Loop обеспечивает более структурированный и гибкий способ выполнения циклов».

Формат цикла VBA While Wend

Цикл VBA While имеет следующий формат:

While <Условие>
Wend

While Wend против Do

Разница между циклами VBA While и VBA Do заключается в следующем:

  1. While может иметь условие только в начале цикла.
  2. While не имеет версии Until.
  3. Не существует оператора для выхода из цикла While, как Exit For или Exit Do.

Условие для цикла VBA While такое же, как и для цикла VBA Do While. Два цикла в приведенном ниже коде работают точно так же.


1

2

3

4

5

6

7

8

9

10

11

12

13

Sub GetInput()

 

    Dim sCommand As String

 

    Do While sCommand <> "н"

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")

    Loop

 

    While sCommand <> "н"

        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")

    Wend

 

End Sub

Бесконечный цикл

Даже если вы никогда не писали код в своей жизни, я уверен, что вы слышали фразу «Бесконечный цикл». Это цикл, в котором условие никогда не будет выполнено. Обычно это происходит, когда вы забыли обновить счетчик.

Следующий код показывает бесконечный цикл


1

2

3

4

5

6

7

Dim cnt As Long

    cnt = 1

 

    'это бесконечный цикл

    Do While cnt <> 5

 

    Loop

В этом примере cnt установлен в 1, но он никогда не обновляется. Поэтому условие никогда не будет выполнено — cnt всегда будет меньше 5.

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


1

2

3

4

5

6

Dim cnt As Long

    cnt = 1

 

    Do While cnt <> 5

        cnt = cnt + 1

    Loop

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


1

2

3

4

Dim i As Long

    For i = 1 To 4

 

    Next i

Это явно лучший способ сделать это. Цикл For устанавливает начальное значение, условие и счет в одну строку.

Конечно, можно использовать бесконечный цикл, используя For — это потребует немного больше усилий 🙂


1

2

3

4

5

6

Dim i As Long

   ' Бесконечный цикл

   For i = 1 To 4

       ' i никогда не достигнет 4

       i = 1

   Next i

Работа с бесконечным циклом

Когда у вас бесконечный цикл — VBA не выдаст ошибку. Ваш код будет продолжать работать, а редактор Visual Basic не будет отвечать.

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

Вы также можете выйти из цикла, убив процесс. Нажмите Ctrl + Shift + Esc. На вкладке Процессы найдите Excel / Microsoft Excel. Щелкните правой кнопкой мыши по этому и выберите «Завершить процесс». Это закроет Excel, и вы можете потерять часть работы — так что гораздо лучше использовать Ctrl + Break или его эквивалент.

Использование функций Worksheet вместо циклов

Иногда вы можете использовать функцию листа вместо цикла.

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

Использовать функции рабочего листа очень просто. Ниже приведен пример использования Sum и Count.


1

2

3

4

5

6

7

Sub WorksheetFunctions()

 

    Debug.Print WorksheetFunction.Sum(Range("A1:A10"))

 

    Debug.Print WorksheetFunction.Count(Range("A1:A10"))

 

End Sub

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Sub SumWithLoop()

 

    Dim total As Long, count As Long

    Dim rg As Range

    For Each rg In Range("A1:A10")

        ' Total

        total = total + rg

        ' Count

        If rg <> "" Then

            count = count + 1

        End If

    Next rg

 

    Debug.Print total

    Debug.Print count

 

End Sub

Резюме

Цикл Do While

  • Цикл Do можно использовать 4 способами.
  • Его можно использовать в начале или в конце, Do While .. Loop, Do … Loop While
  • Может использоваться с Until в начале или в конце, Do Until .. Loop, Do … Loop Until
  • While и Until используют противоположные условия друг к другу.
  • Бесконечный цикл происходит, если ваше условие выхода никогда не будет выполнено.
  • Иногда использование функции рабочего листа более эффективно, чем использование цикла.

Цикл While Wend

  • Цикл Wend Wend устарел, и вы можете вместо этого использовать цикл Do.

Источник

Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования