目标:将电子邮件保存为文件夹中的 PDF 文件
问题:Outlook 文件夹中有超过 1000 封电子邮件。代码运行 26 封电子邮件然后停止/冻结。
尝试:尝试了不同内容的不同 Outlook 电子邮件文件夹都在 26/27 停止。
我怀疑它造成了某种类型的内存问题。不关闭东西?
Sub save_as_PDF()
Dim objDoc As Object, objInspector As Object
Dim outApp As Object, objOutlook As Object, objFolder As Object, myItems As Object, myItem As Object
Dim FolderPath, FileName, ClientName, ModTime, ranDigits As String
Set outApp = CreateObject("Outlook.Application")
Set objOutlook = outApp.GetNamespace("MAPI")
Set objFolder = objOutlook.GetDefaultFolder(olFolderInbox).Folders("regular")
Set myItems = objFolder.Items
FolderPath = "C:\Users\xxxxx\Documents\My Documents\__AA My Daily\vbaOutlookTestFolder\"
On Error Resume Next
For Each myItem In myItems
Set objInspector = Nothing
Set objDoc = Nothing
Set objInspector = Nothing
Set objDoc = Nothing
FileName = myItem.To
FileName = Replace(FileName, ".", "")
Set objInspector = myItem.GetInspector
Set objDoc = objInspector.WordEditor
objDoc.ExportAsFixedFormat FolderPath & FileName & ".pdf", 17
Next myItem
End Sub
我希望它能将文件夹中的每个电子邮件项目转换为 pdf。
myItem.To
可以包含(如果有多个收件人)";"
,这在文件名中是无效的。
永远不要使用
On Error Resume Next
,除非你真的检查了Err.Number
- 它只会掩盖异常,你不知道是什么击中了你。
问题与以下代码行有关:
objDoc.ExportAsFixedFormat FolderPath & FileName & ".pdf", 17
FileName
不是唯一的,文件夹中的大多数项目都可以保持不变。
FileName = myItem.To
相反,您需要生成一个唯一的文件名,以避免保存 pdf 文件时出现任何麻烦。并尝试将任何 ID 添加到字符串中,以避免在同一文件夹中重复。
此外,文件名可能包含禁用符号:
FileName = myItem.To
FileName = Replace(FileName, ".", "")
使用以下函数从文件名字符串中删除任何非法字符:
Function ReplaceIllegalCharacters(strIn As String, strChar As String) As String
Dim strSpecialChars As String
Dim i As Long
strSpecialChars = "~""#%&*:<>?{|}/\[]" & Chr(10) & Chr(13)
For i = 1 To Len(strSpecialChars)
strIn = Replace(strIn , Mid$(strSpecialChars, i, 1), strChar)
Next
ReplaceIllegalCharacters = strIn
End Function
在 pdf files not saving with ExportAsFixedFormat 线程中描述了类似的问题。