【问题标题】:Get mail info into Excel using Outlook VBA使用 Outlook VBA 将邮件信息导入 Excel
【发布时间】:2020-07-28 17:09:10
【问题描述】:

我正在尝试从特定文件夹中的未读电子邮件中提取信息并将其粘贴到结构化的 Excel 文件中。

我需要主题、正文、发件人、接收时间、对话 ID 和附件名称。

重要提示:它必须是 Outlook 宏,而不是 Excel 宏。

我有以下代码,但它给了我

“运行时错误'9':下标超出范围。

Sub WriteTextFile()

    Dim wkb As Workbook
    Set wkb = Workbooks.Open("C:\Users\bebxadvypat\Desktop\Test VBA Macros.xlsx")
    
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = True
    Set Workbook = objExcel.Workbooks.Open("C:\Users\bebxadvypat\Desktop\Test VBA Macros.xlsx")
    
    Dim objNS As Outlook.NameSpace
    Dim objFolder As Outlook.MAPIFolder
    Dim row As Integer
    
    row = 2

    objExcel.Worksheets("Sheet1").Cells(1, 1).Value = "Sender"
    objExcel.Worksheets("Sheet1").Cells(1, 2).Value = "Subject"
    objExcel.Worksheets("Sheet1").Cells(1, 3).Value = "Date"
    objExcel.Worksheets("Sheet1").Cells(1, 4).Value = "ID"
    objExcel.Worksheets("Sheet1").Cells(1, 5).Value = "Body"

    Set objNS = GetNamespace("MAPI")
    Set objFolder = objNS.Folders.GetLast
    Set objFolder = objFolder.Folders("Deleted Items")
    
    For Each item In objFolder.Items
        objExcel.Worksheets("Sheet1").Cells(row, 1).Value = item.sender
        objExcel.Worksheets("Sheet1").Cells(row, 2).Value = item.Subject
        objExcel.Worksheets("Sheet1").Cells(row, 3).Value = item.ReceivedTime
        objExcel.Worksheets("Sheet1").Cells(row, 4).Value = item.ConversationID
        objExcel.Worksheets("Sheet1").Cells(row, 5).Value = item.Body
    Next

    Workbook.Save
    Workbook.Saved = True
    Workbook.Close
    objExcel.Quit
      
    Set Workbook = Nothing
    Set objExcel = Nothing
    
End Sub

【问题讨论】:

  • 哪一行报错?
  • 我能看到的只有几件事会引发错误 9 - 其中之一是硬编码的工作表名称。 “Sheet1”可能不是您要使用的工作表的实际名称,尤其是。如果 Excel 没有安装英文版。例如,默认工作表名称将是法语中的“Feuil1”。考虑将objExcel.Worksheets(1) 拉到它自己的Worksheet 变量中,而不是每次都取消引用它。另一个是硬编码的“已删除邮件”文件夹名称。如果指定的硬编码字符串不是您要从中提取的集合中的键,则会引发错误 9。
  • 嗨@MathieuGuindon,确实问题与非英语版本有关!多谢。但是:a)我还应该使用哪一行代码来获取附件名称? b) 如何将附件下载到特定文件夹? c) 实际上只对未读电子邮件执行所有这些操作
  • 按 F2 以调出 对象浏览器,然后找到 MailItem 类并搜索看起来像附件集合的东西。然后寻找一个可能成为附件的类 - 该类可能具有Name 属性。
  • 您将objFolder 设置为objNS.Folders.GetLast,然后将其重置为objFolder.Folders("Deleted Items")。第一条语句返回的文件夹是否包含文件夹“已​​删除项目”?如果不是,那将解释错误 9。尝试在每个 Set 之后添加 Debug.Print objFolder.Name,看看它会给你什么。

标签: vba outlook


【解决方案1】:

根据您的代码测试,您可以尝试添加row = row+1并使用此方法获取Delete Items:

Set olNs = Application.GetNamespace("MAPI")
Set DeletedFolder = olNs.GetDefaultFolder(olFolderDeletedItems)
    For Each Item In objFolder.Items
        objExcel.Worksheets("Sheet1").Cells(row, 1).Value = Item.Sender
        objExcel.Worksheets("Sheet1").Cells(row, 2).Value = Item.Subject
        objExcel.Worksheets("Sheet1").Cells(row, 3).Value = Item.ReceivedTime
        objExcel.Worksheets("Sheet1").Cells(row, 4).Value = Item.ConversationID
        objExcel.Worksheets("Sheet1").Cells(row, 5).Value = Item.Body
        row = row + 1
    Next

【讨论】:

  • 在最终产品中增加行数会很有用,但根据 OP 的评论,“下标超出范围”是由于非英文版本无法识别“Sheet1”。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多