В настоящее время я использую VBA для циклического просмотра некоторых файлов Outlook в формате MSG и преобразования их в файлы формата PDF с помощью промежуточного преобразования .mht. Код будет вставлен ниже. В настоящее время я получаю правильную конверсию примерно в 40% случаев. Правильное преобразование означает, что соответствующая папка после запуска этого макроса будет иметь правильную версию файла .msg в формате .pdf и .mht.
Однако, в другие 60% случаев преобразование застревает в Word, переходящем из .mht в .pdf. Все просто зависает, и мне нужно завершить процесс Word.exe. Это проблема № 1. Возможно, это связано с тем, что всякий раз, когда этот VBA успешно преобразует файл из .msg в .mht в .pdf, я также остаюсь с призраком (ами) предыдущих преобразованных файлов .mht, даже если их нет в папка. Это файлы с очень ограниченной информацией в шрифте типа пишущей машинки, имена файлов которых начинаются с "~ $ NAME CUTOFF HERE". Я пытался установить для моего объекта значение Nothing до и после запуска моего кода, чтобы попытаться освободить память, но она все еще попадала в ловушку. Фото ниже также, чтобы помочь объяснить. У кого-нибудь есть мысли о том, что происходит?
Преобразование из .msg в .mht каждый раз работает как чудо.
Обратите внимание, я размещаю только соответствующий код. Все остальное выше этого выражения ElseIf преобразует различные другие типы файлов в .pdf (а именно .doc *, .xls * и .ppt *).
Ранее я использовал этот вариант, но хотел. ускорить процесс и б. не быть обязанным необходимости нажимать «сохранить» каждый раз. ссылка здесь.
Изображение Ghost Files - самый последний запуск приведенного ниже кода с этим одним файлом MSG
'Above this is irrelevant other If statement
ElseIf (oFile) Like ("*.msg") Then
Dim newName4 As String
newName4 = Replace(oFile.path, ".msg", ".pdf")
newName4 = Replace(newName4, ".msg", ".pdf")
Dim strHTML As String
Dim objOL As Object
Dim Msg As Object
Dim Dms2 As Object
Set objOL = CreateObject("Outlook.Application")
Set Msg = objOL.Session.OpenSharedItem(oFile.path)
strHTML = Left(oFile.path, InStrRev(oFile.path, Chr(46))) & "mht"
With Msg
.SaveAs strHTML, olMHTML
.Close olDiscard
End With
ElseIf (oFile) Like ("*.mht") Then
Dim newName5 As String
newName5 = Replace(oFile.path, ".mht", ".pdf")
newName5 = Replace(newName5, ".mht", ".pdf")
Dim wrdApp As Word.Application
Dim wrdDoc As Word.Document
Set wrdDoc = Nothing
Set wrdApp = Nothing
Set wrdApp = CreateObject("Word.Application")
Dim x As Integer
x = 1
wrdApp.Documents.Open Filename:=oFile.path, Visible:=False
'Set wrdDoc = wrdApp.Documents.Item(x)
wrdApp.Documents.Item(x).ExportAsFixedFormat OutputFileName:=newName5 _
, ExportFormat:= _
wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=0, To:=0, _
Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False
wrdApp.Documents.Item(x).Close
wrdApp.Quit
Set wrdDoc = Nothing
Set wrdApp = Nothing
End If
Next oFile