2016-12-11 2 views
1

У меня есть несколько почтовых ящиков в моей Outlook, откуда мне нужно посчитать:Excel VBA Count Перспективы электронных писем/вложения старше 30 дней

  1. общее количество писем
  2. сообщения электронной почты старше 30 дней
  3. получите дату самого старого сообщения.

После этого мне нужно поставить эти цифры на листе превосходства.

Я получил часть 1 сделал, но я застрял в части 2. У меня есть следующий код:

Sub HowManyEmails() 

Dim objOutlook As Object, objnSpace As Object, objFolder As MAPIFolder 
Dim EmailCount As Integer 

Set objOutlook = CreateObject("Outlook.Application") 
Set objnSpace = objOutlook.GetNamespace("MAPI") 

On Error Resume Next 
     Set objFolder1 = objnSpace.Folders("Outlook Data File").Folders("Inbox") 
If Err.Number <> 0 Then 
    Err.Clear 
    MsgBox "No such folder." 
    Exit Sub 
    End If 

For Each MailItem In objFolder1.Items 
If MailItem.ReceivedTime < (Date - 30) Then EmailCount = EmailCount + 1 
Next 

Sheets("Sheet1").Range("C2").Value = EmailCount 

Set objOutlook = Nothing 
Set objnSpace = Nothing 
Set objFolder = Nothing 
End Sub 

По какой-то причине эта часть: MailItem.ReceivedTime < (дата - 30) не работает должным образом. Я думаю, что это связано с тем, что в ReceimeTime в Outlook также присутствует час/минута полученного сообщения. Может кто-нибудь помочь?

+0

Там нет причин, почему сравнение с DateTime с функцией 'date' должны дать проблемы. По общему признанию, если текущая дата/время в любое время 12 декабря, оператор 'If' будет только увеличивать значение« EmailCount », если почта была получена ** до ** 12 ноября, а не до текущего времени 12 ноября, но это должно быть, по крайней мере, близко к тому, что вам нужно. Почему бы вам не попробовать помещать 'MsgBox MailItem.ReceivedTime' непосредственно перед оператором' If' и посмотреть, какие значения вы получаете. – YowE3K

ответ

0

Использовать Items.Restrict Method (Outlook) Затем установите Фильтр по дате Разница.

Пример

Option Explicit 
Public Sub Example() 
    Dim olApp As Outlook.Application 
    Dim olNs As Outlook.Namespace 
    Dim Inbox As Outlook.MAPIFolder 
    Dim Items As Outlook.Items 
    Dim Filter As String 
    Dim DateDiff As Long 
    Dim i As Long 

    Set olApp = CreateObject("Outlook.Application") 
    Set olNs = olApp.GetNamespace("MAPI") 
    Set Inbox = olNs.GetDefaultFolder(olFolderInbox) 

    DateDiff = Now - 30 
    Filter = "[SentOn] < '" & Month(DateDiff) & _ 
         "/" & Day(DateDiff) & _ 
         "/" & Year(DateDiff) & "'" 

    Set Items = Inbox.Items.Restrict(Filter) 

    MsgBox Items.Count & " Items in " & Inbox.Name 

    For i = Items.Count To 1 Step -1 
     Debug.Print Items(i) 'Immediate Window 
    Next 
End Sub