解決済

clip!clip!
Ads By Google

Do While~Loopの脱出方法とコードのまとめ方について質問させてください。



このプログラムはあるサイトの隠しデータに値を飛ばします。
1の値が入ると指定ディレクトリにテキストファイルを作ります。
一定時間が経過するとテキストファイルを消して隠しデータに2を飛ばすと新たな処理を始めるといったものです。

ここで悩んでいる部分があるのですがテキストファイルは1の値が入った後の処理が終われば自動に消えるのですが、ときたま消えない時があります。その判断基準は130秒過ぎたらおかしいです。

テキストファイルがある間はグルグルループをしていますがテキストファイルが消去されない場合無限ループに陥ってしまいます。
このプログラムの処理が開始してから130秒経ってもループしていたら脱出するといった方法はどのようにすればいいでしょうか?
脱出する際このプログラムでテキストを消し新たに値の1を飛ばすのを2回まで行うようにはしたいと思っています。

あとこのプログラムですが似通った部分があるなーと自分では考えてしまうのですがまとめようとするとうまく動きません。
Callで呼ぶ方法でやってみたのですが・・・プログラムのまとめ方にコツはありますか?


Set shell = CreateObject("Shell.Application")
For Each objWindow In shell.Windows
If TypeName(objWindow.document) = "HTMLDocument" Then
If objWindow.Document.URL = " ; Then
objWindow.document.getElementById("name").value = "1"
End If
End If
Next
WScript.Sleep(3000)
Set objFS = CreateObject("Scripting.FileSystemObject")
Do While objFS.FileExists("D:\test\test.txt")
WScript.sleep(250)
Loop
If objFS.FileExists("D:\test\test.txt") = False Then
Set shell = CreateObject("Shell.Application")
For Each objWindow In shell.Windows
If TypeName(objWindow.document) = "HTMLDocument" Then
If objWindow.Document.URL = " ; Then
objWindow.document.getElementById("name").value = "2"
End If
End If
Next
Set shell = Nothing
End If

2009-03-24 22:36の質問
この質問と回答を読んで役に立った場合は「役に立つ質問」に投票してください。投票が多い質問は、役に立つ質問一覧に掲載され、より多くの人に見てもらうことができます。

回答(1)

2.

2009-03-25 01:27:12ベスト
'概ねこんな感じでいいと思います。

Const YAHOO_URL = "http://www.yahoo.co.jp/"
Dim objFS, start_time, progress

Set objFS=CreateObject("Scripting.FileSystemObject")

Call SetValue(1)
start_time = Now '処理をした時間
WScript.Sleep(3*1000) '3秒待つ

'指定ファイルが無くなるか、130秒経過するまで待つ
progress = True
Do While objFS.FileExists("D:\test\test.txt") And progress
    WScript.sleep(250) 'さらに0.25秒待つ
    '130秒を超えた時ループを抜ける
    progress = (Datediff("s", start_time, Now) <= 130)
Loop

If progress Then 'ファイルが無くなっている時に処理
    Call SetValue(2)
Else '時間超過による脱出時の処理
    WScript.Echo "時間経過により脱出しました"
End If
'Set objFS = Nothing

Sub SetValue(n)
    Dim shell, objWindow

    Set shell = CreateObject("Shell.Application")
    For Each objWindow In shell.Windows
        If TypeName(objWindow.Document) = "HTMLDocument" Then
            If objWindow.Document.URL = YAHOO_URL Then
                objWindow.Document.getElementById("name").value = n
            End If
        End If
    Next

    'SetShell = Nothing
End Sub
回答レベル : 回答

大変ありがとうございました。時間でループの抜け方が分からなかったのですがこういったやり方をするんですね。いいものが出来ました

Ads By Google

コメント(2)

#1.  BLUEPIXY
2009-03-25 00:35:25

回答1は、題意を勘違いしていましたので、削除しました。

#2.  BLUEPIXY
2009-03-25 06:02:26

Do ~ Loop からの脱出には、一般には、Exit Do を使います。
脱出後の処理で、通常の抜けか時間オーバーの抜けかで分けるようにするために外にIf を書いていますが、本当に脱出時ということであれば、

Do ループ条件
  If ループ脱出の特別条件 Then
    脱出時の処理
    Exit Do
  End If
  通常のループの処理
Loop
とかすれば良いです。
そういえば、ファイルの削除をするのでしたか?
まあ、それは、いいですよね。

トラックバック(2)

トラックバックURL: