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を同期実行するためにはどうしたら良いですか?
No.1ベストアンサー
- 回答日時:
>通常、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が出現すると監視を終了します。
No.2
- 回答日時:
>Excelの他の機能も使えなくなってしまいますが、
>これらの機能を使える状態で
>ファイルの生成を監視することはできないでしょうか?
以下のようにしてください。
Sleep 100 ・・・・Sleep 1000 を100に変更(100でだめなら10で試してください。こちらでは100でOKでした)
DoEvents ・・・・この行をSleep 100の後に追加
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/10 11:34
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
プログラミング ソースコード
-
なんかC言語でプログラム書いて...
-
VB上で実行中の無限ループの止め方
-
getchar()の意味・・・
-
sendkeysにてALT+CTRL+INSERTを...
-
C言語で途中までしか、プログラ...
-
VBAで外部プログラムを非表示で...
-
fortran a.exe システムエラー
-
MACで動く実行ファイルをWindow...
-
終了してもプログラムが実行し...
-
一瞬で消える
-
VB.NETで作ったプログラムがサ...
-
初期化は、main関数の外で...
-
NORTiプログラムのROM化
-
VB6やVB.NETはコンパイル無しで...
-
Java Autoupdater
-
インスタンスとは何ですか?
-
JavaScriptでレースゲームを作...
-
C言語のFFTについて教えてくだ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
なんかC言語でプログラム書いて...
-
プログラミング ソースコード
-
MACで動く実行ファイルをWindow...
-
実行時エラー429
-
Windows10でDOSゲーム
-
VB上で実行中の無限ループの止め方
-
他のPC上にあるexeを、そのP...
-
sendkeysにてALT+CTRL+INSERTを...
-
VBAで外部プログラムを非表示で...
-
システム資源とは?
-
プロセス間通信について
-
アクセス[ファイルを開かずに、...
-
C言語でプログラムを再起動
-
C言語で途中までしか、プログラ...
-
system関数を使用してsuコマン...
-
終了してもプログラムが実行し...
-
PIC のデータEEPROMに書き込み...
-
実行中の実行ファイルの上書き
-
他の実行ファイルを実行するプ...
おすすめ情報
ありがとうございます。
うまくいきました。
私が示したコードは何が問題だったのでしょうか?
教えてくださったコードなのですが
プログラム実行中にユーザーフォームやワークシートなど
Excelの他の機能も使えなくなってしまいますが、
これらの機能を使える状態で
ファイルの生成を監視することはできないでしょうか?
よろしくお願いいたします。
うまくいきました
ありがとうございます。