我想通过单击excel中的按钮将Outlook 非HTML电子邮件正文导出到excel。以下是我的代码。谢谢有人能协助我。
这是我用来打印纯文本电子邮件正文的代码,但是我收到很多不需要的文本
sText = StrConv(OutlookMail.RTFBody,vbUnicode)
Range(“ D3”)。Offset(i,0).Value = sText
我确实尝试过此操作,但会提示运行时错误'1004' 应用程序定义或对象定义的错误,但它可以在带有HTML标记的正文上使用。
Range(“ D3”)。Offset(i,0).Value = OutlookMail.Body
这是我的电子邮件文件夹的结构
下面是我完整的vba代码
Sub extract_email()
Dim OutlookApp As New Outlook.Application
Dim Folder As Outlook.MAPIFolder
Dim OutlookMail As MailItem
Dim sText As String
Dim i As Integer
Set myAccount = OutlookApp.GetNamespace("MAPI")
Set Folder = myAccount.GetDefaultFolder(olFolderInbox).Parent
Set Folder = Folder.Folders("Test_Main").Folders("Test_Sub")
i = 1
Range("A4:D20").Clear
For Each OutlookMail In Folder.Items
If OutlookMail.ReceivedTime >= Range("B1").Value And OutlookMail.SenderName = "Test_Admin" Then
Range("A3").Offset(i, 0).Value = OutlookMail.Subject
Range("A3").Offset(i, 0).Columns.AutoFit
Range("A3").Offset(i, 0).VerticalAlignment = xlTop
Range("B3").Offset(i, 0).Value = OutlookMail.ReceivedTime
Range("B3").Offset(i, 0).Columns.AutoFit
Range("B3").Offset(i, 0).VerticalAlignment = xlTop
Range("C3").Offset(i, 0).Value = OutlookMail.SenderName
Range("C3").Offset(i, 0).Columns.AutoFit
sText = StrConv(OutlookMail.RTFBody, vbUnicode)
Range("D3").Offset(i, 0).Value = sText
Range("D3").Offset(i, 0).Columns.AutoFit
Range("D3").Offset(i, 0).VerticalAlignment = xlTop
i = i + 1
End If
Next OutlookMail
Set Folder = Nothing
End Sub
答案 0 :(得分:0)
Excel不直接支持RTF,但是纯文本MailItem.Body
应该可以正常工作,我从未见过MailItem.Body
引发异常。您先保存邮件吗?
答案 1 :(得分:0)
电子邮件可以有多个正文,也可以没有。 Outlook可以识别文本,HTML和RTF正文。我近年来检查过的电子邮件中没有包含RTF正文。如果要格式化邮件,这是唯一的选择。如今,Html和CSS提供的功能远远超过RTF,我怀疑是否有任何智能手机接受RTF。我很惊讶您收到带有RTF正文的电子邮件;我的猜测是来自旧系统。
如果电子邮件具有HTML正文,则忽略RTF,这就是向用户显示的内容。仅当没有HTML正文时,用户才会看到文本正文。
在我检查过的电子邮件中,所有电子邮件均包含文本和HTML正文。几乎所有这些文本主体都是HTML主体,每个标记都由回车符和换行符代替。由于CRLF作为换行符是Windows的约定,因此我怀疑电子邮件是否没有文本正文,Outlook会从HTML正文中创建一封电子邮件,以获取要处理文本正文的宏的好处。如果我的理论是正确的,则Outlook对于仅包含RTF电子邮件的电子邮件不会执行相同的操作。因此,如果有HTML正文,则为文本正文,而如果有RTF正文,则为文本正文。
Microsoft RTF规范可以在线获得,因此您可以根据需要研究格式。如果您搜索“我可以从VBA处理RTF吗?”,您会发现很多有趣的建议。
或者,您显示的示例RTF主体看起来很简单:
{string of RTF commands{string of RTF commands}}
{string of RTF commands ending in “1033 ”text\par
text\par
text\par
}
如果您删除了所有内容,直到“ 1033”,并且结尾的“}”然后将“ \ par”替换为“”,那么您可能会得到所需的内容。
我的VBA出现问题。例如:
并非收件箱中的所有项目都是MailItems。您应该具有:
For Each OutlookMail In Folder.Items
If OutlookMail.Class = olMail Then
If OutlookMail.ReceivedTime ... Then
: : :
End If
End If
您不需要单独格式化单元格。底部的以下内容将处理自动调整和垂直对齐:
Cells.Columns.Autofit
Cells.VerticalAlignment = xlTop
您的代码在活动工作表上运行。这取决于启动宏时用户具有正确的活动工作表。您应该为目标工作表命名,以免出错。
答案 2 :(得分:0)
感谢您提供所有答案,我改进了代码,并找出了问题所在。这是因为脚本生成了“ =”符号并将其发送到我的电子邮件中。 Excel以不同的方式对待“ =”符号,这就是为什么它不允许我正确提取的原因。将“ =”符号更改为“#”符号后,可以正常使用以下方式提取电子邮件:
OutlookMail.Body