プロが教えるわが家の防犯対策術!

VBAに関する質問です。

あるフォルダーに指定したファイルが生成されたら別のsubを実行するプログラムを作りたいのですが
Web上で調べて以下のコードを書いてみました。

Sub WatchNewFile(filepath As String)

If Dir(filepath_last) = "" Then
Application.OnTime Now + TimeValue("00:00:01"), "'WatchNewFile ""filepath""'"
 End If

End Sub



Sub test()

Dim filepath As String

filepath = "D:\test\test.txt"

Call WatchNewFile(filepath)

Beep

End Sub

実際にはBeepのところにsubを書くのですが
とりあえず正常に動作するか確認するためにBeepを入れています。
これのtestプログラムを実行すると、
D:\test\test.txtが存在しなくても
速攻でBeepが鳴ってしまいます。

しかしVBEを開いて、WatchNewFile内のコードのどこかに
ブレークポイントを置いてみると
そこでプログラムが止まるので、プログラムは終了していないことが分かります。

つまり、なぜかファイルを検索するためのループからは抜けていないのに
ループの後のコードが実行されていることになります。

通常、Sub内にForで無限ループを書いた場合、
ループを抜けない限りそのSubの後のコードは実行されないはずなのですが
なぜこのようなことが起きるのでしょうか?


そしてSubを同期実行するためにはどうしたら良いですか?

質問者からの補足コメント

  • ありがとうございます。

    うまくいきました。

    私が示したコードは何が問題だったのでしょうか?


    教えてくださったコードなのですが
    プログラム実行中にユーザーフォームやワークシートなど
    Excelの他の機能も使えなくなってしまいますが、
    これらの機能を使える状態で
    ファイルの生成を監視することはできないでしょうか?

    よろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/11/21 12:20
  • うまくいきました
    ありがとうございます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/11/22 18:50

A 回答 (2件)

>通常、Sub内にForで無限ループを書いた場合、


>ループを抜けない限りそのSubの後のコードは実行されないはずなのですが
>なぜこのようなことが起きるのでしょうか?

あなたが提示されたコードの
If Dir(filepath_last) = "" Then  ・・・のfilepath_lastは filepathの誤りかとお思いますが、それは置いといて
この場合は、ループを既に抜けています。

>しかしVBEを開いて、WatchNewFile内のコードのどこかに
>ブレークポイントを置いてみると
>そこでプログラムが止まるので、プログラムは終了していないことが分かります。
別スレッドでSub WatchNewFileが呼び出されているため、そこでとまります。
これは、あなたがm最初に実行したSub Test()とは別物です。

>そしてSubを同期実行するためにはどうしたら良いですか?
Application.OnTime の使用をやめます。
以下のようにしてください。
-----------------------------------------------------------
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub WatchNewFile(filepath As String)
Dim endFlag As Boolean
endFlag = False
Do
If Dir(filepath) <> "" Then
endFlag = True
End If
Sleep 1000
Loop While endFlag = False
End Sub



Sub test()

Dim filepath As String

filepath = "D:\test\test.txt"

Call WatchNewFile(filepath)
MsgBox "OK"
End Sub
---------------------------------------
BeepをMsgBoxに変えました。
それを確認後、あなたの希望するsubで書き換えてください。
D:\test\ の下に test.txt が出現するまで、
1秒間間隔で出現をチェックします。
test.txtが出現すると監視を終了します。
この回答への補足あり
    • good
    • 0

>Excelの他の機能も使えなくなってしまいますが、


>これらの機能を使える状態で
>ファイルの生成を監視することはできないでしょうか?
以下のようにしてください。
Sleep 100 ・・・・Sleep 1000 を100に変更(100でだめなら10で試してください。こちらでは100でOKでした)
DoEvents ・・・・この行をSleep 100の後に追加
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!