ExcelのVBAでお願いします。


FileCopy SourceFile, TargetFile
を使って、ファイルのコピー(正確にはパスを変更だけして移動)を処理しています。
このとき、SourceFileが開かれている場合は、当然のごとくエラーが発生し、処理が止まりますが、
「SourceFileが開かれている場合、閉じるまで待ち、その後実施」
というようにしたいとき、どのように記述すべきでしょうか。

閉じるのは自分ではなく別の端末からであり、必ずいつかは閉じられることを前提に
VBAからは待ちの姿勢をとるような記述がよいです。

どうぞよろしくお願い致します。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/10/23 07:27:06
  • 終了:2011/10/23 21:14:59

ベストアンサー

id:poppyday No.1

poppyday回答回数89ベストアンサー獲得回数202011/10/23 09:07:14

ポイント100pt

つたないサンプルコードですが、こんな感じでしょうか。

エラー発生時にOnErrorGotoで例外処理を書き、エラーコードを判断します。

一定時間停止は、WindowsAPIのSleep関数を外部から呼び出すことで実現します。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Function filecpy()

On Error GoTo er

FileCopy "c:\a.doc", "c:\aa.doc" ←ここは必要なファイルコピー対象にどうぞ

a = 0

On Error GoTo 0

Exit Function

er:

a = Err.Number

On Error GoTo 0

Exit Function

End Function

Sub test()

top:

xxx = filecpy()

If (xxx <> 70) Then ←エラーコード70番は「書き込みできません」です。

Sleep (1000)

DoEvents

GoTo top

End If

End Sub

必要に応じてエラーコードの判断は追加してください。

http://support.microsoft.com/kb/146864/ja

にエラーコード一覧が載っています。

他3件のコメントを見る
id:poppyday

当方の例示では、function内で例外処理を完結していたので不要でしたが、

ご提示の例ではエラー発生後に再度エラー発生するとハンドリングができません。

一度例外を無効にする必要があります。

OnErrorGoto er2の前に「On Error Goto -1」と入れることで例外を無効化して、以降の例外発生時には例外処理できるようになります。

また、Sleep処理は待ちたい時間をそのままSleepさせるのではなく、1秒Sleep+「DoEvents」を秒数分繰り返した方が良いです。

ずっとSleepしっぱなしですと、他のWindowsイベント処理がたまってしまいますので。

2011/10/23 20:43:55
id:miku1973

「On Error Goto -1」

が目から鱗でした!上手くいきました!

ベストアンサー贈ります!

またどうぞよろしくお願い致します。

2011/10/23 21:14:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません