2017-03-22 1 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 초마다 작동이 템플릿에 의해 생성 된 문서 그게 전부를 열면 구성 (15 초 + 다른 이름으로 카운터는 테스트입니다) .

그러나 Word에서 새 문서를 만들거나 다른 파일을 열면 첫 번째 문서의 자동 저장이 작동을 멈추고 문서에서 계속 작업해도 계속 돌아 오지 않습니다.

어떤 문서가 활성화되어 있더라도 자동 저장 작업을 수행하려면 어떻게해야합니까? 이 기능은 한 번에 하나의 문서 만 열려있는 경우에만 작동합니다. 물론 내가 읽을 수는 없습니다.

답변

0

여기 어둡게 찍었지 만 모듈의 범위 내에서 (내가 말할 수있는 것부터) 문서를 디밍하고 있습니다. 새 문서를 열면 범위가 벗어날 수 있습니다. 루틴간에 문서를 전달하는 것이 가장 좋습니다. 이 같은

뭔가 : 나던 위의 구문은 인수가 전달 될 수 있도록, 그래서 만약 내가, OnTime 많이 사용하지 않은

' 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 

, 여기에 개인 문서 변수를 사용하여 버전입니다.

' 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 

이 정보가 도움이되기를 바랍니다. 나는 VBA를 위해 엑셀 내에서 주로 일하므로, 여기에서 벗어난다면 사과드립니다.

편집 :

알아 냈습니다. 저장 이벤트가 발생하면 활성 문서를 새 파일로 저장하지만 새 인스턴스를 만들지 않습니다. 예를 들어, 테스트는 다음 첫 번째 문서 인 경우

시험 엽니 다> 이벤트가 발생합니다> 테스트 Test2.docx (이벤트가 발생된다> 코드가 여전히 어떻게 든 (이 메모리에 저장되기 때문에 Test2를이 테스트 3 등

된다 내가 완전히 이해할 수는 없지만, 내가 알 수있는 것에서 무슨 일이 일어나고 있는지) 이벤트가 계속 발생합니다. 문제는 새 문서를 여는 것으로 어떻게 든 새로 고치고 이벤트가 취소된다는 것입니다.

간단한 해결 방법은 아래를 참조하십시오.

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에 대해서 나는 nonstring 매개 변수를 전달하는 것에 대해 확신이 없으며, 이것에 대해 검색하려고 노력할 것입니다.하지만 여기서 문제는 무엇이 아닌가 생각합니다. 사실 DoSave Sub는 문서를 변경 한 후에 더 이상 트리거되지 않습니다. 어떻게 든 OnTime이 완전히 취소 된 것처럼 보입니다. – Mikk

+0

단어로 테스트 루틴을 만들었으므로 문제를 재현 할 수 없습니다.나는 같은 종류의 루프를 설정하고 매 5 초마다 콘솔로 출력했다. 열기, 저장 및 문서를 닫은 후에는 문제가 없습니다. 나는 내가 열어 저장하고 닫은 문서를 덮어 쓰는 경우 어떤 문제도 가지지 않았다. 이로 인해 OnTime 메서드가 아니라 코드 내에 누락 된 것이 있다고 생각하게됩니다. –

+0

내 편집을 참조하십시오. 문제는 코드가있는 파일을 덮어 쓰는 것이므로 코드가 더 이상 존재하지 않는다는 것입니다. 문서의 새 인스턴스를 만들고 디버깅하는 코드를 추가하여 잘 작동했습니다. –