У меня проблема: экземпляры Excel и Word ведут себя по-разному в той же процедуре. Посмотрите на код. Идея состоит в том, чтобы иметь процедуру, которая обрабатывает сохраненные файлы в excel и word в различных комбинациях форматов.Excel и Word ведут себя по одному и тому же коду
Проблема заключается в том, что я замечаю, что слово и excel ведут себя по-другому - appWord и appExcel имеют разные имена типов. В какой-то момент appWord изменяется с Application на Object, что делает невозможным его закрытие. Я не понимаю различий в поведении, так как применяемый к ним код идентичен.
Option Explicit
Dim fso
Dim appWord
Dim appExcel
Set fso = CreateObject("Scripting.FileSystemObject")
startWord
ResaveFiles appWord.Documents, "docx", 12, 0
appWord.quit
startExcel
ResaveFiles appExcel.Workbooks, "xlsx", 51, 56
appExcel.quit
MsgBox "All done."
Sub ResaveFiles(appType, srcExtName, srcExtNum, tmpExtNum)
Dim objFile
Dim objOpenFile
Dim strDirectory
For Each objFile in fso.GetFolder(".").Files
If lcase(fso.GetExtensionName(objFile)) = srcExtName Then
If typeName(appType) = "Documents" Then StartWord
If typeName(appType) = "Workbooks" Then StartExcel
Set objOpenFile = appType.Open(objFile.path)
strDirectory = fso.BuildPath(objOpenFile.path, fso.GetBaseName(objOpenFile.name) & "._temp")
objOpenFile.SaveAs strDirectory, tmpExtNum
objOpenFile.Close
msgBox typename(appType) & objFile
msgBox typename(appWord) 'First typename test
msgBox Typename(appExcel)
If typeName(appType) = "Documents" Then appWord.Quit
If typeName(appType) = "Workbooks" Then appExcel.Quit
set objOpenFile = appType.Open(strDirectory)
objOpenFile.SaveAs objFile.path, srcExtNum
objOpenFile.Close
fso.DeleteFile(strDirectory)
msgBox typename(appWord) 'Second typename test
msgBox Typename(appExcel)
End If
Next
End Sub
'Start Word
Sub StartWord
Set appWord = CreateObject("Word.Application")
appWord.visible = false
appWord.DisplayAlerts = false
End Sub
'Start Excel
Sub StartExcel
Set appExcel = CreateObject("Excel.Application")
appExcel.visible = false
appExcel.DisplayAlerts = false
End Sub
Я испытал это следующим образом (с двумя TYPENAME тестов) - когда есть слово файлы доступны, первый appWord является применение и appExcel пусто, то оно переходит в объект и appExcel остается пустой (в этом в случае ошибки, когда подпроцедура заканчивается на AppWord.Quit). Когда нет текстовых файлов, а скрипт обрабатывает Excels, первый appWord - это Object и appExcel - это приложение, а затем appWord все еще Object и appExcel - все еще приложение - в этом случае ошибок при завершении подпроцедуры на appExcel. Уволиться.
Чтобы дать немного фона - то, что код должен сделать, это открыть файл, сохранить его в другом формате, закройте программу, снова открыть программу, открыть вновь временный созданный файл и сохранить он возвращается в исходном формате (и удаляет вновь созданный временный файл) - и все. Я знаю, что мог бы сделать это (более) легко в двух отдельных процедурах для Word и Excel, но, как вызов, я хотел сделать его более универсальным. Моя проблема в том, почему appWord является объектом вместо приложения, в отличие от appExcel? – Bartosz
Ваша проблема в том, что вы говорите приложению, что оно должно выйти. Вы теряете ссылку на слово-приложение, потому что вы его закрываете. Зачем? Что вам нужно сделать, это закрыть открытый документ, а не выйти из приложения. –
Необходимость закрытия приложения возникает из-за чего-то другого (длинная история), и абсолютно необходимо, чтобы Office был закрыт и снова открыт. Я должен иметь возможность открывать слово снова без проблем, особенно, что он действительно работает для excel просто отлично ... – Bartosz