[三流君] −−> [VBAで楽しく] −−> [VBA Outlook 操作]
−−> No.171 Outlook VBA 受信MailにフラグをSET .Folders .Itemsを探る

Outlook VBA 受信MailにフラグをSET .Folders .Itemsを探る

発行内容

Outlook VBA 受信MailにフラグをSET .Folders .Itemsを探る

どうも、三流プログラマーのKen3です。

今回は、
VBA から Outlook の受信トレイを探り、
メールアイテムのフラグを変更してみたいと思います。

/* * 1. 今回のキッカケ */

掲示板にいただいた質問 --- >三流君VBAでOutlookを操作するの >No.161 Outlook VBAでフラグ作成は非常にためになりました。 >私の場合は新規作成メールにフラグをつけるのではなく >すでに受信しているメールに「実施済み」という意味合いでフラグを付けたい >のですが、可能でしょうか >よろしくお願いいたします。 --- と質問をもらった。 No.161 Outlook VBAでフラグ作成 .FlagStatus .FlagRequest .FlagDueBy http://www.ken3.org/vba/backno/vba161.html で行った方法は、新規に作成するメールに対してだったので一直線だったからなぁ。。 受信済みのメールを選択して、フラグを付けたいのね・・・

/* * 2.受信トレイの選択 .Foldersを探る */

フラグを付けるメールを選びたいよね。 とその前に、受信トレイとか送信トレイ、下書きなどのフォルダーの選択かぁ・・・ Excel VBA からOutLookデータを読む http://www.ken3.org/guchi/backno/guchi022.html ↑愚痴系のNo.22 ナツカシイ・・ と過去の自分を参考にすると(Googleで探したら本人忘れてた自分のサイトを発見(笑)) .Foldersってオブジェクトで探れそうです。 フォルダー名をテストで表示させて見ました。
Sub aaa()
    'Outlookを開き、フォルダー名をメッセージボックスでテスト表示
    Dim objOL As Object      'OutLookのアプリケーションオブジェクト
    Dim objNAMESPC As Object '名前空間
    Dim n As Integer     'カウンター

    'アプリケーションのオブジェクトを新規作成
    Set objOL = CreateObject("Outlook.Application")
    
    'Namespace オブジェクト作成
    Set objNAMESPC = objOL.GetNamespace("MAPI")
   
    'フォルダーの数を表示する
    MsgBox "親のフォルダー数は" & objNAMESPC.Folders.Count

    'フォルダーの下、第二階層でループさせる
    For n = 1 To objNAMESPC.Folders(1).Folders.Count
        '1番目のさらに下、n番目のフォルダー名を表示する
        MsgBox objNAMESPC.Folders(1).Folders(n).Name
        Debug.Print objNAMESPC.Folders(1).Folders(n).Name
    Next n

    '後始末
    objOL.Quit

End Sub
実行すると、下記のフォルダー名が表示されると思います。 削除済みアイテム 受信トレイ 送信トレイ 送信済みアイテム 予定表 連絡先 履歴 メモ 仕事 手抜きで、 objNAMESPC.Folders(1).Folders(n) と1番目のルートから2階層目を回してますが、 複数のアカウントを管理されている人は、注意が必要です・・・

/* * 3.フォルダーの下にメールアイテムが存在します */

パターン的にアカウント--フォルダー--メールアイテムって感じで探っていきます。 アカウントは、今回手抜きで、 objNAMESPC.Folders(1)と1番上のアカウントとして、 その下の受信トレイを探し(objNAMESPC.Folders(1).Folders(n)を探す) そのフォルダー内のメールアイテムを探ってみます。
Sub bbb()
    '受信トレイを探し、メールの件名などを表示してみる
    'Outlookを開き、フォルダー名をメッセージボックスでテスト表示
    Dim objOL      As Object 'OutLookのアプリケーションオブジェクト
    Dim objNAMESPC As Object '名前空間
    Dim objFLD     As Object 'フォルダー保存用
    Dim objMAIL    As Object 'メールアイテム
    Dim y As Integer     'カウンター

    'アプリケーションのオブジェクトを新規作成
    Set objOL = CreateObject("Outlook.Application")
    
    'Namespace オブジェクト作成
    Set objNAMESPC = objOL.GetNamespace("MAPI")
   
    'フォルダーの下、第二階層.Foldersでループさせる
    For Each objFLD In objNAMESPC.Folders(1).Folders
        'フォルダー名が受信トレイか?
        If objFLD.Name = "受信トレイ" Then
            'テストでメールを新規ブックに書き出す
            Workbooks.Add   '新規ブックを作成する
            y = 1 '1行目から書き込む
            'フォルダーのアイテム数分ループ Folders.Items
            For Each objMAIL In objFLD.Items
                'セルに代入
                Cells(y, "A") = objMAIL.CreationTime  '作成日
                Cells(y, "B") = objMAIL.Subject
                Cells(y, "C") = objMAIL.Body
                'セット位置を移動
                y = y + 1
            Next objMAIL
        End If
    Next objFLD

    '後始末
    objOL.Quit

End Sub
ポイントは、 For Each objFLD In objNAMESPC.Folders(1).Folders Next このループで、フォルダー(トレイ)をobjFLDに1つ1つ取り出しながらループさせます 次に、取り出したオブジェクトobjFLDの名前が受信トレイかチェックします。 If objFLD.Name = "受信トレイ" Then と、.Nameプロパティを比較します。 フォルダー(トレイ)のItem数分(メールアイテム)を取り出すループを 'フォルダーのアイテム数分ループ Folders.Items For Each objMAIL In objFLD.Items Next と作成しました。このループでobjFLDのアイテム単位に処理してます。 あとは、テストなので、アイテムの内容を 'セルに代入 Cells(y, "A") = objMAIL.CreationTime '作成日 Cells(y, "B") = objMAIL.Subject Cells(y, "C") = objMAIL.Body セルに代入しました。 テストプログラムでなんとなくイメージはつかめましたか? 受信トレイを.Nameを手がかりにフォルダーのループから探し、 その下のメールアイテム .Itemsから1件1件処理してます。

/* * 4.リストボックスに作成日、件名をセットする */

やっとメールアイテムまでたどり着けたので、 このアイテムに対してフラグを書き換えてみたいと思います。 と、その前に、データを選択しないといけないなぁ。 Excelのユーザーフォームを1つ作成して、リストボックスで選ばせるかな。 lstMAIL 1つ、リストボックスを作成 btnSET , btnCLOSE ボタンを2つ作成 フォームを開いたタイミングで、 受信トレイの作成日時と件名をリストボックスにセットする。 リストボックスを選択後、btnSETボタンを押す ボタンが押されたら、該当するメールアイテムを再度検索して、フラグをセット btnCLOSEが押されたらフォームを閉じる、そんな処理を書いてみます。 まず、フォームが開かれたら、 Outlookの受信トレイからメールアイテムを取り込みます。
Private Sub UserForm_Initialize()
    'フォームの初期化イベントでリストボックスにメールデータをセットする
    Dim objOL      As Object 'OutLookのアプリケーションオブジェクト
    Dim objNAMESPC As Object '名前空間
    Dim objFLD     As Object 'フォルダー保存用
    Dim objMAIL    As Object 'メールアイテム

    Dim strWORK As String

    Me.lstMAIL.Clear  '.Clearでリストボックスの内容を全てクリア

    'アプリケーションのオブジェクトを新規作成
    Set objOL = CreateObject("Outlook.Application")
    
    'Namespace オブジェクト作成
    Set objNAMESPC = objOL.GetNamespace("MAPI")
   
    'フォルダーの下、第二階層.Foldersでループさせる
    For Each objFLD In objNAMESPC.Folders(1).Folders
        'フォルダー名が受信トレイか?
        If objFLD.Name = "受信トレイ" Then
            'フォルダーのアイテム数分ループ Folders.Items
            For Each objMAIL In objFLD.Items
                '作成日:題名で文字列を作成する
                strWORK = objMAIL.CreationTime & ":" & objMAIL.Subject
                'データをセット
                Me.lstMAIL.AddItem (strWORK)
            Next objMAIL
        End If
    Next objFLD

    '後始末
    objOL.Quit

End Sub
ポイントは特に無く(オイオイ) リストボックスを.Clearでクリアして、.AddItemで行を追加してます。 objMAIL.CreationTime & ":" & objMAIL.Subject 作成日:件名をリストボックスにセットしてます。(1つのカラムにセットしてます) リストボックスの参考URLは Excel UserForm リストボックスを使ってみた http://www.ken3.org/vba/backno/vba121.html を見てください。 ここからメインかな、 フラグをセットのボタンが押されたら、 ^^^^^^^^^^^^^^ リストボックスで選択されている 作成日:題名 と一致するメールアイテムのフラグを書き換えます。
Private Sub btnSET_Click()
    'ボタンが押されたらリストボックスで選択されている
    'メールアイテムのフラグに実施済みの文字をセットする
    Dim objOL      As Object 'OutLookのアプリケーションオブジェクト
    Dim objNAMESPC As Object '名前空間
    Dim objFLD     As Object 'フォルダー保存用
    Dim objMAIL    As Object 'メールアイテム

    Dim strWORK As String

    'アプリケーションのオブジェクトを新規作成
    Set objOL = CreateObject("Outlook.Application")
    
    'Namespace オブジェクト作成
    Set objNAMESPC = objOL.GetNamespace("MAPI")
   
    'フォルダーの下、第二階層.Foldersでループさせる
    For Each objFLD In objNAMESPC.Folders(1).Folders
        'フォルダー名が受信トレイか?
        If objFLD.Name = "受信トレイ" Then
            'フォルダーのアイテム数分ループ Folders.Items
            For Each objMAIL In objFLD.Items
                '作成日:題名で文字列を作成する
                strWORK = objMAIL.CreationTime & ":" & objMAIL.Subject
                'リストボックスとデータが一致するかチェック
                If Me.lstMAIL.Text = strWORK Then
                    'フラグデータをセット(書き換える)
                    objMAIL.FlagStatus = 2 'olFlagMarked (2)をセット参照設定時は定数で
                    objMAIL.FlagRequest = "実施済み" 'フラグ内容をセット
                    'objMAIL.FlagDueBy = Now '今回は期限はセットしない
                    objMAIL.Save  '忘れずに保存する
                    MsgBox "フラグメッセージを書き換えました"
                    Exit For 'ループを強制的に抜ける
                End If
            Next objMAIL
        End If
    Next objFLD

    '後始末
    objOL.Quit

End Sub
ほとんど、リストボックスの初期化と同様の処理で、 受信トレイを探してから、メールアイテムのループに入り、 strWORK = objMAIL.CreationTime & ":" & objMAIL.Subject If Me.lstMAIL.Text = strWORK Then で、リストボックスと文字が一致するかチェックしてます。 一致してたら、フラグのセットです objMAIL.FlagStatus = 2 'olFlagMarked (2)をセット参照設定時は定数で objMAIL.FlagRequest = "実施済み" 'フラグ内容をセット 'objMAIL.FlagDueBy = Now '今回は期限はセットしない objMAIL.Save '忘れずに保存する ステータスに2、フラグ有りをセットしてから文字列で内容"実施済み"をセットします そして忘れずに.Saveメソッドを発行して、保存します(私は忘れて小一時間悩みました) メールのフラグ関係詳細は、 No.161 Outlook VBAでフラグ作成 .FlagStatus .FlagRequest .FlagDueBy http://www.ken3.org/vba/backno/vba161.html を見てください。 最後におまけの閉じるボタン
Private Sub btnCLOSE_Click()
    Unload Me   '自分自身を閉じます(笑)
End Sub
閉じるボタンの参考URLは Excel Form 閉じる方法 Unload Me http://www.ken3.org/vba/backno/vba061.html を見てください。

/* * 5.終わりの挨拶 */

今回は、 受信トレイの受信済みメールに対して、フラグをセットしてみた、 そんな話でした。 フォームを開いた時に全てのメールをリストボックスに代入してますが、 実際は、フラグがセットされていないメールのみをセットするのがよかったり。 ※テストファイル作り終わってから気が付いたり・・・ 'フォルダーのアイテム数分ループ Folders.Items For Each objMAIL In objFLD.Items '作成日:題名で文字列を作成する strWORK = objMAIL.CreationTime & ":" & objMAIL.Subject 'データをセット Me.lstMAIL.AddItem (strWORK) '←※1 Next objMAIL ※1を If objMAIL.FlagRequest <> "実施済み" Then Me.lstMAIL.AddItem (strWORK) End If と、 実施済み以外をリストで選択可能とすると便利かも。 ~~~~~~~~~~~~ また、リストボックスで件名をクリックするとメールの内容が確認できたりしないと、 (リストボックスをクリックしたら、メールの中身を表示するなど) 不親切かなぁと思ったり。 いろいろとボロがあるサンプルですが、 http://www.ken3.org/vba/lzh/vba171.lzh にサンプルvba171.xlsを圧縮しておきます、 Excel2000とOutlook2000版ですが使ってみてください。 三流君VBAでOutlookを操作する http://www.ken3.org/cgi-bin/group/vba_outlook.asp ↑にVBA Outlook 操作系のメルマガまとめてます、こちらも一口どうぞ。 ※今回、かなりの複合技だったけど、1つ1つはなれれば簡単かなぁ。 全体的に斬新なテクニック系のネタじゃないのですが、 何か、感じ取ってくれると、うれしいです。 AB型の変わり者、三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]