REPEAT文

本ページには広告が含まれています。

条件を満たすまで(条件式がFalseの間)処理を繰り返します。繰り返す回数がわかっている場合はFOR-TO文を使います。

構文
REPEAT
処理
UNTIL 式
引数
戻り値

後判定ループ

REPEAT文のようにループ処理を行ってから、繰り返しを終了するかの条件判定を行う方式を後判定ループといいます。

ループの処理を行ってから判定を行うため、前判定ループとは違いループ内の処理が必ず一度は実行されます。

対して、WHILE文のように繰り返し処理を行う前に条件判定を行う方式を前判定ループといいます。後判定ループと違い、条件判定が成り立たない場合ループ内の処理は一度も実行されません。

REPEAT文は後判定でループ内の処理を実行してから条件式の確認を行うので、WHILE文とは違い最低でも一回は処理が実行されます。

例えば入力されたパスワードが正しいかを判定する場合、一度は入力してもらう必要があるため後判定を使い以下のように記述します。

UWSC
REPEAT
	DIM str = INPUT("パスワードを入力")
UNTIL str = "1234"

これを前判定のWHILE文を使って書くと以下のようになり、同じプログラムを無駄に2回書くことになります。またREPEAT文は条件式が成り立たない間繰り返すのに対しWHILE文は成り立つ間なので、条件式の符号も変わることに注意です。

UWSC
DIM str = INPUT("パスワードを入力")

WHILE str <> "1234"
	str = INPUT("パスワードを入力")
WEND

条件式の書き方

条件式は比較演算子または論理演算子を使って書きます。

値の比較

REPEAT文では条件が真になるまで(偽の間)ループ内の処理が行われます。a,bには数値が代入されているものとします。

比較演算子とは2つの式や値を比較するための演算子で、2つの値が等しい等しくない大きい小さいといった比較ができるようになります。

比較演算子を使うことで、○○と一致したとき○○ではないときといった条件式を書くことができます。

UWSCで使える比較演算子は以下のとおりで、a,bはともに数値が代入されているものとします。

演算子 記述例 意味
< a < b aがbより小さければ真
<= a <= b aがb以下ならば真
> a > b aがbより大きければ真
>= a >= b aがb以上ならば真
= a = b aとbが等しければ真
<> <> b aとbが等しくなければ真

複数条件

複数の条件を指定する場合は、論理演算子を使います。

以下の例ではa,bともに論理値(TrueまたはFalse)が代入されているものとします。数値の場合はビット演算になるので注意が必要です。

論理演算子とは、論理演算をするための演算子のことで、論理演算子を使うことで○○かつ○○○○または○○といった比較演算子だけではできない複数の条件式を比較するといった書き方ができるようになります。

以下の例ではa,bともに論理値(TrueまたはFalse)が代入されているものとします。数値の場合は論理演算ではなくビット演算になるので注意が必要です。

演算子 記述例 意味
AND a AND b aとbがともに真の場合に真
OR a OR b aかbの少なくとも1つが真の場合に真
XOR a XOR b aかbのいずれか一方が真の場合に真
! !x xが偽の場合に真

使い方

指定時間の間ループ内の処理を実行

ループに入る前の時間を取得しループの最後で経過時間を求め、指定時間になるまでループ内の処理を繰り返し処理を実行します。

以下は60秒間ループ内の処理を実行する例です。tm >= 60は60秒経過していたらループを抜けることを表しています。60秒経っていなかったら再度REPEAT文の先頭に戻ります。

UWSC
DIM t = GETTIME()

REPEAT
	// 何らかの処理
	DIM tm = GETTIME() - t
UNTIL tm >= 60

指定画像が表示されるまで待機

image.bmpという画像が表示されるまで待機します。

CHKIMG関数 (スクリプト関数)は画像が見つかればTrue、見つからなければFalseを返すことを利用しています。

UWSC
REPEAT
	SLEEP(0.01)
UNTIL CHKIMG("image.bmp")

入力チェック

INPUT関数 (スクリプト関数)で入力された値をreTest関数 (自作関数)で正規表現チェックを行い、数値が入力されるまで繰り返します。

正規表現にマッチすればTrue、マッチしなければFalseを返すので、数値が入力されるまで繰り返し入力させることができます。

UWSC
REPEAT
	DIM str = INPUT("整数を入力してください。")
UNTIL reTest(str, "\d+")

PRINT str

//////////////////////////////////////////////////
// 【引数】
//   str : 正規表現による検索の対象となる文字列 
//   Pattern : 正規表現で使用するパターンを設定 
//   IgnoreCase : 大文字・小文字を区別しない場合はTrue、区別する場合はFalse 
//   Global : 文字列全体を検索する場合はTrue、しない場合はFalse 
// 【戻り値】
//   
//////////////////////////////////////////////////
FUNCTION reTest(str, Pattern, IgnoreCase = TRUE, Global = TRUE)
	DIM re = CREATEOLEOBJ("VBScript.RegExp")
	re.Pattern = Pattern
	re.IgnoreCase = IgnoreCase
	re.Global = Global
	RESULT = re.Test(str)
FEND

指定URLになるまで待機

Web操作でログイン処理する際、ロボット認証などプログラムでの操作ができないときに待機する例。メールアドレスやパスワードなどを入力した後にこの処理を入れておくと、ロボット認証・ログインボタンだけは手動で行うということができます。URLはログインボタンを押したあとに遷移するURLを指定します。

以下は、URLがhttp://example.comになるまで待機します。

UWSC
REPEAT
	SLEEP(0.001)
UNTIL IE.Document.url = "http://example.com"

関連記事

FOR-TO文
条件が真の間、処理を繰り返し実行します。途中でループを抜けたいときはBREAK文を使います。
FOR-IN文
配列やコレクションなどのグループの各要素に対して繰り返し処理を行います。
WHILE文
ループ処理を行います。ループの始めに条件判定を行いループ内で条件を変えないと無限ループになります。条件が合わなければ処理は1度も実行されません。最低1度は処理を実行したい場合はREPEAT-UNTIL文を使います。前判定。