将表格从Outlook电子邮件复制到Excel文件 - VBA

时间:2013-07-16 13:45:21

标签: vba excel-vba outlook-vba excel

我目前正在使用Outlook 2010 VBA宏从电子邮件中提取信息并将其放入Excel文件中。这个想法是每个电子邮件每次都在电子邮件消息中嵌入的表中具有相同的字段(名称,订单号,日期等),并且该数据被放入电子表格中。为此,我目前使用以下代码获取表格并将其移动到Excel中:

'This code is inside a for each loop for each message
Set excelWorksheet2 = excelWorkbook.Worksheets.item(2)
Set excelWorksheet3 = excelWorkbook.Worksheets.item(3)
Set excelWorksheet4 = excelWorkbook.Worksheets.Add(After:=excelWorkbook.Sheets(excelWorkbook.Sheets.count))

Dim mailObj As Outlook.MailItem
Dim doc As Word.Document
Set doc = mailObj.GetInspector.WordEditor

Dim table1, table2, table3 As Object
Set table3 = doc.Tables(4).Range
Set table2 = doc.Tables(3).Range
Set table1 = doc.Tables(2).Range

table1.Copy
excelWorksheet2.Paste
table2.Copy
excelWorksheet4.Paste
table3.Copy
excelWorksheet3.Paste
Set table1 = Nothing
Set table2 = Nothing
Set table3 = Nothing

'I do much more of this to get the data from each table and put it into a master worksheet...
excelWorksheet.Cells(rows, cols + 1).Value = excelWorksheet2.Cells(4, 2).Value 'Contract Number
excelWorksheet.Cells(rows, cols + 2).Value = excelWorksheet2.Cells(4, 4).Value 'Contractor Name 

Set doc = Nothing
Set excelWorksheet2 = Nothing
Set excelWorksheet3 = Nothing
Set excelWorksheet4 = Nothing

我经常会遇到以下错误,但它不会出现在相同的数据上,它有点随机,似乎只出现在Outlook /电子邮件方面:

  • “请求的集合成员不存在。” (错误代码 5941)在.Range
  • “对象'范围'的方法'复制'失败”.Copy 线

如果我单步执行,有时会出现这两个错误,如果复制失败,宏将崩溃。

我试过了:

  • 投入2秒延迟
  • 浏览较少的电子邮件(当我选择> 10时,此代码通常会失败 要处理的电子邮件)
  • 每封电子邮件后清除剪贴板
  • 通过Nothing关闭/取消分配对象(不确定是否 这是最佳实践,因为我更像是一个C / C ++ / C#/ Java人)

这些似乎都无法远程修复此问题,因为这两个错误经常出现,但间歇性出现。 我真的不知道调试这个问题的下一步是什么,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

基于我在WordEditor表问题上所做的研究,似乎复制/粘贴操作的数量和搜索HTML表只是不允许可靠的行为。一个可能的解决方案是将整个电子邮件复制到Excel中并以这种方式解析表格(这仍然需要复制/粘贴)。

我为解决这个问题(间接)所做的是将所有电子邮件保存为临时目录中的HTML文件(通过在Excel中运行的Outlook.Application:email.SaveAs folderPath + fileName + ".html", olHTML)并让Excel打开HTML文件工作簿并以这种方式处理数据。这更加可靠(虽然增加了开销)并允许大量电子邮件正确导出到Excel。

如果有人想要我的问题的确切代码,请给我发消息(在hotmail.com上的vindansam,它有点长并且有一些专有信息)。

WordEditor似乎无法很好地处理这些信息太糟糕了,也许微软会在下一版Office中加强这一点。