2009-05-06 2 views
0

초보자 질문에 대해 미리 사과드립니다. VBA 환경의 대부분은 Excel 또는 Word에서 Excel로 진행됩니다. 이 경우 Excel에서 Word로 이동합니다. 일부 Word 양식에서 일부 데이터를 캡처하여 Excel 파일에 저장하려고합니다.Excel VBA 루프에서 여러 개의 Word 파일 열기

는 지금, 내 코드는 폴더의 첫 번째 문서에 대한 작동하지만, 그 후에는 (끈적 거리는!) "서버 예외가 발생했습니다"여기

내 코드 자동화 오류와 호스 :

Dim objWordApp As Object 

strCurFileName = Dir(strFilePath) 

Set objWordApp = CreateObject("word.application") 
objWordApp.Visible = True 

Do While strCurFileName <> "" 

    objWordApp.documents.Open strFilePath & strCurFileName 
    objWordApp.activedocument.Unprotect password:="testcode" 

    {EXCEL PROCESSING HERE} 

    strCurFileName = Dir 
    objWordApp.activedocument.Close 0 

Loop 

objWordApp.Quit 
Set objWordApp = Nothing 

나는 앱을 종료하고 루프 내에 object = nothing을 설정하면 코드가 제대로 작동한다는 것을 알게되었습니다. 하지만 이제는 "objWordApp.documents.Open strFilePath & strCurFileName"줄에있는 폴더의 두 번째 파일에서 폭탄을 터뜨립니다.

개체를 반복해서 만들지 않고 루프에서 Word 문서를 열고 닫을 수 있습니까? 그렇게 할 때 정말 느립니다.


도움을 주셔서 감사합니다. 불행히도, 나는 같은 결과를 얻는다. 이 프로그램은 읽어 줄의 루프를 통해 두 번째 다이 :

Set objWordDoc = objWordApp.Documents.Open(objFile.Path) 

내가 오류는 다음과 같습니다

런타임 오류 -2147417851 (80010105) 자동화 오류 서버 던진

예외.

나는 정규식 워드 프로세서 (처리중인 코드가 아닙니다)에 코드를 시험해 보았는데 정상적으로 작동했습니다. 실행중인 문서에는 양식 필드와 매크로가 있습니다. 차이가 있는지 여부는 확실하지 않습니다. Word의 매크로 보안을 "낮음"과 "매우 높음"으로 설정하여 다른 매크로가 간섭하지 않도록했습니다.

왜 첫 번째 문서에서는 작동하는지, 다음 문서에서는 작동하지 않는지 알 수 없습니다. 나는 심지어 첫 번째 문서를 복제했지만 아무런 차이가 없었다.


그래도 운이 없다. 내가 작업 할 수있는 유일한 방법은 파일을 열 때마다 개체를 완전히 지우고 다시 만듭니다.

Set objFolder = FSO.GetFolder(strFilePath) 

For Each objFile In objFolder.Files 

    Set objWordApp = CreateObject("word.application") 
    objWordApp.Visible = True 

    If Right(objFile.Name, 4) = ".doc" Then 
     Set objWordDoc = objWordApp.documents.Open(Filename:=objFile.Path, ConfirmConversions:=False, _ 
      ReadOnly:=True, AddToRecentFiles:=False, PasswordDocument:="", _ 
      PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _ 
      WritePasswordTemplate:="", Format:=wdOpenFormatAuto) 

     [Process DOC] 

     objWordDoc.Close 0, 1 
    End If 

    Set objWordDoc = Nothing 
    objWordApp.Quit 
    Set objWordApp = Nothing 

Next 

나는 왜 그것이 작동하고 왜 다른 방식으로 작동하지 않을지 잘 모르겠습니다. 이 길을 가야한다면 할 수 있습니다. 단지 속도가 느리고 비효율적 인 것처럼 보입니다. 이것은 나쁜 생각입니까?

+0

"폭탄 아웃"이란 무엇을 의미합니까? 어떤 오류 메시지? – shahkalpesh

답변

1

Dir을 FileSystemObject로 변경 (Tools \ References로 이동하여 Microsoft Scripting Runtime 추가)하고 성공적으로 여러 파일을 열 수있었습니다. 문제가있는 경우 디버거에 표시되는 오류를 설명하십시오. 또한 하위 디렉토리로 재귀해야하는 경우이를 리팩터링해야합니다.

Private mobjWordApp As Word.Application 

Sub Test() 
    ProcessDirectory "PathName" 
End Sub 

Property Get WordApp() As Word.Application 
    If mobjWordApp Is Nothing Then 
    Set mobjWordApp = CreateObject("Word.Application") 
    mobjWordApp.Visible = True 
    End If 
    Set WordApp = mobjWordApp 
End Property 

Sub CloseWordApp() 
    If Not (mobjWordApp Is Nothing) Then 
    On Error Resume Next 
    mobjWordApp.Quit 
    Set mobjWordApp = Nothing 
    End If 
End Sub 

Function GetWordDocument(FileName As String) As Word.Document 
    On Error Resume Next 
    Set GetWordDocument = WordApp.Documents.Open(FileName) 
    If Err.Number = &H80010105 Then 
     CloseWordApp 
     On Error GoTo 0 
     Set GetWordDocument = WordApp.Documents.Open(FileName) 
    End If 
End Function 

Sub ProcessDirectory(PathName As String) 
    Dim fso As New FileSystemObject 
    Dim objFile As File 
    Dim objFolder As Folder 
    Dim objWordDoc As Object 

    On Error Goto Err_Handler 

    Set objFolder = fso.GetFolder(PathName) 
    For Each objFile In objFolder.Files 
    If StrComp(Right(objFile.Name, 4), ".doc", vbTextCompare) = 0 Then 
     Set objWordDoc = GetWordDocument(objFile.Path) 
     ' objWordDoc.Unprotect Password:="testcode" ' Need to check if it has Password? 
     ProcessDocument objWordDoc 
     objWordDoc.Close 0, 1 
     Set objWordDoc = Nothing 
    End If 
    Next 

Exit_Handler: 
    CloseWordApp 
    Exit Sub 

Err_Handler: 
    MsgBox "Error " & Err.Number & ": " & Err.Description 
    Resume Exit_Handler 
    'Resume Next ' or as above 
End Sub 

Sub ProcessDocument(objWordDoc As Document) 
    '{EXCEL PROCESSING HERE}' 
End Sub 

편집 : 할 수있는 아주 조금 더 리팩토링가 있지만 나는 몇 가지 오류 처리와 약간의 리팩토링을 추가했습니다.

열려있는 문서에 대해 특별한 것이 있어야합니다.그런 다음 말씀 상수 (wdDoNotSaveChanges 등)을 사용하기 시작 않는 경우

Set objWordDoc = objWordApp.Documents.Open(_ 
    FileName:=objFile.Path, ReadOnly:=True) 

당신은 참조로 Microsoft Word를 추가 할 필요가 있으며, : 당신은 같은 문서를 열기위한 다른 매개 변수를 사용하여 시도 할 수 있습니다. Documents.Open에 대한 도움말을 확인하고 다른 매개 변수를 테스트하십시오.

또한 디버깅 중에 상황에 맞는 메뉴에서 "Set Next Statement"를 사용하고 첫 번째 문서를 건너 뛰고 두 번째 문서를 직접 열고 문제점이 있는지 확인하십시오.

편집 : 설명 된 자동화 오류가 발생하면 코드를 닫고 Word를 다시 엽니 다. 오류 번호를 조정하거나 오류가 발생하면 Word를 닫아야합니다 (Err.Number <> 0 Then ...).

이 코드는 내가 시도한 테스트 케이스에서 작동하기 때문에 문서 (매크로, 보호 등)에 대해 특별한 것이 있어야합니다. 수동으로 Word에서 문서를 열고 스크립트와 같은 순서로 정보를 업데이트하고 프로세스 스크립트와 유사한 정보를 업데이트 한 다음 문서를 닫아 Word에서 이상한 점이 있는지 확인해 봤습니까?

Word.Application을 닫아도 아무런 해가되지 않지만 분명히 느려질 것입니다.