2013-03-07 3 views
2

원래이 사이트에서 발견 된 일부 코드 (fmunkert, 2012)는 원래 세트 폴더의 항목 (이메일) 수를 계산 한 것입니다.날짜 사이의 Outlook vba 개수 폴더 항목

다음 두 개의 메시지 출력 (메시지 1 : 폴더의 총 전자 메일, 메시지 2 : 날짜 별 목록)을 생성합니다.

두 세트의 폴더를 계산하고이를 두 메시지 각각에 대한 전체 통계의 한 세트로 결합하도록 모듈을 수정했습니다.

이 폴더는 1 년 내내 다 음과 같이 마지막 30 일간의 날짜 만 표시하도록 두 번째 메시지를 제한하고 싶습니다.이 영역을 설정하려고 시도했습니다.

그러나 나는 약 3 날짜에서 떨어져 1 항목을 보여주는 모든 날짜를 얻을 난수를 보여줍니다.

내 완벽하게 수정 된 코드

Sub InboxEmails() 

Dim objOutlook As Object, objnSpace As Object, objFolder As MAPIFolder, objFolder1 As MAPIFolder, objFolder2 As MAPIFolder 
Dim EmailCount1 As Integer 
Dim EmailCount2 As Integer 
Set objOutlook = CreateObject("Outlook.Application") 
Set objnSpace = objOutlook.GetNamespace("MAPI") 


    ' Verify exisitence of 2013 Actioned/Updated Folder 
    On Error Resume Next 
    Set objFolder1 = objnSpace.Folders("[email protected]").Folders("Inbox").Folders("Alico Metlife Actioned/Updated").Folders("2013 (Actioned/Updated)") 
    If Err.Number <> 0 Then 
    Err.Clear 
    MsgBox "2013 Actioned/Updated Folder Not Found." 
    Exit Sub 
    End If 

    ' Verify exisitence of 2013 IRs Raised Folder 
    On Error Resume Next 
    Set objFolder2 = objnSpace.Folders("[email protected]").Folders("Inbox").Folders("Alico MetLife IRs Raised").Folders("2013 (IRs Raised)") 
    If Err.Number <> 0 Then 
    Err.Clear 
    MsgBox "2013 IRs Raised Folder Not Found." 
    Exit Sub 
    End If 


'All folders are present, OK to continue. 

EmailCount1 = objFolder1.Items.Count 
EmailCount2 = objFolder2.Items.Count 

MsgBox "Number of chargeable emails: " & EmailCount1 + EmailCount2 

Dim dateStr As String 
Dim myItems1 As Outlook.Items 
Dim myItems2 As Outlook.Items 
Dim dict As Object 
Dim msg As String 
Set dict = CreateObject("Scripting.Dictionary") 
Set myItems1 = objFolder1.Items 
Set myItems2 = objFolder2.Items 
myItems.SetColumns ("SentOn") 


' Determine date of each message: 
For Each myItem In myItems1 
    dateStr = GetDate(myItem.SentOn) 
    If Not dict.Exists(dateStr) Then 
     dict(dateStr) = 0 
    End If 


    dict(dateStr) = CLng(dict(dateStr)) + 1 

Next myItem 

' Determine date of each message: 
For Each myItem In myItems2 
    dateStr = GetDate(myItem.SentOn) 
    If Not dict.Exists(dateStr) Then 
     dict(dateStr) = 0 
    End If 

    dict(dateStr) = CLng(dict(dateStr)) + 1 

Next myItem 


' Output counts per day: 
msg = "" 
For Each o In dict.Keys 
    msg = msg & o & ": " & dict(o) & " items" & vbCrLf 
Next 
MsgBox msg 

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

시도 버전 1

If Not dict.Exists(dateStr >= IsDate(Now) - 30) Then 

시도 버전 2

If Not dict.Equals(dateStr >= IsDate(Now) - 30) Then 

시도 버전 3

If Not dateStr >= IsDate(Now) - 30 Then 
,

나는이 영역을 변경할 필요가있을 것이라고 확신하지만, 나는 일할 수 없다. 나는 이것이 어디서 잘못 될지 알고 감사하게 생각합니다.

편집

: 나는 그것이 전달하기 위해 각 줄에 시계를 사용하고 있지만 나는이에 더 많은 연구를하고 내가 바른 길에있어 알고있다 , 여기 내 최신 코드

Dim dateStr As Date 
Dim myItems2 As Outlook.Items 
Dim dict As Object 
Dim msg As String 
Dim lastweek As Date 
Set dict = CreateObject("Scripting.Dictionary") 
Set myItems2 = objFolder2.Items 
myItems2.SetColumns ("SentOn") 

'Determine date of each message: 
For Each myItem In myItems2 
dateStr = GetDate(myItem.SentOn) 

lastweek = Date 
If Not dict.Item(dateStr) >= ((lastweek) - 30) Then 
dict.Remove myItems2.myItem 
Else 

dict(dateStr) = CLng(dict(dateStr)) + 1 

End If 

Next myItem  

입니다 날짜를 통해 예상대로 그러나 이것은 여전히 ​​진술의 else 부분으로 이동하지 않습니다.

'dateStr'은 항목의 날짜를 표시하며 '(lastweek) - 30'은 현재 날짜의 30 일 이전 날짜를 표시합니다.

이 문장은 if 문에 포함되어 있기 때문에 날짜가 30 일 이내 인 명세서의 else 부분으로 이동해야합니다. 그러나 이것은 발생하지 않으며, 나는 왜 볼 수 없습니다.

참조
fmunkert (2012), [온라인] Counting emails in outlook by date (액세스 03/2013)

답변

0

이 코드를 삽입하는 것이 좋습니다. 받은 편지함 항목을 날짜순으로 계산합니다.

Sub UserCount() 

    ' Put your email, and start date here. 
    InboxEmails "[email protected]", "1/1/2014" 

End Sub 

Sub InboxEmails(strEmail As String, strStartDate) 

    Dim objOutlook As Object, objnSpace As Object, objFolder As MAPIFolder, _ 
    objDict As Object, strDate As String 

    Set objOutlook = CreateObject("Outlook.Application") 
    Set objnSpace = objOutlook.GetNamespace("MAPI") 
    Set objFolder = objnSpace.Folders(strEmail).Folders("Inbox") 

    Set myItems = objFolder.Items 
    Set dict = CreateObject("Scripting.Dictionary") 

    ' Cache the SentOn column. 
    myItems.SetColumns ("SentOn") 

    ' Count messages by date. 
    For Each myItem In myItems 

     ' Only look for emails, other object types do not have a SendOn property. 
     If myItem.MessageClass = "IPM.Note" Then 

      ' Strip time from datetime. 
      dateStr = FormatDateTime(myItem.SentOn, 2) 

      ' Only find messages after startDate. 
      If CDate(dateStr) > CDate(strStartDate) Then 

        If Not dict.Exists(dateStr) Then 
         dict(dateStr) = 1 
        Else 
         dict(dateStr) = CLng(dict(dateStr)) + 1 
        End If 

      End If 

     End If 

    Next myItem 

    ' Print the results to the Immediate Window (Ctrl + G). 
    For Each o In dict.Keys 
     Debug.Print o & vbTab & dict(o) 
    Next 

End Sub 
0

가 잘 나는 마침내 내가 잘못 가고 있었다 곳을 우연히 발견하고, 단지 내 코드 줄이 잘못 것을 발견

If Not dateStr >= ((lastweek) - 30) Then