2017-03-22 13 views
0

特定のテンプレートから作成されたすべての文書に対して自動保存機能を実装しようとしています。このテンプレートでは、私はテストのために次のように作成した:今Application.OnTimeがアクティブな文書を変更した後に起動を停止する

Dim doc As Document 
Dim count As Integer 

Private Sub Document_Open() 
count = 1 
Set doc = ActiveDocument 
SaveTime 
End Sub 

Sub SaveTime() 
Application.OnTime When:=Now + TimeValue("00:00:15"), _ 
name:="DoSave" 
End Sub 

Sub DoSave() 
doc.SaveAs2 "c:\test\testsave" & count & ".docx" 
count = count + 1 
SaveTime 
End Sub 

私は自動保存のように15秒ごとに動作します。このテンプレートで作成されたドキュメントのthatsを開くと意図(15秒+異なる名前を持つカウンタは単なるテストのためです) 。

しかし、Wordで新しい文書を作成したり別のファイルを開くと、最初の文書の自動保存は機能しなくなり、文書で作業を続けると元に戻りません。

どのドキュメントがアクティブであっても、自動保存を行うにはどうすればよいですか?このように、この機能は、一度に1つのドキュメントのみが開いている場合にのみ機能します。もちろん、これは私がガーメントにすることはできません。

答えて

0

ここでは暗闇の中で撮影していますが、モジュールの範囲内で(私が知ることができる)調光しています。新しい文書を開くと、これが範囲外になる可能性があります。ルーチン間でドキュメントを渡すのが最善の方法です。このような

何か:

' This will declare count within the scope of the module 
Private count As Integer 

Private Sub Document_Open() 
    count = 1 
    SaveTime ActiveDocument 
End Sub 

Sub SaveTime(doc as Document) 
    Application.OnTime When:=Now + TimeValue("00:00:15"), "'DoSave doc'" 
End Sub 

Sub DoSave(doc as Document) 
    doc.SaveAs2 "c:\test\testsave" & count & ".docx" 
    count = count + 1 
    SaveTime 
End Sub 

私はあまりのOnTime使用していないので、doesntの上記の構文は、引数を渡すことができるようにする場合は、ここでプライベートドキュメント変数を使用したバージョンです。

' This will declare count and doc within the scope of the module 
Private count As Integer 
Private doc as Document 

Private Sub Document_Open() 
    count = 1 
    SaveTime 
End Sub 

Sub SaveTime() 
    Application.OnTime When:=Now + TimeValue("00:00:15"), "DoSave" 
End Sub 

Sub DoSave() 
    doc.SaveAs2 "c:\test\testsave" & count & ".docx" 
    count = count + 1 
    SaveTime 
End Sub 

これが役立ちます。私は主にExcel内でVBAのために働いていますので、私はここのマークから離れている場合は謝罪します。

編集:

私はそれを理解しました。何が起こっているのは、アクティブなドキュメントを新しいファイルとして保存しているセーブイベントが発生するたびに、新しいインスタンスを作成していないときです。テストは、あなたの最初の文書である場合、例えば:

テストオープン>イベント火災>テストTest2.docx(イベント火災なるコードがまだこの(何とかメモリに格納されているので> Test2を等

Test3はなります問題は、新しい文書を開くと何らかの形でこれをリフレッシュし、イベントがキャンセルされるということです。

簡単な回避策は、下記を参照してください。

Option Explicit 
Private doc As Document 
Private count As Integer 
Private Sub Document_Open() 
    count = 1 
    Set doc = ActiveDocument 
    SaveTime 
End Sub 
Sub SaveTime() 
    Application.OnTime Now + TimeValue("00:00:15"), "DoSave" 
End Sub 

Sub DoSave() 
    doc.Save 
    Application.Documents.Add doc.FullName 

    ActiveDocument.SaveAs2 "c:\test\testsave" & count & ".docx" 
    ActiveDocument.Close 

    count = count + 1 
    SaveTime 
End Sub 

これは、ドキュメントの新しいインスタンスを作成し、この新しいインスタンスを保存して閉じます。これにより、古いインスタンスはそのまま残り、実行されます。

私はすべてが意味を成就することを願っています。確かに、コードを保持している文書がもはや存在しなくても、コードがなぜメモリに残っているのかは不明です。

+0

ヘルプBrandonに感謝します。 私はあなたのvariant2を試しましたが、違いはありませんでした。 Variant1について私は非ストリングのパラメータを渡すことについてもわからないので、私はこれについて調べようとしますが、ここでは問題ではないと思います。 実際にDoSave Subはドキュメントを変更した後にもう起動しません。失敗したセービングではありません。 OnTimeが何とか完全にキャンセルされるようです。 – Mikk

+0

私は単語内でテストルーチンを作成しましたが、問題を再現できません。私は同じ種類のループを設定し、5秒ごとにコンソールに出力しました。私がdidntした文書を開いて、保存し、閉じた後、何か問題があります。オープンした文書を上書きして保存して閉じてしまった場合は、問題はありませんでした。これにより、OnTimeメソッド内ではなく、コード内に存在しないものがあると私は信じています。 –

+0

私の編集を参照してください。問題は、コードを含むファイルが上書きされているため、コードが実行されなくなったことです。ドキュメントの新しいインスタンスを作成するためのコードを追加し、デバッグするだけでうまくいきました。 –

関連する問題