プロが教える店舗&オフィスのセキュリティ対策術

エクセルのBeforeCloseのイベントで以下のようなファイルコピーを実行しています
FSO.CopyFile ActiveWorkbook.Path & "\" & ActiveWorkbook.Name, _
BackUpPath & "\" & StrSavedFileName

やってることは、自分自身のファイルを別のバックアップ用フォルダにコピーしているのですが。
これをすると、次に同じファイルを開くと、VBProjectを開いた時バックアップした分VBProject名が残っています。
エクセルファイルを閉じた後、タスクマネージャにもExcelが残っています。

恐らく、BackUpPathのコピー先ファイルのVBProjectなのではと考えています。

試しに、この記述をコメント化すると、この現象はなくなります。

そこで質問ですが、このCopy先のVBProjectを閉じる方法はありますでしょうか?
または代替案など・・ありましたら、ご教授して頂きたいです。

よろしくお願いします。

A 回答 (3件)

#1の回答者です。



#1の方法では、後からみると、あまり意味がないと思います。
Before_Close のイベントなど不要だからです。あえて、Before_Close にこだわっただけです。

こんなことを書いても、本件には意味のない話かと思いますが。
もう少し、加えさせていただきます。

私は、この辺りのことは、何年も使い続けてきましたので、FileSystemObject という考え方は間違いではないと思います。

もちろん、VBA内部コマンドであれば、いかようにも問題はないと思います。しかし、そのメリットとしては、外部オブジェクトを利用すると、何倍ものスピードでバックアップが可能になります。何より、VBAの動きを気にせずに動かせるからです。実際のこちらのファイルサイズは、10M程度ですが、それでも、待たされることは一度もありませんでした。

しかし、問題になるのは、その実体のファイルそのもなのだと思います。私が起動時にバックアップを取った意味もお分かりになるかと思います。

Before_Close の段階では、実体ファイルはないはずなのです。
(あるという人もいるのでしょうけれども、まるごと含めた実体ファイルは存在していないはずです。だから、そういう結果になったとも言えます。)

早い話、一旦Excelを抜けて、エクスプローラー辺りで、開いているファイルのタイムスタンプを見ればわかりますでしょう。

本筋に話を戻すと、
>このCopy先のVBProjectを閉じる方法はありますでしょうか?

これは、ある意味エラーが発生していると思うのです。今現在のコードで、バックアップされたものが、本当に、up to date(最新)のものか調べてみてください。そうしたら、私の話の意味が分かってくれるかと思います。
    • good
    • 0

Workbook_BeforeClose という微妙?なイベントで


FilesystemObjectという外部オブジェクトを起動してやっているので
変なことになっているのかも?(こちらでは再現できていません)
以下だとどうじゃろね?当方Excel2010。
保存に時間の掛る重たいファイルやネットワーク上のフォルダでの検証は
行っていません。
投稿用にタブインデントの代わりに全角スペースを代用しています。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim BK As Workbook
  
  Set BK = ThisWorkbook
  If BK.Saved = False Then
    Select Case MsgBox("保存する?", vbYesNoCancel)
      Case vbCancel
        Cancel = True
        Exit Sub
      Case vbNo
        BK.Saved = True
      Case vbYes
        BK.Save
        BK.SaveCopyAs _
          BK.Path & "\" _
          & Left(BK.Name, InStrRev(BK.Name, ".") - 1) _
          & Format(Now, "\_yymmdd\_hhnnss") _
          & Right(BK.Name, InStrRev(BK.Name, ".") - 1)
    End Select
  End If
  Set BK = Nothing
End Sub
    • good
    • 0

>エクセルのBeforeCloseのイベントで以下のようなファイルコピーを実行しています



終了中に、VBAで手間の掛かる作業をさせて終了を送らせるというマクロをさせてみましたが、再現はできませんでした。だから、私の発言は、想像の範囲になってしまうことをお許し下さい。

それと、以下の文章は、読みにくいと思いますが、勘弁してください。

残ったVBProjectは、必ずしも、バックアップの対象となっているファイルでしょうか?アドインなどで、紐付になったものとは限らないでしょうか。

ともかく、私の知識の範疇ですが、BeforeClose で、FSO.CopyFile という方法は考えません。直感的に、バックアップはうまく行かないような気がします。

Excelというのは、仮想メモリに展開しているはずですから、そちらのものを取り出さないと、Close 自体では、バックアップは取り出せないはずです。一旦、保存の命令を出さないとHDDなりに実体化しないはずです。

だから、BeforeClose  で、Save イベントが働くなどした時に、ファイルが実体化させ、そのファイルをコピーするなら可能だと思います。

BeforeClose イベントだけだと、バックアップは成功しないのではないかと思いました。

一例です。実際に、私が試みた段階のコードです。実務的には、Workbook_Openに設けることに落ち着きました。

ハングしたり書き換えた後のバックアップよりも、本日の最初に開けた時に、自然に開けたのなら、その健全なファイルを残そうというものです。だから、これに、日付の比較をして、同日なら保存はしないとします。

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FilesystemObject")
 objFSO.CopyFile ThisWorkbook.Path & "\" & ThisWorkbook.Name, ThisWorkbook.Path & "\Backup\" & ThisWorkbook.Name
 Set objFSO = Nothing
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 ThisWorkbook.Saved = False
End Sub

p.s.
それと、ActiveWorkbookというのは、同じようだけれども、イベント型としては、対象がちょっと違うかな?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!