VBScript のループ制御

ステートメントのブロックを繰り返し実行するには、ループのステートメントを使用します。ループのステートメントには、条件の評価が真 (True)、または偽 (False) になるまでステートメントを繰り返し実行するループや、指定した回数だけステートメントを繰り返し実行するループなどがあります。

Microsoft® Visual Basic® Scripting Edition (以下 VBScript) には、次に示すループのステートメントが用意されています。

  • Do...Loop:条件の評価が真 (True) の間、または真 (True) になるまで、ステートメントを繰り返し実行します。
  • While...Wend:条件の評価が真 (True) の間、ステートメントを繰り返し実行します。
  • For...Next:カウンタを使用し、指定した回数だけステートメントを実行します。
  • For Each...Next:コレクションの各項目または配列の各要素に対してステートメント グループを実行します。

Do...Loop ステートメントを使用する

Do...Loop ステートメントを使用すると、ステートメント ブロックを無限に実行できます。Do...Loop ステートメントは、条件の評価が真 (True) の間、または真 (True) になるまでステートメントを繰り返し実行します。

条件の評価が真の間の繰り返し実行

条件の評価が真の間、ステートメントを繰り返し実行する場合には、While キーワードを使用します。While キーワードを使用する条件の判定方法には、次のコード例のように 2 種類あります。1 つは、ループに入る前に条件を評価する方法です (最初の例)。もう 1 つは、ループが少なくとも 1 回実行された後に条件を評価する方法です (2 番目の例)。最初の例の ChkFirstWhile プロシージャでは、変数 myNum の値を 20 から 9 に変更すると、条件の評価が偽 (False) となり、ループのステートメントは 1 回も実行されません。2 番目の例の ChkLastWhile プロシージャでは、既に条件の評価が偽 (False) であっても、ループのステートメントは 1 回だけ実行されます。

Sub ChkFirstWhile()
   Dim counter, myNum
   counter = 0
   myNum = 20
   Do While myNum > 10
      myNum = myNum - 1
      counter = counter + 1
   Loop
   MsgBox "ループを " & counter & " 回実行しました。"
End Sub

Sub ChkLastWhile()
   Dim counter, myNum
   counter = 0
   myNum = 9
   Do
      myNum = myNum - 1
      counter = counter + 1
   Loop While myNum > 10
   MsgBox "ループを " & counter & " 回実行しました。"
End Sub

条件の評価が真になるまでの繰り返し実行

Until キーワードを使用して条件の評価が真になるまで繰り返し実行する場合には、次にような 2 つの方法があります。1 つは、ループに入る前に条件を評価する方法です (最初の例)。もう 1 つは、ループが少なくとも 1 回実行された後に条件を評価する方法です (2 番目の例)。いずれの方法も、条件の評価が偽 (False) である限りループのステートメントは繰り返し実行されます。

Sub ChkFirstUntil()
   Dim counter, myNum
   counter = 0
   myNum = 20
   Do Until myNum = 10
      myNum = myNum - 1
      counter = counter + 1
   Loop
   MsgBox "ループを " & counter & " 回実行しました。"
End Sub

Sub ChkLastUntil()
   Dim counter, myNum
   counter = 0
   myNum = 1
   Do
      myNum = myNum + 1
      counter = counter + 1
   Loop Until myNum = 10
   MsgBox "ループを " & counter & " 回実行しました。"
End Sub

ループ内からの Do...Loop ステートメントの終了

Do...Loop ステートメントを終了する場合には、Exit Do ステートメントを使用します。通常、ループは、特定の条件の場合 (無限ループを回避させたい場合など) にだけ終了させます。そのため、If...Then...Else ステートメントの条件の評価が真 (True) の場合のステートメント ブロックで、Exit Do ステートメントを使用します。条件の評価が偽 (False) の場合は、ループがそのまま実行されます。

次のコード例では、変数 myNum に割り当てられた値のため、無限ループが発生します。If...Then...Else ステートメントで変数 myNum の値を再確認し、無限に繰り返しが続くことを防ぎます。

Sub ExitExample()
   Dim counter, myNum
      counter = 0
      myNum = 9
      Do Until myNum = 10
         myNum = myNum - 1
         counter = counter + 1
         If myNum < 10 Then Exit Do
      Loop
      MsgBox "ループを " & counter & " 回実行しました。"
End Sub

While...Wend ステートメントを使用する

While...Wend ステートメントは、この用法に詳しいユーザーのために VBScript でも用意されています。ただし、While...Wend ステートメントは柔軟性に欠けるため、Do...Loop ステートメントを使用することをお勧めします。

For...Next ステートメントを使用する

For...Next ステートメントを使用すると、ステートメント ブロックを指定の回数だけを実行できます。ループではカウンタ変数を使用し、ループの実行のたびに値を増減します。

次のコード例では、MyProc が繰り返し 50 回実行されます。For ステートメントでは、カウンタ変数 x とその初期値および終了値を指定しています。Next ステートメントは、カウンタ変数の値を 1 増加させます。

Sub DoMyProc50Times()
   Dim x
   For x = 1 To 50
      MyProc
   Next
End Sub

Step キーワードを使用すると、カウンタ変数を増減する値を指定できます。次のコード例では、ループを繰り返すごとにカウンタ変数 j の値が 2 ずつ増加されます。ループが終了したときには、合計は 2、4、6、8、10 を加算した値になります。

Sub TwosTotal()
   Dim j, total
   For j = 2 To 10 Step 2
      total = total + j
   Next
   MsgBox "合計は " & total & "です。"
End Sub

カウンタ変数を減少させる場合には、Step キーワードで負の値を指定します。その場合、終了値には初期値より小さい値を指定する必要があります。次のコード例では、ループを繰り返すごとにカウンタ変数 myNum の値が 2 ずつ減少されます。ループが終了したときには、合計が 16、14、12、10、8、6、4、2 を加算した値になります。

Sub NewTotal()
   Dim myNum, total
   For myNum = 16 To 2 Step -2
      total = total + myNum
   Next
   MsgBox "合計は " & total & "です。"
End Sub

カウンタ変数の値が終了値と等しくなる前に For...Next ステートメントを終了する場合には、Exit For ステートメントを使用します。通常、ループは、特定の条件の場合 (無限ループを回避する場合など) にだけ終了させます。そのため、If...Then...Else ステートメントの条件の評価が真 (True) の場合のステートメント ブロックで Exit For ステートメントを使用します。条件の評価が偽 (False) の場合は、ループがそのまま実行されます。

For Each...Next ステートメントを使用する

For Each...Next ステートメントは、For...Next ステートメントと似たような機能です。For Each...Next ステートメントでは、指定の回数だけステートメント ブロックを繰り返すのではなく、コレクションの各オブジェクトまたは配列の各要素に対してステートメント ブロックを繰り返し実行します。コレクションに含まれている要素の数がわからない場合には、特に役に立ちます。

次のコード例では、Dictionary オブジェクトの内容を使用して、複数のテキスト ボックスに文字列を保存します。

<HTML>
<HEAD><TITLE>Forms and Elements</TITLE></HEAD>
<SCRIPT LANGUAGE="VBScript">
<!--
Sub cmdChange_OnClick
   Dim d   'Create a variable 
   Set d = CreateObject("Scripting.Dictionary")
   d.Add "0", "アテネ"   '複数のキーと項目を追加します。
   d.Add "1", "ベオグラード"
   d.Add "2", "カイロ"

   For Each I in d
      Document.frmForm.Elements(I).Value = D.Item(I)
   Next
End Sub
-->
</SCRIPT>
<BODY>
<CENTER>
<FORM NAME="frmForm"

<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Button" NAME="cmdChange" VALUE="Click Here"><p>
</FORM>
</CENTER>
</BODY>
</HTML>