我可以使用文件中的内容作为名称自动保存在Outlook中的Excel附件吗?

我每天都会收到电子邮件,这些邮件会告诉我前一天我网站的performance。 这些报告是一个通用的名称,我无法从源头上改变这一点。 我通过Outlook规则运行下面的脚本,只要收到具有特定条件的邮件,并且报告将以昨天的date保存到文件名中的给定位置:

Public Sub Save Reports (itm As Outlook.MailItem) Dim ObjAtt As Outlook.Attachment Dim SaveFolder As String For Each ObjAtt In itm.Attachments If InStr(ObjAtt.DisplayName, ".csv") Then FileName = (ObjAtt.FileName) NewName = "System Performance " & Format(Date - 1, "DD-MM-YYYY") & Right(FileName, 4) SaveFolder = "C:\Users\Me\Documents\" ObjAtt.SaveAsFile SaveFolder & NewName End If Set ObjAtt = Nothing Next End Sub 

问题是,如果我们在这个过程的任何地方遇到任何问题,我今天可能会收到一封与上周相关的电子邮件,而不是昨天。 如果发生这种情况,上面的脚本不起作用,它需要我手动保存它。

我可以解决这个问题的一个方法是,如果我可以find一种方法从附件中保存的CSV文件中的单元格中提取数据,然后将其用作文件名。 对于每个要保存的文件,单元格B1都有我需要在文件名中使用的date。

我已经通过Stackoverflow和其他互联网资源来试图find一些东西,可以让我做到这一点,但一直无法解决。

感谢下面的评论,我试图编辑我的脚本,所以保存文件,然后打开文件,并采取所需的数据,然后重命名文件,但无济于事:

  Public Sub Save Reports (itm As Outlook.MailItem) Dim ObjAtt As Outlook.Attachment Dim SaveFolder As String Dim xlApp As Object Dim sourceWB As Excel.Workbook Dim sourceSH As Excel.Worksheet Dim strFile As String For Each ObjAtt In itm.Attachments If InStr(ObjAtt.DisplayName, ".csv") Then FileName = (ObjAtt.FileName) NewName = "System Performance " & Format(Date - 1, "DD-MM-YYYY") & Right(FileName, 4) SaveFolder = "C:\Users\Me\Documents\" ObjAtt.SaveAsFile SaveFolder & NewName Set xlApp = CreateObject("Excel.Application") With xlApp .Visible = True .EnableEvents = False End With strFile = SaveFolder & NewName Set sourceWB = Workbooks.Open(strFile, , False, , , , , , , True) Set sourceSH = sourceWB.Worksheets("Sheet2") sourceWB.Activate Range("B1").Select newdate = ActiveCell.Value Set sourceWB = Nothing Set sourceSH = Nothing xlApp.Quit Set xlApp = Nothing Name SaveFolder & NewName As SaveFolder & newdate End If Set ObjAtt = Nothing Next End Sub 

Outlook对象模型不提供任何属性或方法。 您需要先将附件保存在磁盘上,然后打开它以读取单元格。 Attachment类的SaveAsFile方法将附件保存到指定的path。

您也可以尝试使用低级API(扩展MAPI)读取附加文件的二进制内容。 属性名称是PR_ATTACH_DATA_BIN,其中包含通常通过OLE IStream接口访问的二进制附件数据。 请参阅打开附件了解更多信息。 你也可以考虑在这个API周围使用任何第三方包装器(例如,Redemption)。