• ベストアンサー

エクセルのVBAでファイルの状態を調べるコマンド

エクセルのVBAでファイルのコピーをしたいのですが、コピー元がOPEN状態だとコピーできません。 FileCopy "C:\A.XLS", "C:\B.XLS" そこで、上記のコマンドを実行する前に、コピー元がOPEN状態かどうかを判断させて、OPEN状態だと実行を5秒待つようなマクロを記述したいのですが、可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

#3です。 > 演算時にバックアップソフトとのバッティングが考えられます。 FileCopyステートメントは開いていると失敗しますが、エクスプローラ等では普通にコピー出来ます。 まぁ、バックアップソフトでコピー&リネーム出来るかは不明ですけど、、、 取り合えず #1さんの方法で書いてみました。 コピーを試みて失敗したら5秒待ち、1分程経っても成功しない場合は終了します。 良い方法かどうかは解りません。 Sub Test() Dim StartTime As Single, Cnt As Integer Cnt = 1 On Error GoTo ER:   FileCopy "C:\A.XLS", "C:\B.XLS"   MsgBox "コピーが完了しました", vbInformation, "成功" Exit Sub ER:  If Cnt <= 12 Then    StartTime = Timer      Do While Timer < StartTime + 5        DoEvents      Loop    Cnt = Cnt + 1    Resume  Else    MsgBox "コピー出来ません。", vbCritical, "失敗"  End If End Sub

QAZ123
質問者

お礼

コードまで考えていただき、ありがとうございました。 おかげさまで目的を達成することができました。 DoEventsは知らなかったのですが、この命令により別の懸案事項もクリアできました。 どうもありがとうございました。

その他の回答 (4)

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.4

アルゴリズム的にはファイルAの更新時(保存ボタンを作ってそちらで上書き保存とバックアップ処理を行う or Closeイベントでバックアップさせる)にバックアップを取るだけで問題ないような気がするのですが・・・? ファイルAのオープンチェックについては、それが両方ともPC1上で行われるのであれば、プロセスや同名のブックが開かれているかを確認するだけで可能ですが、別PC上で行われるのであればやはりエラーが発生するのかどうかで判別するしかないでしょう。 それにそもそもその手のエラーは開かれている時だけ発生するという訳でもありません。更新される側のファイルBが使用中とか、別PCへのコピーならアクセス権限やLANの問題などでもエラーは出ますよ。

QAZ123
質問者

お礼

Closeイベントでバックアップするなど、いろいろと勉強になりました。 ありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#2の補足を読む限り、バックアップソフトを常駐させておいた方が遥かに楽な気がしますが、、、 フリーでもシェアでも多数公開されてますので。 http://www.vector.co.jp/vpack/filearea/winnt/util/backup/ http://www.vector.co.jp/vpack/filearea/win95/util/backup/

QAZ123
質問者

補足

バックアップが最終目的ではなく、コピーされたファイルBをもとに演算を行いたいと考えているので、バックアップソフトでコピーを行うと、今度は演算時にバックアップソフトとのバッティングが考えられます。 (1)ファイルAのオープンチェック (2)オープンチェックがokなら(3)の処理、NGなら5秒待機後(1)へ (3)ファイルAをファイルBにコピー (4)ファイルを元に演算を行い、ファイルCを作成 上記の(1)から(4)までの処理をVBAの中で完結させたいので、(1)のファイルAのオープンチェックがしたいのですが、無理なのでしょうか?

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

5秒待つってのはあまり実用性がないアルゴリズムですよ。実際にお使いのソフトでそんなエラー待ち処理をしているソフトってないでしょ? エラーが出たらダイアログが出て中断するとか、エラー内容を出して続行ボタンをおしたら再試行を実行させるとかにするのが普通です。あるいは有無を言わさずアプリが落ちるとかw 現実的にエラーが発生する状況を想定すれば、5秒なり10秒なり待ったところで、ユーザー側がそのエラー状況を解除しない限りはエラーは続くのですから、時間制限でループさせることの意味がまるでありません。 で、その手のエラーの判別については、実際に開いているエクセルファイルがあるかどうかという判別で処理は可能ですが、そんな手間をかけるよりもエラー制御で処理するのがまた一般的な対応法です。 例えば以下のコードを試してみてください。 On Error Resume Next Err.Clear FileCopy "C:\A.XLS", "C:\B.XLS" MsgBox (Err.Number) MsgBox (Err.Description) 何かのエラーが起きたときにどのようなエラーが起きたかをキャッチすることができます。エラーナンバーによって、どのようなエラーが起きているか、あるいは起きていないかが判別できるので、それにあわせて処理を分岐するようにします。

QAZ123
質問者

補足

説明不足ですみません。 パソコンが2台(PC1、PC2)あって、PC1がPC2に保存されている共有ファイルAを不定期に更新し、そのファイルをPC2が5分ごとにファイルBにコピーしたいと考えています。 たまたまPC1がファイルAを更新中に、PC2がファイルのコピーを行うとバッティングしてしまいエラーになるので、ファイルをコピーする前にファイルAのオープンチェックを行いたいと思っています。

  • deecyan
  • ベストアンサー率38% (89/233)
回答No.1

onerr を書いて エラーになったら 5秒待って resume したらいいのでは? でも エラーになった回数を記録して 何回かしたら EXITしたほうがいいかな? または MSGBOXを出して 待つ手もありますよ

関連するQ&A

  • エクセルVBA 開いているブックのコピー

    filecopyを使って、ファイルをある場所から別の場所へコピーしたいと思っています。 しかし、コピー元のファイルが開かれていると、エラーが出ていることがわかりました。 FileCopy "C:\xxxxx\B.xls","C:\yyyyy\B.xls" といったコードで、B.xlsが開かれていると、エラーが起こります。 エラーが起こるのはこのコマンドの仕様のようです。 ただし、自分自身(このコードを実行しているファイル)はA.xlsとします。 対象のファイルが開かれていてもコピーするには、どうしたらよいでしょうか?

  • エクセルVBAで開いているファイルをコピーする方法

    はじめまして。 ころと申します。 (初書き込みです。そして、エクセルVBA初心者です。 質問の仕方等に問題がありましたら、ご指摘ください。) 以下のようにファイルをコピーする方法を知っているのですが、CopyTest1.xlsを開いているとコピーできません。ファイルを開いていてもコピーする方法を教えてください。 Sub copy() SourceFile = "C:\CopyTest1.xls" TargetFile = "C:\CopyTest2.xls" FileCopy SourceFile, TargetFile End Sub CopyTest1.xlsを開いて、CopyTest1.xlsのマクロを動かして、CopyTest1.xlsのファイルの複製を作りたいのです。 詳しい方々、よろしくお願いいたしますm(__)m

  • VBAでエクセルからエクセルのファイルを開くには?

    D:\に db1.mdb Book1.xls があります。 db1.mdbのフォームのコマンドボタンをクリックして Book1.xlsを開きたいのですが VBAコードをご教授いただけますか? (マクロではなくVBAコードが知りたいです) エクセルからエクセルのファイルを開くなら Workbooks.Open ファイルのフルパス で出来ました。 ご回答よろしくお願いします。

  • エクセルのVBAについて

    エクセルのVBAについて教えて下さい。 エクセルのVBAでプログラムを組んでいるのですが、一つわからないことがあるのです。 マクロが実行(オープン)されるファイル名(ファイルパス)をVBAで取得するためにはどうすればいいでしょうか? たとえば、マクロが実行されるファイルがC:\テスト.xlsならば "C:\テスト.xls"を取得したいと考えています。 どなたかご教授お願い致します。 宜しくお願い致します。

  • VBA-MyExcelファイルをコピー

    目的は今開いているExcelファイルを適宜バックアップする。 方法として自身Excelに下記VBA「FileCopy」文を記述して実行⇒実行エラーにて失敗。 対処方法又は妙案をご教授ください。 Option Explicit Private Const MyFile = "C:\Tmp\Sample.xls" '自身ファイル Private Const DsFile = "C:\Tmp\Sample_01.xls" '複製ファイル Sub SAMPLE() ThisWorkbook.Save FileCopy MyFile, DsFile End Sub

  • エクセル2000VBAでファイルを操作したい

    いつもお世話になっています。 エクセルVBAで別のワークブックを参照したいので workbooks.open Filename:="C:my documents\***.xls" とすると、そのオープンするワークブックのTisWorkbookのWorkbook_Open()で実行している(.show)メニュー(ユーザーフォーム)が開いてしまいます。 このとき、Workbook_Open()を実行させないでワークブックを開く方法って、 なにかありますか? Shiftを押しながらファイルを開くとき、実行されませんよね?それをVBAでできるのですか? よろしくお願いします。

  • エクセルVBA

    こんばんは! エクセルマクロ初心者です。 エクセルVBAについて教えてください! パス(?)を指定して、ファイルを開けてから実行する マクロを書きたいのですが、エラーになってしまいます。 Dim Filename as string (1)Workbooks.Open Filename:= "\D\MyDocument\●●.xls" (●●はファイル名) (2)Workbooks("●●").Activate (1)の部分は実行されて目的のファイルは開くのですが(2)でエラーになってしまいます。 どなたか教えてください! 以前までは、このマクロ実行できていたのですが、突然できなくなりました。 困ってます。

  • Excel VBAで読み取り専用ファイルをコピー

    お世話になります。 Excel VBAでサーバーにある共有のExcelファイルを自分のPCにコピーするコードを作りました。 FileCopy "\\Server\サンプル.xls", "\\○○○\Users\Desktop\サンプル.xls" 通常は問題ないのですが、コピーするファイルが誰かに開かれていると、たぶん、読みとり専用となるためにエラーとなります。 読み取り専用の時でもエラーにならずにコピー出来る方法を教えて頂けないでしょうか? よろしくお願いします。

  • VBA マクロ付きExcelファイルを無効で開く

    タイトルの通り、マクロを含むExcelファイルを、マクロ無効でオープンしたいのですが、そういうことは出来るでしょうか? 新規ファイル作成.xlsというマクロがあって、temp.xlsというマクロを含んだファイルをnew.xlsというファイル名でコピーし、それをオープンしてデータを追加して終了。 次にそのnew.xlsをオープンした時にはtemp.xlsに含まれるマクロが実行される・・・ というようなことをしたいと思っています。 もしくは新規ファイル作成.xlsのマクロから、直接new.xlsのファイルにコーディングが可能であれば、それでも良いのですが・・・ データベースから表を作成し、作成後の変更データを再度データベースへ戻す、ということがやりたいのですが、上記の方法しか思いつきません。 もし上記の方法が出来ない場合は、別の方法がありますでしょうか? どなたかアドバイス、よろしくお願いします。

  • excelのファイルコピー

    excelvbaでファイルコピーをしようと思っています。 コピーは自分自身のファイルをコピーしようとしています。 ファイル1.xls(自分自身、コピー元) ファイル2.xls(コピーされたファイル) FileCopyを使用し以下のようにやろうとしましたが、書き込みエラーがでてうまくいきませんでした。 エラーメッセージ「実行時エラー '70': 書き込みできません。」 FileCopy "ファイル1.xls", "ファイル2.xls" どのようにすればうまくいくのでしょうか?

専門家に質問してみよう