• ベストアンサー
  • 困ってます

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

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

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数1778
  • ありがとう数2

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

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

#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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • excelのファイルコピー

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

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

その他の回答 (4)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

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

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

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • エクセルVBA

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

  • エクセルのVBAについて

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

  • EXCEL VBAでのWord操作

    ExcelのVBAにて、Wordファイルに挿入されているExcel表を更新したいのですが、 どのように記述すればよりかわかりません。 具体的には以下のとおりとなります。 「在庫.xls」 のセル A1 「照合表.doc」に挿入されているExcel表には「在庫.xls」のセルA1を参照するように記述が 入っています。 「在庫.xls」にコマンドボタン「更新」を作成し、実行すると「照合表.doc」の値が更新されるように マクロを組みたいのですが、どなたか知恵を貸してください。

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

    お世話になります。 Excel VBAでサーバーにある共有のExcelファイルを自分のPCにコピーするコードを作りました。 FileCopy "\\Server\サンプル.xls", "\\○○○\Users\Desktop\サンプル.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

  • エクセル VBA マクロを動かしたときに元々開いているファイルを閉じる・・・

    いつも皆様には大変お世話になっております。 早速質問ですが、 「もしこのマクロが動く時点で他のExcelファイルが開いていたら、警告の上 自ファイルを閉じる、開いていなければ~実行」 という処理をかませたいと思っております。 ここの判定の方法がわかりません。(既にExcelが起動されていたら、でもいいのでしょうか。。。?) 下記のようなマクロを組んでいるので 他のファイルが開いていると厳しい状況です。 bname = "C:\" & Format(Range("q1").Value, "yyyymmdd") & "サンプル" & ".xls" ActiveWorkbook.SaveAs bname Workbooks.Open "C:\サンプル.xls" Workbooks(1).Close 本当は"yyyymmdd"&"サンプル"&".xls"ファイルだけ閉じられればいいのですが、自分の知識では上記のような形でしか動かせません;; もしご存知の方、ご教示ください。よろしくお願いします

  • Excel VBA でファイルが開かれているか確認する

    ExcelのVBAで、book1.xlsというファイルが現在開かれているか確認するにはどんなプロパティを使えばいいでしょうか? 実際にやりたい事は、book1.xlsに対して処理するマクロがあるのですが、そのbook1.xlsが開かれていなければ処理が出来ないのでマクロが入っているファイルを閉じる。というものです。

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

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

  • Excel VBAでファイルを開くとマクロを実行させるにはどのように記

    Excel VBAでファイルを開くとマクロを実行させるにはどのように記述すればいいのでしょうか? 例えば、ファイルを開くと指定のセルの削除させるような。 よろしくお願いします。

  • excelで最初に開いたファイル名称を覚えておく様な処理は可能ですか?

    excelで最初に開いたファイル名称を覚えておく様な処理は可能ですか? 1.最初の処理 (1)A.xlsのファイルを開く (2)マクロ:2010.xlsのファイルを開く (3)マクロ:チェックのシートをA.xlsの明細のシートの前に追加 (4)マクロ:チェックのシート名称をコピーした日付と時間のシート名に変更 (5)マクロ:2010.xlsのファイルをディスクトップ上から削除 2.後から追加する処理 (6)B.xlsのファイルを開く (B.xlsは、A.xlsとは異なるフォルダを作成し、A.xlsの特定のセルの中身の名称でファイル名保存されます。名前が異なるだけでマクロの中身はA.xlsと同じ) (7)マクロ:2010.xlsのファイルを開く (8)マクロ:チェックのシートをB.xlsの明細のシートの前に追加 (9)マクロ:チェックのシート名称をコピーした日付と時間のシート名に変更 (10)マクロ:2010.xlsのファイルをディスクトップ上から削除 上記を対応する為に下記の様なマクロ((6)(7)の部分を抜粋)を設定しています。 '2010.xlsのファイルを開く(2010.xlsのファイルは適宜、ディスクトップにコピーされます) Workbooks.Open FileName:="C:\Documents and Settings\ID\デスクトップ\2010.xls" 'チェックのシートを現在のブックの明細の前にコピーする。 Windows("2010.xls").Activate Sheets("チェック").Copy before:=Workbooks(1).Sheets("明細") 単独でA.xlsやB.xlsのファイルが開かれている場合には、 上記の対応で問題ないのですが、A.xls、B.xls以外のexcelファイルが開かれていると、 実行時エラーが出てしまいます。 Workbooks(1)の部分で最初に開いたexcelのファイル名称を指定しているのが 影響しているのはわかるのですが、ここの処理をなんとかしたいというおもいです。 つまり、複数のexcelファイルが開かれていて、A.xlsやB.xlsのファイルを後から開いても エラーがでない様にするには、どの様な処理にしたらよいのか教えて頂きたく。 マクロを実行したexcelのファイル名を覚えておいて、その名前が(1)に置き換わる 様な処理が望まれる処理です。