Excel VBAを使用して、受信した電子メールの毎日の集計をOutlookからファイルにエクスポートする

user219593

そのため、Outlookの1つのフォルダーについて、毎日受信した電子メールの数の集計をエクスポートできる場所を見つけました。問題は、何百ものフォルダーに対してこれを行う必要があるため、メインフォルダー内のすべてのサブフォルダーを調べようとしたことです。これは、1つのフォルダーを調べている場合は正常に機能し、非常にうまくエクスポートされます。自分の能力の限界に達したと思います。私は正しい方向に向かっていますか、それとも非常に非効率的な道に向かっていますか?

本当に解決策に近いので、クラッシュするだけです。何万通ものメールがあるからかもしれません。

   Option Explicit

    Sub CheckInbox()
    On Error GoTo Err_CheckEmail

    'Disable Screen Updating
    Application.ScreenUpdating = False

    'Application Variables
    Dim olApp As Outlook.Application
    Dim objNS As Outlook.Namespace
    Dim item As Object
    Dim myOlItems As Object

    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set myOlItems = objNS.Folders("[email protected]").Folders("Cabinet")

    Dim intCount As Long: intCount = 0
    Dim strFolder As String
    Dim tmpDate As String
    Dim i As Long: i = 0

    'Folder Level 1
    Dim olFolderA

    '-----Parent Folder (Inbox)-----
    strFolder = myOlItems.FolderPath

    'Get Item Count
    intCount = myOlItems.Items.Count

    'Update Run Log
    Call RunLog(strFolder, intCount)

    'Loop Through Items
    For i = intCount To 1 Step -1

        'Set the Item index
        Set item = myOlItems.Items(i)
        If item.Class = olMail Then

            'Get The Date/Subject
            tmpDate = Format(item.ReceivedTime, "MM/dd/yyyy")


            'Update Log
            Call LogCounts(tmpDate, strFolder)

       End If

    Next

    '-----Folder Level 1 (\\Inbox\Folder1)-----
    For Each olFolderA In myOlItems.Folders
        strFolder = olFolderA.FolderPath

        'Get Item Count
        intCount = olFolderA.Items.Count

        'Update Run Log
        Call RunLog(strFolder, intCount)

        'Loop Through Items
        For i = intCount To 1 Step -1

            'Set the Item index
            Set item = olFolderA.Items(i)

            'Get The Date/Subject
            tmpDate = Format(item.ReceivedTime, "MM/dd/yyyy")

            'Update Log
            Call LogCounts(tmpDate, strFolder)

    Next

 Next

 '---Sort Worksheets / Format Columns---
 'EmailCount
 Worksheets("EmailCount").Select
    Columns("A:C").Select
    ActiveWorkbook.Worksheets("EmailCount").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("EmailCount").Sort.SortFields.Add Key:=Range("A2:A500000"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("EmailCount").Sort.SortFields.Add Key:=Range("B2:B500000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("EmailCount").Sort
        .SetRange Range("A1:C10001")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

 Worksheets("EmailCount").Columns("A:B").EntireColumn.AutoFit

'RunLog
 Worksheets("RunLog").Select
    Columns("A:C").Select
    ActiveWorkbook.Worksheets("RunLog").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("RunLog").Sort.SortFields.Add Key:=Range("A2:A500000"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("RunLog").Sort.SortFields.Add Key:=Range("B2:B500000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("RunLog").Sort
        .SetRange Range("A1:C10001")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Worksheets("RunLog").Columns("A:C").EntireColumn.AutoFit

'Enable Screen Updating
Application.ScreenUpdating = True

 'Exit Befor Error Handler
 Exit Sub

Err_CheckEmail:

    MsgBox Err.Description

    'Enable Screen Updating
    Application.ScreenUpdating = True

End Sub

Sub LogCounts(strInDate, strFolder)
On Error GoTo Err_Counts

'Set Worksheet to Log Emails
Worksheets("EmailCount").Select

'Declare Variables
Dim x As Long
Dim startRow As Long: startRow = 2 'Start Row
Dim endRow As Long: endRow = 100000 'End Row

'Loop through Log Worksheet
For x = startRow To endRow

    'See if a row for the particular date already exists
    If Format(Cells(x, 1).Value, "MM/DD/YYYY") = Format(strInDate, "MM/DD/YYYY") And Cells(x, 2).Value = strFolder Then
        Cells(x, 3).Value = Cells(x, 3).Value + 1
        Exit Sub
    End If

    'Exit Loop for Nulls
    If Cells(x, 1).Value = "" Then
        Exit For
    End If

    Next

    'Prevent Log from Getting too large
    If x = endRow Then
        MsgBox "The Email Count worksheet contains too many records. Either extend the size or move the data to another spreadsheet."
        Exit Sub
    End If

    'Create New Entry for Date
    Cells(x, 1).Value = strInDate
    Cells(x, 2).Value = strFolder
    Cells(x, 3).Value = 1

    'Exit before Error Handler
    Exit Sub

    Err_Counts:
        MsgBox Err.Description
        End

    End Sub

    Sub RunLog(strFolder, strCount)
    On Error GoTo Err_Log

    'Set Worksheet to Log Emails
    Worksheets("RunLog").Select

    'Declare Variables
    Dim x As Long
    Dim startRow As Long: startRow = 2 'Start Row of Log Worksheet
    Dim endRow As Long: endRow = 100000 'End Row of the Log Worksheet

    'Loop through Worksheet to find Empty Row
    For x = startRow To endRow

        'Exit Loop for Nulls
        If Cells(x, 1).Value = "" Then
            Exit For
        End If

    Next

    'Prevent Log from Getting too large
    If x = endRow Then
        MsgBox "The run log contains too many records. Either extend the log size or move the data to another spreadsheet."
        Exit Sub
    End If

    'Create New Entry for Date
    Cells(x, 1).Value = Now
    Cells(x, 2).Value = strFolder
    Cells(x, 3).Value = strCount

    'Exit Before Error Handler
    Exit Sub

    Err_Log:
    MsgBox Err.Description
    End

    End Sub
ニートン

開発中は、「On Error GoTo」を削除して、エラーのある行をより簡単に確認できるようにします。

すべてのサブフォルダーを処理できるようになるまで、現在のエラーに焦点を合わせる必要はありません。

これを試して:

Private Sub LoopFolders_Test()

    'Application Variables
    Dim olApp As Outlook.Application
    Dim objNS As Outlook.Namespace
    Dim myolItems As Folder

    Dim Start As Date
    Dim EndTime As Date

    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    'Set myOlItems = objNS.GetDefaultFolder(olFolderInbox)
    Set myolItems = objNS.PickFolder

    If myolItems Is Nothing Then GoTo exitRoutine

    Start = Now
    Debug.Print "Start: " & Start
    Debug.Print "Startfolder Name: " & myolItems.Name

    'Disable Screen Updating
    'Application.ScreenUpdating = False

    LoopFolders myolItems.Folders

    ' Finalize Excel display here

exitRoutine:
    Set olApp = Nothing
    Set objNS = Nothing
    Set myolItems = Nothing  

    'Enable Screen Updating
    'Application.ScreenUpdating = True

    EndTime = Now
    Debug.Print "End  : " & EndTime
    Debug.Print Format((EndTime - Start) * 86400, "#,##0.0") & " seconds"

End Sub

Private Sub LoopFolders(olFolders As Folders)

  Dim F As Folder

  For Each F In olFolders
    DoEvents    
    Debug.Print "Subfolder Name: " & F.Name ' Code has not crashed
    ' Count mail here
    LoopFolders F.Folders
  Next

End Sub

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Excel VBAを使用して、Outlookの受信トレイにある最新の電子メールからExcelファイルをダウンロードします。

分類Dev

受信日で指定されたOutlookからExcelへの電子メールを取得します

分類Dev

Outlookの電子メールをExcelにエクスポートする

分類Dev

VBAスクリプトを使用してExcelファイル全体を電子メールで送信する方法

分類Dev

VBAを介してExcelから電子メールの添付ファイルを送信する

分類Dev

Outlook2013検索フォルダーの電子メールをExcelにエクスポートする

分類Dev

Pythonを使用してExcelのユーザーのリストに添付ファイル付きのOutlook電子メールを送信します

分類Dev

Microsoft Power Automateの電子メールで受信したExcel添付ファイルのデータを直接読み取る方法はありますか?

分類Dev

Outlook2010を使用してExcelファイルを画像として電子メールに挿入する

分類Dev

Outlookの電子メール情報をExcelワークブックにエクスポートする

分類Dev

Excel VBAを使用してエクスポートされたPDFファイルをOutlookメールに添付するにはどうすればよいですか?

分類Dev

アクティブなExcelファイルをPDFまたはExcelとして電子メールで送信するためのVBAコード

分類Dev

選択した電子メールの電子メール本文をOutlookのメッセージボックスとしてExcelで表示しますか?

分類Dev

選択した電子メールの電子メール本文をOutlookのメッセージボックスとしてExcelで表示しますか?

分類Dev

Excel シートの特定のフィールドを使用して Outlook で電子メールを自動化するための Excel

分類Dev

シートをExcelの添付ファイルとして電子メールを送信しようとしたときに例外エラーが表示される

分類Dev

ExcelでVBAを使用して電子メールに添付ファイルを追加する方法

分類Dev

OutlookサブフォルダーからExcelへの電子メールのエクスポート

分類Dev

VBAとExcelを使用してフォルダ内のファイルからデータを収集する

分類Dev

VBAとExcelを使用してフォルダ内のファイルからデータを収集する

分類Dev

PHPを使用して列を保護した後にExcelファイルをエクスポートする方法

分類Dev

VBAを使用してExcelから電子メール本文をフォーマットする

分類Dev

スプレッドシートが変更されたときにOutlookを使用してExcelから自動電子メールを送信する

分類Dev

Jythonを使用してフォーマットされたExcelファイルにエクスポートする

分類Dev

SendObjectを使用してAccessからExcelオブジェクトを送信します。電子メールに添付ファイルはありません

分類Dev

フォーマットを維持したまま、テーブル/クロス集計を r から Excel にエクスポートする方法

分類Dev

Pythonを使用してExcelのすべての行に新しいOutlook電子メールを作成する方法

分類Dev

Outlook VBAを使用して、Excelファイルを開き、そのファイルにデータをインポートします

分類Dev

Business Intelligence Devstudioを使用したExcelの電子メール添付ファイルによる四半期ごとの定期的なクエリ

Related 関連記事

  1. 1

    Excel VBAを使用して、Outlookの受信トレイにある最新の電子メールからExcelファイルをダウンロードします。

  2. 2

    受信日で指定されたOutlookからExcelへの電子メールを取得します

  3. 3

    Outlookの電子メールをExcelにエクスポートする

  4. 4

    VBAスクリプトを使用してExcelファイル全体を電子メールで送信する方法

  5. 5

    VBAを介してExcelから電子メールの添付ファイルを送信する

  6. 6

    Outlook2013検索フォルダーの電子メールをExcelにエクスポートする

  7. 7

    Pythonを使用してExcelのユーザーのリストに添付ファイル付きのOutlook電子メールを送信します

  8. 8

    Microsoft Power Automateの電子メールで受信したExcel添付ファイルのデータを直接読み取る方法はありますか?

  9. 9

    Outlook2010を使用してExcelファイルを画像として電子メールに挿入する

  10. 10

    Outlookの電子メール情報をExcelワークブックにエクスポートする

  11. 11

    Excel VBAを使用してエクスポートされたPDFファイルをOutlookメールに添付するにはどうすればよいですか?

  12. 12

    アクティブなExcelファイルをPDFまたはExcelとして電子メールで送信するためのVBAコード

  13. 13

    選択した電子メールの電子メール本文をOutlookのメッセージボックスとしてExcelで表示しますか?

  14. 14

    選択した電子メールの電子メール本文をOutlookのメッセージボックスとしてExcelで表示しますか?

  15. 15

    Excel シートの特定のフィールドを使用して Outlook で電子メールを自動化するための Excel

  16. 16

    シートをExcelの添付ファイルとして電子メールを送信しようとしたときに例外エラーが表示される

  17. 17

    ExcelでVBAを使用して電子メールに添付ファイルを追加する方法

  18. 18

    OutlookサブフォルダーからExcelへの電子メールのエクスポート

  19. 19

    VBAとExcelを使用してフォルダ内のファイルからデータを収集する

  20. 20

    VBAとExcelを使用してフォルダ内のファイルからデータを収集する

  21. 21

    PHPを使用して列を保護した後にExcelファイルをエクスポートする方法

  22. 22

    VBAを使用してExcelから電子メール本文をフォーマットする

  23. 23

    スプレッドシートが変更されたときにOutlookを使用してExcelから自動電子メールを送信する

  24. 24

    Jythonを使用してフォーマットされたExcelファイルにエクスポートする

  25. 25

    SendObjectを使用してAccessからExcelオブジェクトを送信します。電子メールに添付ファイルはありません

  26. 26

    フォーマットを維持したまま、テーブル/クロス集計を r から Excel にエクスポートする方法

  27. 27

    Pythonを使用してExcelのすべての行に新しいOutlook電子メールを作成する方法

  28. 28

    Outlook VBAを使用して、Excelファイルを開き、そのファイルにデータをインポートします

  29. 29

    Business Intelligence Devstudioを使用したExcelの電子メール添付ファイルによる四半期ごとの定期的なクエリ

ホットタグ

アーカイブ