【问题标题】:Fetch Outlook emails into Excel [duplicate]将 Outlook 电子邮件提取到 Excel [重复]
【发布时间】:2020-04-01 12:44:28
【问题描述】:

我正在尝试将 Outlook 电子邮件导出到 Excel。下面的代码,出于某种未知的原因,只导出了 21 个邮件项。我做错了什么?

数组 olItems 有 1140 个项目。我不明白为什么控件在 21 项之后就跳出循环。

Option Explicit

Sub list_email_info()

Dim xlApp As Excel.Application
Dim xlwb As Excel.Workbook
Dim i As Long
Dim arrHeader As Variant

Dim oINS As NameSpace
Dim oIInboxFolder As MAPIFolder
Dim olItems As Items
Dim olMailItem As MailItem

arrHeader = Array("Date Created", "Subject", "Sender's Name", "Unread")

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlwb = xlApp.Workbooks.Add

Set oINS = GetNamespace("MAPI")
Set oIInboxFolder = oINS.GetDefaultFolder(olFolderInbox).Folders("OST")
Set olItems = oIInboxFolder.Items

i = 1

On Error Resume Next
xlwb.worksheets(1).Range("A1").Resize(1, UBound(arrHeader) + 1).Value = arrHeader

For Each olMailItem In olItems

    xlwb.worksheets(1).cells(i + 1, "A").Value = olItems(i).CreationTime
    xlwb.worksheets(1).cells(i + 1, "B").Value = olItems(i).Subject
    xlwb.worksheets(1).cells(i + 1, "C").Value = olItems(i).SenderName
    xlwb.worksheets(1).cells(i + 1, "D").Value = olItems(i).UnRead

    i = i + 1
Next olMailItem

MsgBox "Done"
xlwb.worksheets(1).cells.entirecolumn.autofit




Set xlwb = Nothing
Set xlApp = Nothing

Set olItems = Nothing
Set oIInboxFolder = Nothing
Set oINS = Nothing


End Sub

@Ben - 我已按照建议进行了修改,但仍然出现类型不匹配错误

@Ben - 当我尝试在编辑器中“运行”代码时出现以下错误。以前没有发生这种情况。

【问题讨论】:

  • 注释掉On Error Resume Next。您是否收到错误消息,错误消息是什么?
  • 很有可能您在该文件夹中的项目不是MailItems:When is a MailItem not a MailItem
  • 所以,我注释掉了 On Error Resume Next。当我观看“olItems”时,它错误地显示为“类型不匹配”,因为 oIItems =nothing。但是,当我在 IDE 中按下“运行”按钮时,控件会赶上循环中的下一项。
  • 您想测试该项目是否为MailItem
  • 这个答案与我的完全一模一样。它使用TypeOf 来测试项目的类型。

标签: vba outlook


【解决方案1】:

除了MailItems 之外还有其他类型的项目 - 请参阅When is a MailItem not a MailItem

首先,删除On Error Resume Next。那只是隐藏潜在的错误。

其次,把你的循环改成这样:

Dim itm as Object
For Each itm In olItems
    If TypeOf itm Is MailItem Then
        Set olMailItem = itm
        xlwb.worksheets(1).cells(i + 1, "A").Value = olMailItem.CreationTime
        xlwb.worksheets(1).cells(i + 1, "B").Value = olMailItem.Subject
        xlwb.worksheets(1).cells(i + 1, "C").Value = olMailItem.SenderName
        xlwb.worksheets(1).cells(i + 1, "D").Value = olMailItem.UnRead

        i = i + 1   
    End If  
Next

【讨论】:

  • 上面的代码成功了。此代码与我的问题中的屏幕截图中的代码有什么区别?
  • 代码中的问题是For Each olMailItem In olItems。当项目不是MailItem 时,该操作会失败。建议的答案不同:itmObject,而不是 MailItem
  • 明白了!呵呵。
  • 有没有办法让这段代码像 VB 宏一样工作?
  • 什么意思?
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2022-08-20
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
相关资源
最近更新 更多