[三流君] −−> [プログラマー業務の愚痴] −−> [バックナンバー一覧]
−−> No.022 Excel VBA からOutLookデータを読む

Excel VBA からOutLookデータを読む


次は、受信したメールに対して処理を行いたい、そんな流れだと思います。。。

MailItem オブジェクト
http://msdn.microsoft.com/ja-jp/library/cc359390.aspx
↑MSDNを参考にして、

'Excel2003 VBA から OutLook2003を起動して 受信メールを1つ1つ取り出す
Sub OL_TEST_LOOK_MAIL_0221()  

    Dim oApp As Object        'OutlookのApplication オブジェクトを入れる
    Dim myNameSpace As Object '名前のスペースと言われても、、
    Dim myFolder As Object    'フォルダー指定

    'outlook 起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を
    Set oApp = CreateObject("Outlook.Application")

    '呪文1 名前空間 の 指定 と言っても、.GetNamespace("MAPI")しただけ
    Set myNameSpace = oApp.GetNamespace("MAPI")
    
    '次は作業フォルダーの指定(.GetDefaultFolder) と 表示(.Display)
    Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
    myFolder.Display  '表示 いつものクセで .Visible = True とやりがちだけど
    
    '次にメールの中身を取り出したいと思います。
    Dim objMAILITEM As Object 'メールアイテム
    Dim n As Integer  'カウンター
    
    For n = 1 To myFolder.Items.Count  'フォルダーのアイテム数分ループ
        'メールを1通取り出す、変数にセットする
        Set objMAILITEM = myFolder.Items(n) '別にあらためてセットしなくても使えるけど
        'テストデータをセルにセットする※11行目からセットする。。。
        Cells(n + 10, "A") = objMAILITEM.CreationTime  '作成日
        Cells(n + 10, "B") = objMAILITEM.SenderName    '差出人
        Cells(n + 10, "C") = objMAILITEM.SenderEmailAddress    '差出人のアドレス
        Cells(n + 10, "D") = objMAILITEM.Subject       '件名
        Cells(n + 10, "E") = objMAILITEM.Body          '本文
    Next n

End Sub
←をそのまま実行すると、セキュリティのエラーがでるし・・・(涙)
↓実行結果の動画
http://www.youtube.com/watch?v=utXGuzkJ27M
↑三流解説 [え〜と] And [こんな感じ] の音声付き(笑)
↓エラーの画像
Ol0209w1
↑ここで、1分や2分・・を選択するとうまくデータを取ることができます・・・

本文(発行内容)

↓ここからした、Excel97 と Outlook97 時代に作ったサンプルです。※正しく動かないので参考程度に読んでください・・・
<Excel VBA からOutLookデータを読む>
目次
1.はじめの挨拶 
2.質問内容
3.サンプル
4.サンプル解説
5.積み残し、残作業項目(食い残し)
6.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
なんか、かぜぎみのKen3です。

今回は、
Excel VBA からOutLookデータを読む
です。

いつになったら、C言語やるの?
メルマガタイトル、Officeと戦うVBA講座に直したら?

VBAネタ、消化できるまで、待ってくださいよ。

あれ、ハッシュと二分岐は?

それも、、、もうチョット。(もう、忘れたかな?みんな?)

今回の実行できるサンプルを
hosoku/022/index.html
サンプルから、落とせるようにしておきます。あわせてみてください。
*テスト環境は、Excel97 と OutLook97 です。

枠外解説・グチ --- 食べたいものから、食べてると or 食い散らかし

またまた、前置きが長い、関係無い話ですが、
みなさん、ご存知だと思いますが、
私宛てに、質問、いろいろ来てます。

簡単なのからレベルの高いのまで、、、(あれ、そんなに来てたっけ?)

で、通常は、先に来た質問からやっていかないといけないのですが、
(基本は、先入れ先出しですよね、、)
興味のある・できそうな、、、
など自分で消化しやすいものから食べてます(解説始めてます)

そのような、ことをしていると、消化できない難しい物や、
自分のキライナものが残ってしまいます。

仕事も同様で、よく、後輩や新人が自分のやりやすい、
画面や帳票から、やっていくと、
難しいモジュール系が残ってしまいます。
このような形で、食い散らかすと、あとで食べるの手伝う時、
もうぐちゃぐちゃで手伝いたくない、状況がうまれます。
*キレイに計画的に食べましょう?

あと、自分の分は自分で、、と責任感強いの居るし、
これ、私の仕事、、とツバつけて、渡したくない人居るしなぁ、、
*あいつの食べ残しはイヤ?この子のなら、進んで手伝う?
 いろいろあって、配分考えるのツライ。

また、栄養が偏った食事ばかりしていると、、、(仕事でVBAばかり)
まぁ、仕事は部署やその時のタイミングあるから、
足りない栄養は、自宅で自分で補給?

勝手に盛り上がってるけど、(それは、それで、いいとして)
テメエが噛み砕いて教えてないから、
新人・後輩が消化できない件は、忘れたの?

忘れてないけど、、、 まぁ、プログラマーの栄養士にはなれそうないなキット。

あっ、長くなったので、続き?は、また、今度、、 

/*
 * 2.質問内容
*/
読者の人から、質問で、
----
>実は以前MicrosoftからフリーでACCESS97からOutlookのデータへ
>リンクかインポートできるというものがでていたんですが
>Outlook5には対応してなくて困っています。
>そこでACCESS97からOutlook5(Outlook Express5も)へリンクする方法を
>お願いいたします。
----
とメールをいただきました。

私事ですが、今度、仕事で(来年以降)、
メールで発注書を受け取って、処理したい
そんな感じのシステムの見積もり作るので、
興味があったので、少しやってみました。

*メールで注文受けて処理、、、大丈夫なのかなぁ?
  Webを立ち上げて、、のほうがいいような気がするけど。。。

/*
 * 3.サンプル
*/
Excel97 VBA からOutLook97データを読んでみました。
test4が完成版です。
*Access や VBでも、結果の書き込み部分だけ変更すれば、
 動作すると思います。
'----- ここから
'TEST()は、Access,VBでも、動作すると思う。
Sub TEST()

    'Outlook にアクセスして、フォルダー名?をMsgboxで表示
    'テストバージョン
    
    Dim olAPP As Object
    Dim olNameSPC As Object
    Dim nFCNT As Integer

    Set olAPP = CreateObject("Outlook.Application")
    Set olNameSPC = olAPP.GetNamespace("MAPI") ' Namespace オブジェクト
   
   'MsgBox olNameSPC.Folders.Count

    For nFCNT = 1 To olNameSPC.Folders(1).Folders.Count
        MsgBox olNameSPC.Folders(1).Folders(nFCNT).Name
    Next nFCNT

End Sub

Sub TEST2()

    LookOutLookMSG ("受信トレイ")
                    '↑半角で打ってください、
End Sub


'フォルダー名を受け取り、メッセージを表示、、デバック中?
'これも、Access,VBでも、動作すると思う。
Sub LookOutLookMSG(strFNAME As String)

    Dim olAPP As Object
    Dim olNameSPC As Object

    Dim objItem            As Object
    Dim dteCreateDate      As Date
    Dim strSubject         As String
    Dim strItemType        As String
    Dim strBody            As String

    Dim intCounter         As Integer
    Dim strOKNG            As String
    Dim strMSG             As String

    Dim nFCNT As Integer

    Set olAPP = CreateObject("Outlook.Application")
    Set olNameSPC = olAPP.GetNamespace("MAPI") ' Namespace オブジェクト
   
   'MsgBox olNameSPC.Folders.Count

    strOKNG = "NG"
    For nFCNT = 1 To olNameSPC.Folders(1).Folders.Count
        If olNameSPC.Folders(1).Folders(nFCNT).Name = strFNAME Then
            strOKNG = "OK"
            Exit For   '見つかったので抜ける
        End If
    Next nFCNT

    If strOKNG = "NG" Then
        MsgBox strFNAME & "フォルダーは、見つかりませんでした"
        Exit Sub
    End If
    
   For Each objItem In olNameSPC.Folders(1).Folders(nFCNT).Items
      intCounter = intCounter + 1
      With objItem
         dteCreateDate = .CreationTime
         strSubject = .Subject
         strItemType = TypeName(objItem)
         strBody = .Body
      End With
      strMSG = vbTab & "アイテム番号" & intCounter & " - " _
         & strItemType & " - 作成日 " _
         & Format(dteCreateDate, "yyyy/mm/dd hh:mm am/pm") _
         & vbCrLf & vbTab & vbTab & "件名 : '" _
         & strSubject & "'" & vbCrLf _
         & strBody
      If MsgBox(strMSG, vbOKCancel) = vbCancel Then
          Exit For
      End If
   Next objItem

End Sub

Sub test3()

    Dim strInName As String
    
    strInName = InputBox("名称を入れてください")
    LookOutLookMSG (strInName)

End Sub

'TEST4()は、ワークシート系のプロパティ、、
'を使っているので、Excelだけで、動作します。。チョット改造してください。

Sub test4()

    Dim olAPP As Object
    Dim olNameSPC As Object

    Dim objItem            As Object
    Dim dteCreateDate      As Date
    Dim strSubject         As String
    Dim strItemType        As String
    Dim strBody            As String

    Dim intCounter         As Integer
    Dim strMSG             As String

    Dim nFCNT   As Integer
    Dim nYLINE  As Integer

    Workbooks.Add   '新規ブックを作成する

    Set olAPP = CreateObject("Outlook.Application")
    Set olNameSPC = olAPP.GetNamespace("MAPI") ' Namespace オブジェクト
       
    nYLINE = 1
    For nFCNT = 1 To olNameSPC.Folders(1).Folders.Count
    
        'フォルダーの名称を書き込む
        Cells(nYLINE, 1) = olNameSPC.Folders(1).Folders(nFCNT).Name
        nYLINE = nYLINE + 1
        '見出しを書き込む
        Cells(nYLINE, 1) = "No."
        Cells(nYLINE, 2) = "タイプ"
        Cells(nYLINE, 3) = "作成日"
        Cells(nYLINE, 4) = "件名"
        Cells(nYLINE, 5) = "内容"
        nYLINE = nYLINE + 1
        
        'メッセージ数分ループ
        For Each objItem In olNameSPC.Folders(1).Folders(nFCNT).Items
            
            intCounter = intCounter + 1
            
            '変数に代入(セルに直接でもいいかも?)
            With objItem
               dteCreateDate = .CreationTime
               strSubject = .Subject
               strItemType = TypeName(objItem)
               strBody = .Body
            End With
            
            'セルに代入
            Cells(nYLINE, 1) = intCounter
            Cells(nYLINE, 2) = strItemType
            Cells(nYLINE, 3) = dteCreateDate
            Cells(nYLINE, 4) = strSubject
            Cells(nYLINE, 5) = strBody

            'セット位置を移動
            nYLINE = nYLINE + 1

        Next objItem

        nYLINE = nYLINE + 1
        
    Next nFCNT

    '楽して、Excelの自動サイズ調整を使用する
    Columns("A:E").EntireColumn.AutoFit
    Range("A1").Select

End Sub
'----- ここまで

/*
 * 4.サンプル解説
*/
簡単に、解説します。
ア.オブジェクト"Outlook.Application"?
  前回、VBAからExcelを操作したときと同様に、
    Set olAPP = CreateObject("Outlook.Application")
  で、オブジェクトを参照できるようにします。
  
  なんで、
  Outlook.Application
  なの?
  そんなのExcelVBAヘルプに載ってないよ。

  えっと、MSDN(マイクロソフトデベロッパーネットワーク)
  のCDで、Outlookで検索したら、載ってました。

  じゃ、それないと、わからないの?
  ですね、、、今回のも、そこに載ってたサンプルを少し改造したものです。
  * Outlook Express の設定方法、わからなかったので、
   ご存知の方は、教えてください。
  
    Set olNameSPC = olAPP.GetNamespace("MAPI") ' Namespace オブジェクト
  で、メッセージのオブジェクトを作って、
  (サンプルそのまんまジャン)   

    For nFCNT = 1 To olNameSPC.Folders(1).Folders.Count
        MsgBox olNameSPC.Folders(1).Folders(nFCNT).Name
    Next nFCNT
  テストなので、メッセージボックスで、フォルダー名を表示してます。

イ.メッセージの参照方法
  オブジェクトフォルダーの中に、メッセージが入っています。
  それを、
  For Each objItem In olNameSPC.Folders(1).Folders(nFCNT).Items
  のループで1件、1件、取り出してます。
  実際の参照は、
      With objItem
         dteCreateDate = .CreationTime
         strSubject = .Subject
         strItemType = TypeName(objItem)
         strBody = .Body
      End With
  で、作成日・件名・タイプ・内容
  を変数に取り出してます。

ウ.なんで、オブジェクトの構造が?
  テメエはなんで、オブジェクトの構造が?ヘルプに載ってないのに、
  わかるんだ?ほんとは、どっかに載ってんだろ、
  隠さないで、教えな。

  だから、MSDNからです、サンプルを修正しただけって行ってるジャン。
  もし、調べたり、イメージ・構想が知りたかったら、
  デバックモードでとめて、
  ウォッチで変数名を指定して、中身を見るか、
  イミディエイトウインドウで? 変数名で表示してみるとか、、
  やってみてください。

  なんとなく、わかったような、かわされたような、、、

  ウォッチ・イミディエイトウインドウのイメージを
    hosoku/022/index.html
    にGIF画像で載せます。
  何かの参考になれば、、、

枠外解説・グチ --- 知識じゃなくて、調べ方が知りたい?

もう、いろいろなソフトやOSがここまで、大きくなってくると、
全てをオボエル?のは、不可能です(だと、おもいます)

Accessのフィールドのプロパティぐらいは、
なんとか全部知ってるけど(←うそです、見栄はってます)

次から次と、ソフト、出てくるし、バージョンアップするし、、、

単語の意味を知ってるのも、大事ですが、
辞書の引き方、調べ方の効率の良い方法を知りたいなぁ
と最近思います。

正直、MSDNも、いっぱい情報あって、うまい引き方がわからないです。
(今回、Outlook Express の方法が探せなかった)

う〜ん、、、長くなりそうなので、この話題も、機会があったら、続きを、、、

/*
 * 5.積み残し、残作業項目(食い残し)
*/
食後のイップク、、、と行きたいところですが、
まだまだ、食べ残しがあります。
ア.Outlook Express 
  Outlook Express のオブジェクトの作り方、
  構造がわからなかった。。
イ.階層が深いとき
  受信トレイにメールマガジン・個人関係・仕事関係・その他
  など、トレイの下にフォルダーを作成して、
  メールを管理している場合、対応していない
ウ.質問はAccessのリンクだったでしょ
  質問内容、読み返すと、
  Accessのリンクテーブルを作成して、
  リンクにして?直接参照したい
  みたいなこと書いてあったけど、
  私のやり方だと、データを取り出す?ぐらいはできそうだけど、、
エ.将来の自分のために
  送り主のメールアドレスを調べて、そのメールだけをAccessに
  インポート。
  または、ルールを付けて、件名に、「発注」が入っていたらなど。
  *また、一言いい?
   いいですよなんでも?
   Outlookのメール仕分け機能で、
   このアドレスだったら/この件名だったら、発注フォルダーに移動、
   って、やって、1つにまとめて、
   テメエが作った、メッセージ取りだしサンプルを改造すれば、
   できるんじゃないの、、自分で全部やらなくてもさ、、

/*
 * 6.終わりの挨拶
*/
今回、なんとなく?わかりましたか?
あまり、噛み砕いてないので、消化しにくいですが、
サンプルを実行して、処理を見ながら、1つ1つ食べてみてください。

オブジェクト参照で、いろいろ、面白そうな処理、できそうですね。
もっとオブジェクトやメソッドを研究すると、
登録されているアドレス帳を調べてメールを送る、、
なんて、悪い処理も作れそうですね。。

めずらしい食べ物(要望・質問)
や
調理方法(処理方法?)、味付けの方法(小技・テクニック?)
あったら、気軽に掲示板に。
*素人さんからのメール、料理の鉄人さんからのメール待ってます。

では、また。  かぜぎみで調子の悪い三流PGのKen3でした。

*テメエが調子悪いのは、いつもだろ、、、
 今日は、もう、かんべんしてね。。。
 (ヒマな人は、下のワク外通信も見てください)


ページフッター

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

リンクや広告など

項目別に本音?それとも建て前?的な記事をまとめました。

気になったジャンル↓を選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

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

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]