Я заранее прошу прощения за вопрос новичка - большая часть моего опыта VBA в Excel или Word в Excel. В этом случае я перехожу из Excel в Word. Я пытаюсь собрать некоторые данные из некоторых форм Word и сохранить их в файле Excel.
Прямо сейчас мой код работает для первого документа в папке, но после этого он вылетает с ошибкой автоматизации "сервер выдал исключение" (goo!)
Вот мой код:
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
Я заметил, что код работает нормально, если я закрываю приложение и устанавливаю объект = ничего в цикле. Но так оно и есть, он взрывает второй файл в папке в строке «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
Я не уверен, почему это работает и почему это не сработает. Если мне придется пойти по этому пути, я смогу - это кажется очень медленным и неэффективным. Это плохая идея?