Использование циклов в VBScript
Использование циклов для повторения кода
Циклы позволяют вам выполнять блок операторов повторно. Некоторые циклы повторяют
выполнение операторов, пока условие ложно (равно False), другие повторяют выполнение,
пока условие истинно (равно True). Также имеются циклы, которые выполняются
заданное количество раз. В VBScript доступны следующие циклы:
- Do...Loop. Цикл выполняется пока условие истинно, или до тех пор, пока условие не станет истинно
- While...Wend. Цикл выполняется пока условие истинно.
- For...Next. Цикл выполняется заданное количество раз.
- For Each...Next. Повторяет выполнение блока операторов для каждого элемента коллекции или каждого элемента массива.
Использование цикла Do Loop
Вы можете использовать конструкцию Do...Loop для выполнения блока
операторов бесконечное количество раз. Блок операторов выполняется пока условие
истинно (равно TRUE) или до тех пор, пока условие не станет истинным.
Выполнение цикла, пока условие истинно
Используйте ключевое слово While для проверки условия выполнения
цикла Do...Loop. Вы можете проверять условие перед выполнением
цикла (как показано в примере ChkFirstWhile) или после выполнения цикла
(как показано в примере ChkLastWhile). В процедуре ChkFirstWhile переменной
myNum будет присвоено значение 10 вместо 20 после выполнения цикла, цикл будет
выполнен 10 раз. Если бы переменной myNum перед циклом было присвоено значение
10 или меньше, то цикл не выполнился бы ни разу, потому что условие проверяется
перед циклом. В процедуре ChkLastWhile цикл будет выполнен только один раз.
И хотя условие выполнения цикла не выполняется, цикл всё-таки будет выполнен
один раз, так как условие проверяется в конце цикла.
Sub ChkFirstWhile()
Dim counter, myNum
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "Цикл выполнен " & counter & " раз, myNum = " & myNum
End Sub
Sub ChkLastWhile()
Dim counter, myNum
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
MsgBox "Цикл выполнен " & counter & " раз, myNum = " & myNum
End Sub
Выполнение цикла до тех пор, пока условие не станет истинно
Используйте ключевое слово Until для проверки условия выполнения цикла
Do...Loop. Вы можете проверять условие перед выполнением цикла
(как показано в примере ChkFirstUntil) или после выполнения цикла (как показано
в примере ChkLastUntil). Цикл выполняется, пока условие ложно (то есть пока myNum НЕ РАВНО 10).
Как только myNum будет равно 10, выполнение цикла прекратится.
Sub ChkFirstUntil()
Dim counter, myNum
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "Цикл выполнен " & counter & " раз, myNum = " & myNum
End Sub
Sub ChkLastUntil()
Dim counter, myNum
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
MsgBox "Цикл выполнен " & counter & " раз, myNum = " & myNum
End Sub
Прерывание цикла
Вы можете прервать цикл, не дожидаясь выполнения условия завершения цикла.
Для принудительного выхода из цикла используется оператор Exit Do.
Поскольку обычно прерывание цикла требуется в особых ситуациях, например,
для того, чтобы избежать попадания в бесконечный цикл, то вы должны
использовать оператор Exit Do в блоке операторов конструкции
If...Then...Else. Например, если какое-то условие способствует
попаданию в бесконечный цикл, то при его возникновении можно выполнить оператор
Exit Do, иначе цикл продолжит работу в обычном режиме.
Sub ExitExample()
Dim counter, myNum
counter = 0
myNum = 9
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
if counter > 100 Then Exit Do
Loop
MsgBox "Цикл выполнен " & counter & " раз, myNum = " & myNum
End Sub
В представленном выше примере переменной myNum присваивается значение,
которое приводит к зацикливанию процедуры, то есть создаёт бесконечный цикл.
Если не принять специальных мер, то этот цикл никогда не завершится.
Изначально значение переменной myNum равно 9, а в цикле оно уменьшается,
то есть это значение никогда не будет равно 10, а значит, условие цикла
никогда не выполнится. Чтобы избежать этой ситуации, мы в каждой итерации
цикла проверяем значение счётчика (переменной counter). Если цикл выполнился
более 100 раз, то мы его принудительно завершаем с помощью оператора
Exit Do.
Использование цикла While Wend
Оператор While...Wend предоставляется в VBScript для тех, кто
хорошо знаком с его использованием. Однако, поскольку оператор
While...Wend является недостаточно гибким, мы рекомендуем
использовать вместо него цикл Do...Loop.
Использование цикла For Next
Вы можете использовать оператор For...Next для организации цикла,
который требуется выполнить заданное количество раз. Для организации цикла
используйте переменную-счётчик, которая будет автоматически уменьшаться или увеличиваться в каждой итерации цикла.
В следующем примере организован цикл, который вызывает процедуру 50 раз.
Оператор For определяет переменную-счётчик х, для которой указывается
начальное и конечное значения. Оператор Next увеличивает значение счётчика на 1.
Sub DoMyProc50Times()
Dim x
For x = 1 To 50
MyProc
Next
End Sub
Используя ключевое слово
Step, вы можете увеличивать или уменьшать
счётчик на указанное значение (а не на 1, как в предыдущем примере). В
следующем примере переменная-счётчик j увеличивается на 2 в каждой итерации цикла.
Когда цикл завершится, то результат будет равен сумме чисел 2, 4, 6, 8 и 10, то есть 30.
Sub TwosTotal()
Dim j, s, total
For j = 2 To 10 Step 2
If j = 10 Then
s = s & j & ") = "
Else
s = s & j & "+"
End If
total = total + j
Next
MsgBox "Общая сумма: (" & s & total
End Sub
Для уменьшения переменной-счётчика используйте отрицательные значения в операторе
Step. В этом случае вы должны указать конечное значение меньше,
чем начальное значение. В следующем примере переменная-счётчик myNum уменьшается
на 2 в каждой итерации цикла. Когда цикл завершится, то результат будет равен
сумме чисел 16, 14, 12, 10, 8, 6, 4 и 2, то есть 72.
Sub NewTotal()
Dim myNum, total
For myNum = 16 To 2 Step -2
total = total + myNum
Next
MsgBox "Общая сумма: " & total
End Sub
Вы можете выйти из цикла до того, как значение переменной-счётчика достигнет конечного.
Для этого используется оператор
Exit For. Рекомендации по принудительному
завершению цикла см. выше в примерах для цикла
Do...Loop.
Использование цикла For Each Next
Цикл For Each...Next похож на цикл For...Next,
только вместо выполнения операторов заданное количество раз, цикл повторяет выполнение
блока операторов для каждого элемента коллекции или для каждого элемента массива.
Это особенно полезно в тех случаях, когда вы не знаете, сколько элементов содержится в коллекции.
Пример HTML-кода, приведённый ниже, содержит объект Dictionary,
используемый для размещения текста в нескольких текстовых полях.
Этот пример несколько отличается от примера, приведённого в оригинальной документации.
В оригинальной документации используется только цикл For Each...Next,
где сразу выводятся элементы списка d в поля ввода/вывода страницы. Такое решение,
конечно, делает код более простым, однако на моём компьютере это почему-то
не работает (хотя, по идее, должно работать). Если интересно, можете найти
этот пример в оригинальной документации и сравнить. Здесь же приводится доработанный
мной пример, который работает на моём компьютере и, скорее всего, будет работать и на вашем.
В оригинальном примере в цикле For Each...Next почему-то не выполняется код
Document.frmForm.Elements(i).Value = d.Item(i)
то есть именно вывод на HTML-страницу. Остальные операторы работают нормально.
С чем это связано сказать трудно. Возможно, что это «глюк» используемого мною браузера,
а может быть и другая причина.
А теперь коротко рассмотрим пример. Сначала мы создаём список (словарь — объект
Dictionary), в который заносим несколько названий городов.
Затем в цикле For Each...Next мы переносим этот список в динамический массив.
Далее в цикле For...Next мы выводим эти города уже из массива в
поля ввода/вывода на HTML-странице. Более подробно объект Dictionary
рассмотрен в соответствующем разделе.
<html>
<head><title>Формы и элементы</title></head>
<SCRIPT LANGUAGE="VBScript">
<!--
sub cmdChange_OnClick
dim M() 'Массив для строк
dim d 'Список городов
dim n 'Количество городов
set d = CreateObject("Scripting.Dictionary")
d.Add "0", "Афины" 'Добавить несколько ключей и строк
d.Add "1", "Белград"
d.Add "2", "Каир"
n = 0
for each i in d 'Заполнить массив элементами списка
ReDim Preserve M(n+1)
M(n) = d.Item(i)
n = n + 1
next
for i = 0 To (n-1) 'Вывести строки в поля ввода/вывода
Document.frmForm.Elements(i).Value = M(i)
Next
end sub
-->
</SCRIPT>
<body>
<center>
<form NAME="frmForm">
<input Type = "Text"><p>
<input Type = "Text"><p>
<input Type = "Text"><p>
<input Type = "Button" NAME="cmdChange" VALUE="Щёлкните здесь"><p>
</form>
</center>
</body>
</html>
Ниже вы можете проверить работу описанного выше кода. Однако помните, что работать
это будет только в Internet Explorer (другие браузеры не поддерживают VBScript)
и только в том случае, если в настройках браузера разрешено выполнение сценариев.