• 締切済み

Excel 起動時自動バックアップ

あるExcelデータ(クライアント側)を起動時に自動的にサーバーにバックアップしようと思ってマクロを組んでいますが、なかなかウマくいきません。 何かいい方法はありませんか? マクロはこんな感じです。 ***************************** Public Sub Auto_Open() Dim ThisName As String 'バックアップ元ファイル名 Dim ThisPath As String 'バックアップ元パス名 Dim BackupName As String 'バックアップ先ファイル名 Dim BackupPath As String 'バックアップ先パス名 ThisPath = ThisWorkbook.Path ThisName = ThisWorkbook.Name BackupPath = "\\sv1\職員用\Backup" BackupName = Left(ThisName, Len(ThisName) - 4) & Format(Now, "-yyyymmddhhmmss") & ".xls" ThisWorkbook.SaveAs Filename:=BackupPath & "\" & BackupName End Sub ***************************** これだとバックアップした方のExcelが起動してしてしまうのですが・・・

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。Wendy02です。 >ただ、ネットワークを切断してテストしてみると すみません。それは、私は忘れていました。 簡単に、Dir でも出来たと思いますが、いくつか解決策があると思います。けれども、私の書いた骨子は、Excel外の外部コマンドでコピーをさせるということですから、Error トラップは考えていなかったけれども、アイデアとしては悪くはないかもしれません。 (私の環境は、途中までやってやめてしまったので、なかなか、ネットワーク化させませんもので、それは実験していないのです。) ところで、このコードの説明がきちんとなされていなかったようですが、 If InStr(1, ThisPath, "BackUp", vbTextCompare) > 0 Then Exit Sub バックアップは、ついうっかり、バックアップ側で開いてしまうことがありますね。その時、起動時のイベントマクロが働いては困るわけで、それで、そのブックの存在しているフォルダに、BackUpという単語があれば、自動起動はやめるということを考えています。

hirosi164
質問者

お礼

>簡単に、Dir でも出来たと思いますが、いくつか解決策があると思います。 そう言われてみれば、そうですね。 バックアップ(コピー)のことばかり気にしてて、すっかりDirについて忘れてました。(笑) それから If InStr(1, ThisPath, "BackUp", vbTextCompare) > 0 Then Exit Sub のご説明、ありがとうございます。 漠然と、「バックアップしたファイルを開くと、さらにバックアップされてうっとうしいなぁ~」 とは思ってましたが、それを回避することまで想定なんてしていませんでした。 そこまで考えてプログラムは作らないといけないんですね。 勉強になりました。 A No.4のka_na_deさんのところにも書きましたが また明日以降もいろいろと別の質問もしますが 懲りずにまた教えてください。 よろしくお願いします。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.4

#2です。 少しでも参考にしていただけたなら幸いです。 コメントを拝見しましたが、当然予想される問題ですね。 こういった例外処理はおそらく定番だと思いますが、 私はド素人なもので、これ以上のコメントは控えさせて頂きます。 すっきりと解決されることを、お祈りいたします。

hirosi164
質問者

お礼

>こういった例外処理はおそらく定番だと思いますが、 定番の処理なんですね、こういうのは。 しっかり勉強します(汗) >私はド素人なもので、これ以上のコメントは控えさせて頂きます。 ka_na_deさんがド素人なら、こちらはドドド素人ですね(笑) プロフィールを拝見しましたが、35日で135件も回答されてるなんて とても「ド素人」とは思えません。 また明日以降もいろいろと別の質問もしますが 懲りずにまた教えてください。 よろしくお願いします。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#1 です。 うっかり忘れていたことですが、 'Sub Auto_Open() の中で、ThisPath の後に、 'ThisPath = ThisWorkbook.Path If InStr(1, ThisPath, "BackUp", vbTextCompare) > 0 Then Exit Sub 'なお、TextCompare を入れておきます。 そうしないと、Auto_Open が、また起動してしまいます。

hirosi164
質問者

お礼

すいません。 補足のところにお礼を入れちゃいました。 おっちょこちょいで、ホントに・・・

hirosi164
質問者

補足

ありがとうございます。 文の内容や意味するところはわかるんですが 自分にはあまりにも高度な内容なので なぜこの処理も必要なのかよくわかりません(泣)が エラーにならないようにこの文も入れておきます。 とても助かりました。 これからもよろしくお願いします。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.2

ファイル操作に関して、全くの素人です。 ThisWorkbook.SaveAs Filename:=BackupPath & "\" & BackupName を ThisWorkbook.SaveCopyAs Filename:=BackupPath & "\" & BackupName に変更する方法ではだめでしょうか? スタンドアローンのPCで模擬テストしたところ 問題ないように見えましたが・・・ 間違ってたらごめんなさい。

hirosi164
質問者

お礼

ありがとうございます。 「SaveAs」じゃなくて「SaveCopyAs」なんてモノがあるんですね。 まったく知りませんでした(泣) テストしてみたら、正常な場合はできました。 ただ、ネットワークを切断してテストしてみると '(ファイル名)'にアクセスできません。 ファイルは読み取り専用であるか、 または読み取り専用の場所にアクセスしようとしています。 または、サーバー上に保存されているドキュメントから 応答がありません。 というメッセージ(+再試行ボタンとキャンセルボタン)が表示されるので スタンドアローンでならOKなんですかね、やっぱり。 もちろん、A No.1のWendy02さんの場合でも エラー(番号 -2147023665)が起きてしまいますが On Error ステートメントで全エラーを無視しちゃってます。 (ホントにいいかは?ですが・・・) ありがとうございました。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 >ThisWorkbook.SaveAs Filename:=BackupPath & "\" & BackupName ここが変ですね。 SaveAs の後は、保存先側に、ブックが移ってしまいますから、もう一度、元のブックを戻すという方法もあるのですが、同じ、Auto_Open が働いてしまいます。 それを、オプションなどを加えて働かないようにする方法もあるとは思いますが、以下のように、Excelの適用範囲から外すことで、大幅なバックアップの時間の短縮になります。 >ThisWorkbook.SaveAs Filename:=BackupPath & "\" & BackupName これを以下の変えてみたらどうでしょうか?Shell でもかまわないのですが、一応、FileSystemObjectを使いました。試してみてはいませんが、考え方は分かっていただけるかと思います。 Set objFso = CreateObject("Scripting.FileSystemObject")  objFso.Copyfile ThisWorkbook.Path & "\" & ThisWorkbook.Name, BackupPath & "\" & BackupName, True  Set objFso = Nothing

hirosi164
質問者

お礼

お~、すご~い! 見事にできました! 感動ものです! ただ、 Set objFso = CreateObject("Scripting.FileSystemObject") objFso.Copyfile ThisWorkbook.Path & "\" & ThisWorkbook.Name, BackupPath & "\" & BackupName, True Set objFso = Nothing が、何を意味してるかはさっぱりわかりませんが(笑) わかるようにがんばって勉強していきます。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A