問題があります。同じ手順で Excel と Word のインスタンスの動作が異なります。コードを見てください。そこにあるアイデアは、さまざまな形式の組み合わせで Excel と Word のファイルを再保存する手順を用意することです。
問題は、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
私は次の方法でそれをテストしました (2 つの型名テストを使用) - 使用可能な単語ファイルがある場合、最初に appWord が Application で appExcel が空で、次に Object に変更され、appExcel は空のままです (この場合、サブプロシージャは AppWord.Quit で終了します)。Word ファイルがなく、スクリプトが Excel を処理している場合、最初に appWord が Object で appExcel が Application であり、次に appWord が Object で appExcel が Application のままです。この場合、appExcel でサブプロシージャが終了してもエラーは発生しません。終了する。