Outlookアドインで電子メールを検索するためのコードを最適化する

ウラディスラフ・クラコフ

特定の電子メール情報をExcelファイルに印刷するための次の解決策があります。日付までに書き込む必要のあるメールを選択します。

    [STAThread]
    public void Summary(DateTime startDate, DateTime finishDate, string fileSaveAdress)
    {
        try
        {
            Outlook.Application oApp = new Outlook.Application();
            Outlook.NameSpace oNs = oApp.GetNamespace("mapi");
            oNs.Logon(Missing.Value, Missing.Value, false, false);

            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkBook = xlApp.Workbooks.Add(Missing.Value);
            Excel.Worksheet xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            Outlook.MAPIFolder pickedFolder = oApp.Session.PickFolder();
            Outlook.Items pickedFolderItems = pickedFolder.Items;

            int iX = 1;
            int iY = 1;
            int iAdjustColomn = 0;

            foreach (object obj in pickedFolderItems)
            {
                if (obj is Outlook.MailItem)
                {
                    Outlook.MailItem oMsg = (Outlook.MailItem)obj;
                    if (oMsg.ReceivedTime.ToUniversalTime() > startDate.ToUniversalTime() &&
                        oMsg.ReceivedTime.ToUniversalTime() < finishDate.ToUniversalTime())
                    {
                        xlWorkSheet.Cells[iY, iX] = oMsg.ReceivedTime.ToShortDateString() + " " +
                                                    oMsg.ReceivedTime.ToShortTimeString();
                        xlWorkSheet.Cells[iY, ++iX] = oMsg.Sender.Name;

                        for (int i = 1; i <= oMsg.Recipients.Count; i++)
                        {
                            xlWorkSheet.Cells[iY, ++iX] = oMsg.Recipients[i].Name;
                        }

                        xlWorkSheet.Cells[iY, ++iX] = oMsg.Subject;

                        Outlook.Attachments AttachmentArray = oMsg.Attachments;
                        if (AttachmentArray.Count != 0)
                        {
                            foreach (Outlook.Attachment attachment in AttachmentArray)
                            {
                                xlWorkSheet.Cells[iY, ++iX] = attachment.DisplayName;
                            }
                        }

                        iAdjustColomn += iX;

                        iY += 2;
                        iX = 1;
                    }
                }
            }

            for (int i = 1; i < iAdjustColomn; i++)
            {
                AutoFitColumn(xlWorkSheet, i);
            }

            xlWorkBook.SaveAs(fileSaveAdress, Excel.XlFileFormat.xlWorkbookNormal, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                              Excel.XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            xlWorkBook.Close(true, Missing.Value, Missing.Value);
            xlApp.Quit();

            oNs.Logoff();
        }
        catch (Exception e)
        {
            ErrorReport er = new ErrorReport(e.Message);
            er.ShowDialog();
        }
    }

そして主な問題は、動作するのに十分なメモリがないエラーが発生することです。それを最適化する方法は?助けてください!

エリック・レゴー

Outlookオブジェクトを使用するforeach呼び出しを、カウンターを使用するforループに置き換えます。foreachの使用は、一般的にOutlookデータでは悪い習慣です。

また、より高速なアプローチは、Folder.GetTableでTableオブジェクトを使用することです。この場合、反復で取得する列/フィールドの最小数を設定して、メモリ使用量を最小限に抑えることができます。

Microsoftの例(http://msdn.microsoft.com/en-us/library/bb176423%28v=office.12%29.aspx):

Sub RemoveAllAndAddColumns()
'Declarations
Dim Filter As String
Dim oRow As Outlook.Row
Dim oTable As Outlook.Table
Dim oFolder As Outlook.Folder

'Get a Folder object for the Inbox
Set oFolder = Application.Session.GetDefaultFolder(olFolderInbox)

'Define Filter to obtain items last modified after May 1, 2005
Filter = "[LastModificationTime] > '5/1/2005'"
'Restrict with Filter
Set oTable = oFolder.GetTable(Filter)

'Remove all columns in the default column set
oTable.Columns.RemoveAll
'Specify desired properties
With oTable.Columns
    .Add ("Subject")
    .Add ("LastModificationTime")
    'PR_ATTR_HIDDEN referenced by the MAPI proptag namespace
    .Add ("http://schemas.microsoft.com/mapi/proptag/0x10F4000B")
End With

'Enumerate the table using test for EndOfTable
Do Until (oTable.EndOfTable)
    Set oRow = oTable.GetNextRow()
    Debug.Print (oRow("Subject"))
    Debug.Print (oRow("LastModificationTime"))
    Debug.Print (oRow("http://schemas.microsoft.com/mapi/proptag/0x10F4000B"))
Loop
End Sub

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

2つのコンマの間の電子メールアドレスを検索するためのSublimeTextの正規表現文字列

分類Dev

別のシートから値を検索するためにvbaコードを最適化する方法

分類Dev

Grails:ドメインインスタンスとの「hasMany」関係を検索するためのHibernate基準ビルダーを最適に構築する方法

分類Dev

Outlookから電子メールのコレクションを転送するための最良の方法

分類Dev

Outlookで電子メールを作成するためのLinkButton

分類Dev

VBAからOutlookの電子メールを検索する

分類Dev

VBAからOutlookの電子メールを検索する

分類Dev

ASP.netMVC5でApplicationUserの電子メールアドレスを検証するための正規表現

分類Dev

電子メールアドレスを正規化(クレンジングだけでなく正規化)するためのライブラリ

分類Dev

Eclipseのファイル全体でコメント化されたコードを検索する

分類Dev

MongoDbで複合インデックス検索を最適化するためのアルゴリズム

分類Dev

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

分類Dev

Outlookで期限切れの電子メールを検索する方法は?

分類Dev

電話をかけ、SMSを送信し、電子メールを送信するためのWP 8.1ランタイムコード(Silverlight 8.1ではありません)

分類Dev

通知の外観を最適化するための電子メールのフォーマット

分類Dev

ビルドに失敗したターゲットとエラーメッセージを検索するためにBazelビルドイベントプロトコルを解析するための最良の方法は何ですか?

分類Dev

OutlookでPSTファイルから特定の電子メールを表示するためのJavaリンク

分類Dev

Teradata:ワイルドカードを使用してアイテムを検索するための最良の方法

分類Dev

クラウドへの個人的なアップロードのためにMacでGPGを使用してファイルを暗号化するために使用するのに最適なコマンドラインオプションは何ですか?

分類Dev

URL の電子メール アドレスを検証する

分類Dev

静的を生成するためのコードの最適化

分類Dev

Outlook 2013アドインリボンXML電子メールを開くたびにコードを実行する方法は?

分類Dev

Outlook 365APIを使用して組織内で電子メールを取得するための最良の方法

分類Dev

SearchFilterCollectionを使用して電子メールアドレスでExchangeメールボックスを検索する

分類Dev

Outlookまたはその他の電子メールクライアントから送信したすべての電子メールアドレスをエクスポートするにはどうすればよいですか?

分類Dev

Outlook 2013:電子メールコンテンツにアクセスするためのVisualStudioプラグイン

分類Dev

Webサイトの電子メールアドレスを難読化する最善の方法は?

分類Dev

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

分類Dev

添付ファイル付きの電子メールを検索するために使用される検索条件はどれですか?

Related 関連記事

  1. 1

    2つのコンマの間の電子メールアドレスを検索するためのSublimeTextの正規表現文字列

  2. 2

    別のシートから値を検索するためにvbaコードを最適化する方法

  3. 3

    Grails:ドメインインスタンスとの「hasMany」関係を検索するためのHibernate基準ビルダーを最適に構築する方法

  4. 4

    Outlookから電子メールのコレクションを転送するための最良の方法

  5. 5

    Outlookで電子メールを作成するためのLinkButton

  6. 6

    VBAからOutlookの電子メールを検索する

  7. 7

    VBAからOutlookの電子メールを検索する

  8. 8

    ASP.netMVC5でApplicationUserの電子メールアドレスを検証するための正規表現

  9. 9

    電子メールアドレスを正規化(クレンジングだけでなく正規化)するためのライブラリ

  10. 10

    Eclipseのファイル全体でコメント化されたコードを検索する

  11. 11

    MongoDbで複合インデックス検索を最適化するためのアルゴリズム

  12. 12

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

  13. 13

    Outlookで期限切れの電子メールを検索する方法は?

  14. 14

    電話をかけ、SMSを送信し、電子メールを送信するためのWP 8.1ランタイムコード(Silverlight 8.1ではありません)

  15. 15

    通知の外観を最適化するための電子メールのフォーマット

  16. 16

    ビルドに失敗したターゲットとエラーメッセージを検索するためにBazelビルドイベントプロトコルを解析するための最良の方法は何ですか?

  17. 17

    OutlookでPSTファイルから特定の電子メールを表示するためのJavaリンク

  18. 18

    Teradata:ワイルドカードを使用してアイテムを検索するための最良の方法

  19. 19

    クラウドへの個人的なアップロードのためにMacでGPGを使用してファイルを暗号化するために使用するのに最適なコマンドラインオプションは何ですか?

  20. 20

    URL の電子メール アドレスを検証する

  21. 21

    静的を生成するためのコードの最適化

  22. 22

    Outlook 2013アドインリボンXML電子メールを開くたびにコードを実行する方法は?

  23. 23

    Outlook 365APIを使用して組織内で電子メールを取得するための最良の方法

  24. 24

    SearchFilterCollectionを使用して電子メールアドレスでExchangeメールボックスを検索する

  25. 25

    Outlookまたはその他の電子メールクライアントから送信したすべての電子メールアドレスをエクスポートするにはどうすればよいですか?

  26. 26

    Outlook 2013:電子メールコンテンツにアクセスするためのVisualStudioプラグイン

  27. 27

    Webサイトの電子メールアドレスを難読化する最善の方法は?

  28. 28

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

  29. 29

    添付ファイル付きの電子メールを検索するために使用される検索条件はどれですか?

ホットタグ

アーカイブ