2017-11-21 16 views
1

Word 2010 파일에서 다른 이름으로 저장을 사용하지 않도록 설정했지만 저장은 계속 허용하려고합니다. 즉, 사용자가 기존 파일을 업데이트 할 수는 있지만 사본은 만들 수 없도록해야합니다. 나는 이것이 해결 방법을 알고있는 사람들을 위해 진정한 의미로는 불가능하다는 것을 알고 있지만 일반 사용자의 경우 Excel에서이 작업을 성공적으로 마쳤지 만 VBA라는 단어에는 전혀 익숙하지 않습니다.다른 이름으로 저장 사용 안 함 Word 2010 저장 사용

Sub FileSaveAs() 
MsgBox "Copies of this file cannot be created. Please save changes in the original document." & _ 
, , "Copy Cannot be Created" 
End Sub 

내 문서를 다양한 명령 버튼에 다른 매크로를 가지고 있지만 그들 중 누구도 원래 이름으로 (문서를 저장 포함하거나 다른 이름으로 저장 :

내가 새로운 문서 모두에 다음을 추가 할 때 의도 한대로 작동). 열려있는 매크로도 있지만 1 행은 책갈피로 이동합니다. 이 문서에서 "다른 이름으로 저장"을 시도하면 메시지 상자가 의도 한대로 표시됩니다. 상황이 이상 해지더라도 "저장"하려고하면 대화를 저장합니다 (문제 1). 같은 이름 또는 다른 이름으로 저장하려고하든 대화 상자는 저장하지 않고 대화 상자가 자동으로 다시 열리고 기본적으로 취소 (문제 2) 때까지 무한 루프가 생성됩니다. 나는 또한 간헐적으로 "디스크가 꽉 찼다"라는 경고 팝업을 저장하려고 시도한 후 몇 분 후에 나타납니다. 파일이 열린 상태에서 (아마도 자동 저장과 관련이 있습니까?)

매크로가 작동하기 때문에 테스트 파일에서이 이상한 동작은 다른 곳의 코드에 있어야하지만 다른 매크로가있는 문서는 정상적인 코드를 저장하지 않는 한 정상적으로 저장되므로 위의 코드는 너무 혼란 스럽습니다. 나는 길고 나머지 코드를 올리기 전에 위에서 언급 한 이유로 충격적인 것을 생각하지 않을 것이다. 나는 이것을 물어볼 것이라고 생각했다 :
1. 내 다른 명령 단추 매크로가 아닌 다른 곳이 있는가? 이 문제가 발생 했습니까?
2. 저장하지 않고 저장하지 않는 궁극적 인 목표를 달성하기 위해 더 나은 방법을 사람들이 권장합니까?

제공 할 수있는 조언이 있으면 미리 감사드립니다.

답변

0

Word 응용 프로그램에는 DocumentBeforeSave 이벤트가 있습니다. 응용 프로그램 이벤트를 사용하려면 ThisApplication이라는 이름으로 클래스 모듈을 만들고 다음 코드를 붙여 넣는 것이 좋습니다.

Option Explicit 

    Private WithEvents App As Application 

Private Sub Class_Initialize() 
    Set App = Word.Application 
End Sub 

Private Sub App_DocumentBeforeSave(ByVal Doc As Document, _ 
            SaveAsUI As Boolean, _ 
            Cancel As Boolean) 
    If SaveAsUI Then 
     MsgBox "Please always use the ""Save"" command" & vbCr & _ 
       "to save this file.", _ 
       vbExclamation, "SaveAs is not allowed" 
     Cancel = True 
    End If 
End Sub 

ThisDocument 모듈에 다음 코드를 추가하십시오.

Dim WdApp As ThisApplication 

Private Sub Document_Open() 
    Set WdApp = New ThisApplication 
End Sub 

당신은 당신의 기존 Document_Open 프로 시저에 Set App = ... 라인을 추가 할 수 있습니다. WdApp 변수가 초기화 된 후 모든 응용 프로그램 이벤트는 DocumentBeforeSave 이벤트 프로 시저가 SaveAs을 허용하지 않도록 프로그래밍 된 ThisApplication 클래스에 의해 수신됩니다.

물론 이것은 모든 문서에 대한 포괄적 인 거부입니다. 따라서 특정 문서에만 제한을 적용하도록 코드를 프로 시저에 추가 할 수 있습니다. proc은 Name, Path, FullName, 내장 속성, 사용자 정의 속성 등 모든 속성을 가진 전체 문서 객체를받습니다. 이들 중 어떤 것에 의해 영향을 받고자하는 파일을 식별 할 수 있습니다.

변수가 WdApp 인 경우 프로그램이 손상된 경우 지워집니다. 이 경우 응용 프로그램 이벤트가 더 이상 발생하지 않습니다. 응용 프로그램 이벤트가. 서 이벤트 전에 _ 생한다는 것을 아는 것이 유용 할 수 있습니다. 응용 프로그램의 DocumentOpen 이벤트를 문서의 Document_Open 이벤트와 함께 또는 대신 사용하려는 경우입니다.

+0

Variatus, 도와 주셔서 대단히 감사합니다. 코드가 기존 파일에서 작동하지 않았지만 문서를 "다시 작성"(문서의 모든 내용과 코드를 새 문서에 붙여 넣을 때) 훨씬 더 효과적이었습니다 (왜 그렇게 될지 확신 할 수 없었습니다. 원본 파일에서 변경된 내용이 새 파일의 어느 시점에서 다시 변경 될 수 있지만 이는 또 다른 문제입니다. – Patrick

+0

저는 WdApp 변수를 초기화하여 문제를 일으켰다 고 확신합니다. 언제든지 F5 키를 사용하여 변수를 초기화하는 Document_Open 프로 시저를 실행할 수 있습니다. ThisDocument 시트에'Debug.Print WdApp Is Nothing'과 함께 작은 서브를 작성하고 F5를 사용하여 실행하면 WdApp을 테스트 할 수 있습니다. 변수가 초기화되면 False를 직접 실행 창에 인쇄합니다. 일단 그것이 있으면 모든 문서에 대해 해당 이벤트가 실행됩니다. – Variatus