2013-11-12 3 views
0

У меня проблема: экземпляры 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. Уволиться.

ответ

1

Может быть, я ошибаюсь, просто мое мнение:

If typeName(appType) = "Documents" Then appWord.Quit 
If typeName(appType) = "Workbooks" Then appExcel.Quit 

set objOpenFile = appType.Open(strDirectory) 

appType является ссылкой на то, что appWord.Documents или appExcel.Workbooks ссылается перед входом в ваш ResaveFiles Sub, где вы инстанцирование новой копии «Excel.Application» или «Word.Application», и в каждом из случаев вы указываете приложение TO QUIT. Вопрос не в том, почему в случае слова вы получили ошибку. С моей точки зрения ВЫ ДОЛЖНЫ получить сообщение об ошибке. Вопрос в том, почему, если было поручено прекратить работу, excel продолжает открывать и поддерживать ссылки для обработки вашего кода.

EDIT - И не пробовал. Просто адаптирован из кода OP. Адаптировать при необходимости

Option Explicit 

    ResaveFiles "Word.Application", "docx", 12, 0 
    ResaveFiles "Excel.Application", "xlsx", 51, 56 

MsgBox "All done." 


Sub ResaveFiles(progID, srcExtName, srcExtNum, tmpExtNum) 
Dim app, doc 
Dim fso, objFile, objOpenFile, strDirectory 

    Set fso = CreateObject("Scripting.FileSystemObject") 
    For Each objFile in fso.GetFolder(".").Files 
     If LCase(fso.GetExtensionName(objFile.Name)) = srcExtName Then 

      ' Get references 
      Set app = GetNewAppInstance(progID) 
      Set doc = GetDocumentHandler(app) 

      ' Save temp 
      Set objOpenFile = doc.Open(objFile.Path) 
      strDirectory = fso.BuildPath(objOpenFile.path, fso.GetBaseName(objOpenFile.name) & "._temp") 
      objOpenFile.SaveAs strDirectory, tmpExtNum 
      objOpenFile.Close 

      ' Release objects 
      Set objOpenFile = nothing 
      Set doc = nothing 
      app.Quit 
      Set app = nothing 

      ' Get references again 
      Set app = GetNewAppInstance(progID) 
      Set doc = GetDocumentHandler(app) 

      ' Resave file 
      Set objOpenFile = doc.Open(strDirectory) 
      objOpenFile.SaveAs objFile.path, srcExtNum 
      objOpenFile.Close 

      ' Release objects 
      Set objOpenFile = nothing 
      Set doc = nothing 
      app.Quit 
      Set app = nothing 

      ' Clean 
      fso.DeleteFile(strDirectory) 

     End If 
    Next 

End Sub 


Function GetNewAppInstance(ByVal progID) 
    Set GetNewAppInstance = CreateObject(progID) 
    With GetNewAppInstance 
     .Visible = False 
     .DisplayAlerts = False 
    End With 
End Function 

Function GetDocumentHandler(app) 
    Dim name 
    name = app.Name 
    If InStr(name,"Excel") > 0 Then 
     Set GetDocumentHandler = app.Workbooks 
    ElseIf InStr(name,"Word") > 0 Then 
     Set GetDocumentHandler = app.Documents 
    Else 
     Set GetDocumentHandler = app 
    End If 
End Function 
+0

Чтобы дать немного фона - то, что код должен сделать, это открыть файл, сохранить его в другом формате, закройте программу, снова открыть программу, открыть вновь временный созданный файл и сохранить он возвращается в исходном формате (и удаляет вновь созданный временный файл) - и все. Я знаю, что мог бы сделать это (более) легко в двух отдельных процедурах для Word и Excel, но, как вызов, я хотел сделать его более универсальным. Моя проблема в том, почему appWord является объектом вместо приложения, в отличие от appExcel? – Bartosz

+0

Ваша проблема в том, что вы говорите приложению, что оно должно выйти. Вы теряете ссылку на слово-приложение, потому что вы его закрываете. Зачем? Что вам нужно сделать, это закрыть открытый документ, а не выйти из приложения. –

+0

Необходимость закрытия приложения возникает из-за чего-то другого (длинная история), и абсолютно необходимо, чтобы Office был закрыт и снова открыт. Я должен иметь возможность открывать слово снова без проблем, особенно, что он действительно работает для excel просто отлично ... – Bartosz

Смежные вопросы