从特定时间段将电子邮件从Outlook导入Excel

从特定时间段将电子邮件从Outlook导入Excel,excel,vba,outlook,Excel,Vba,Outlook,我设法创建了一个宏,如果电子邮件主题是特定的字符串,它可以将电子邮件从Outlook导入Excel 不过,我还想添加一个条件,只导入两个日期之间收到的电子邮件,但我似乎找不到正确的方法 以下是我目前掌握的代码: For Each OutlookMail In IFolder.Items If OutlookMail.ReceivedTime >= Range("start_date").Value And OutlookMail.ReceivedTime <= Range("

我设法创建了一个宏,如果电子邮件主题是特定的字符串,它可以将电子邮件从Outlook导入Excel

不过,我还想添加一个条件,只导入两个日期之间收到的电子邮件,但我似乎找不到正确的方法

以下是我目前掌握的代码:

For Each OutlookMail In IFolder.Items
    If OutlookMail.ReceivedTime >= Range("start_date").Value And OutlookMail.ReceivedTime <= Range("end_date").Value Then
        ar() = Split(OutlookMail.Body, ",")
            If InStr(OutlookMail.Subject, "Exportation of purchase order") > 0 Then
                For Each Item In ar
                    dbf.Range("A2").Offset(i, 0).Value = Split(Split(Item, ":")(0), "-")(0)
                    dbf.Range("A2").Offset(i, 0).Columns.AutoFit
                    i = i + 1
                Next Item
            End If
    End If
Next OutlookMail
IFolder.Items中每个OutlookMail的

如果OutlookMail.ReceivedTime>=范围(“开始日期”).值和OutlookMail.ReceivedTime 0,则
对于ar中的每个项目
dbf.Range(“A2”)。偏移量(i,0)。值=拆分(拆分(项目),“:”(0),“-”(0)
dbf.范围(“A2”).偏移量(i,0).Columns.AutoFit
i=i+1
下一项
如果结束
如果结束
下一期展望邮件
现在,代码导入从“开始日期”到最后一封收到的电子邮件为止收到的所有电子邮件


我可能弄乱了顺序或类似的东西,但如果有人能帮我,我将不胜感激。

您的
if
语句看起来不错,尽管我可以整天盯着代码看,忽略一些明显的错误。然而,我的第一个想法是,结束日期不是你想象的那样。请在
For
循环之前添加以下代码:

  Dim StartDate As Date
  Dim EndDate As Date

  StartDate = Range("start_date").Value
  EndDate =  Range("end_date").Value

  Debug.Print "Date range is " & StartDate & " to " & EndDate
  Debug.Assert False

执行将在
Debug.Assert False
处停止。日期范围是否如您所期望的那样?

好吧,我决定尝试重新编写代码,同时对其进行适当的结构化,并最终使其按预期工作

我不知道将来是否有人会遇到和我一样的问题,所以我会发布新代码作为答案

Sub GetDataFromOutlook()

    Dim OutlookApp As Outlook.Application
    Dim OutlookNamespace As Outlook.Namespace
    Dim IFolder As Outlook.MAPIFolder
    Dim OutlookMail As Variant
    Dim i As Integer
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim ar() As String
    ReDim ar(0 To i)

    Set OutlookApp = New Outlook.Application
    Set OutlookNamespace = OutlookApp.GetNamespace("MAPI")
    Set wb = ThisWorkbook
    Set IFolder = OutlookNamespace.GetDefaultFolder(olFolderInbox).Folders("IMPORTADOS")
    Set ws = wb.Sheets("Sheet1")
    i = 0

    Application.ScreenUpdating = False

    For Each OutlookMail In IFolder.Items
        If InStr(OutlookMail.Subject, "Exportation of purchase order") > 0 Then
            If DateValue(OutlookMail.ReceivedTime) >= DateValue(Range("start_date")) And DateValue(OutlookMail.ReceivedTime) <= DateValue(Range("end_date")) Then
                ar() = Split(OutlookMail.Body, ",")
                For Each Item In ar
                    ws.Range("A2").Offset(i, 0).Value = Split(Split(Item, ":")(0), "-")(0)
                    ws.Range("A2").Offset(i, 0).Columns.AutoFit
                    i = i + 1
                Next Item
            End If
        End If
    Next OutlookMail

    ws.Range("Table1[#All]").RemoveDuplicates Columns:=1, Header:=xlYes
    ws.Columns("A:A").EntireColumn.AutoFit

    Application.ScreenUpdating = True

    Set IFolder = Nothing
    Set OutlookNamespace = Nothing
    Set OutlookApp = Nothing

End Sub
子GetDataFromOutlook()
Dim OutlookApp作为Outlook.Application
将Outlook命名空间设置为Outlook.Namespace
将IFolder设置为Outlook.Mapi文件夹
Dim OutlookMail作为变体
作为整数的Dim i
将wb设置为工作簿
将ws设置为工作表
Dim ar()作为字符串
重拨ar(0到i)
Set-OutlookApp=新建Outlook.Application
设置OutlookNamespace=OutlookApp.GetNamespace(“MAPI”)
设置wb=ThisWorkbook
设置IFolder=OutlookNamespace.GetDefaultFolder(olFolderInbox.Folders)(“IMPORTADOS”)
设置ws=wb.Sheets(“Sheet1”)
i=0
Application.ScreenUpdating=False
对于IFolder.Items中的每个OutlookMail
如果InStr(OutlookMail.Subject,“采购订单出口”)>0,则

如果DateValue(OutlookMail.ReceivedTime)>=DateValue(范围(“开始日期”)和DateValue(OutlookMail.ReceivedTime),我就设法让它工作。我正确地构造了代码,在重新编写代码时,我意识到ReceivedTime输出的是一个日期/时间值,而不仅仅是一个日期,这很可能是阻止我设置自ReceivedTime起的时间段与“开始日期”和“结束日期”根本不匹配的原因。谢谢你的时间和帮助。非常感谢你。日期、时间和日期+时间都是
date
类型,可以毫无问题地进行比较。我不明白使用
DateValue
有什么帮助。你试过我的密码了吗?
EndDate
是您认为的吗?很抱歉耽搁了。老实说,我没有尝试你的代码。因为在调试过程中,我可以通过将鼠标悬停在“end_date”值上来查看它,所以我可以检查“end_date”值是否是在该范围内设置的值。我不知道为什么在我添加DateValue之前它不能正常工作,但现在它可以工作了。非常感谢你的帮助和时间。