【環境】
OS:windows 7
OutLook:2010
*************メール内容******************
受付番号:00000001
[ ご予約 第1希望日 ] 2013/01/22 (火曜日)
[ 第1希望日時 ご希望時間 ] 8:20
*******************************
どうぞよろしくおねがいいたします。
以前に回答したものをカスタマイズしたものですが、
http://q.hatena.ne.jp/1301122126
下記で受信したメールを処理できました(Outlook2010 で検証)。
OutLook の VBE で ThisOutlookSession の下にコードを置いて受信してみてください。
Option Explicit '// 保存ファイルパス '//------------------ Const CSVファイルパス = "D:\予約メール.csv" Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 '//--------------------------------------------------- Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) '//--------------------------------------------------- Const 保存件名 = "保存したいタイトル名" ' このタイトルを含むメールを保存 Dim メール As MailItem Dim メールID As Variant For Each メールID In Split(EntryIDCollection, ",") Set メール = Session.GetItemFromID(メールID) If InStr(メール.Subject, 保存件名) > 0 Then CSVへ追記 メール.Body, メール.ReceivedTime End If Next End Sub '//--------------------------------------------------- Sub CSVへ追記(受信メッセージ, 受信時間) '//--------------------------------------------------- Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim CSVファイル If fso.FileExists(CSVファイルパス) Then Set CSVファイル = fso.OpenTextFile(CSVファイルパス, ForAppending) Else Set CSVファイル = fso.CreateTextFile(CSVファイルパス) CSVファイル.WriteLine "受付番号,予約希望,希望時間,受信日時" End If Dim 一行 Dim 受付番号 As String 受付番号 = "" Dim 予約希望 As String 予約希望 = "" Dim 希望時間 As String 希望時間 = "" For Each 一行 In Split(受信メッセージ, vbNewLine) If InStr(一行, "受付番号:") > 0 Then 受付番号 = Trim(Mid(一行, Len("受付番号:") + 1)) End If If InStr(一行, "[ ご予約 第1希望日 ]") > 0 Then 予約希望 = Trim(Mid(一行, Len("[ ご予約 第1希望日 ]") + 1)) End If If InStr(一行, "[ 第1希望日時 ご希望時間 ]") > 0 Then 希望時間 = Trim(Mid(一行, Len("[ 第1希望日時 ご希望時間 ]") + 1)) End If Next CSVファイル.WriteLine """" & 受付番号 & """,""" & 予約希望 & """,""" & 希望時間 & """,""" & 受信時間 & """" End Sub
--------------------------------------------------------------
コメントの関数を使用した修正コード
--------------------------------------------------------------
Option Explicit '// 保存ファイルパス '//------------------ Const CSVファイルパス = "D:\予約メール.csv" Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 '//--------------------------------------------------- Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) '//--------------------------------------------------- Const 保存件名 = "保存したいタイトル名" ' このタイトルを含むメールを保存 Dim メール As MailItem Dim メールID As Variant For Each メールID In Split(EntryIDCollection, ",") Set メール = Session.GetItemFromID(メールID) If InStr(メール.Subject, 保存件名) > 0 Then CSVへ追記 メール.Body, メール.ReceivedTime End If Next End Sub '//--------------------------------------------------- Sub CSVへ追記(受信メッセージ, 受信時間) '//--------------------------------------------------- Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim CSVファイル If fso.FileExists(CSVファイルパス) Then Set CSVファイル = fso.OpenTextFile(CSVファイルパス, ForAppending) Else Set CSVファイル = fso.CreateTextFile(CSVファイルパス) End If Dim 受付番号 As String Dim 予約希望 As String Dim 希望時間 As String 受付番号 = getText("受付番号:", 受信メッセージ) 予約希望 = getText("[ ご予約 第1希望日 ]", 受信メッセージ) 希望時間 = getText("[ 第1希望日時 ご希望時間 ]", 受信メッセージ) CSVファイル.WriteLine """" & 受付番号 & """,""" & 予約希望 & """,""" & 希望時間 & """,""" & 受信時間 & """" End Sub ' 値を取得する getText()関数を定義 Private Function getText(strTarget As String, strBody As String) As String Dim leng_s As Long ' 指定文字の開始位置 Dim leng_e As Long ' 指定文字の終了位置 leng_s = InStr(strBody, strTarget) ' 本文から指定文字の位置を返す If leng_s > 0 Then leng_s = leng_s + Len(strTarget) ' 文字の開始位置に文字数を足す leng_e = InStr(leng_s, strBody, vbCrLf) ' 指定文字の末尾から改行文字までの位置を返す strAns = Trim(Mid(strBody, leng_s, leng_e - leng_s)) ' 指定の文字間を切り取り、空白文字を削除 getText = Replace(strAns, vbTab, "") ' タブ文字を置換 Else getText = "" End If End Function
環境の違いと書きましたが OUTLOOK 2003、2007、2010の違いは なかったですね。
あとは OSによるものかもしれませんが それも影響は 少なそうな感じがします。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1251293197
こちらでは ちゃんと本文がとれているようですから。
Outlook 2007 受信メールの本文(一部)をCSVに書き出す
http://dot-town-lab.com/laboratory/item.php?id=32
> objItem.Subject = "注文メール"
ここを好きな件名に
ありがとう御座います。
実は上記サイトも参考にさせていただきました。
OUTLOOKを立ち上げた時に新着メールだけを追記していくということがしたかったのですが
わたしの能力では今回頂きましたサイトの内容をうまくカスタマイズできなかった為、
takntさんより頂いたURLのページ内容で頑張っておりまして。。。。
ご助言ありがとうございます。
もし可能でありましたら引き続きよろしくお願い致します。
以前に回答したものをカスタマイズしたものですが、
http://q.hatena.ne.jp/1301122126
下記で受信したメールを処理できました(Outlook2010 で検証)。
OutLook の VBE で ThisOutlookSession の下にコードを置いて受信してみてください。
Option Explicit '// 保存ファイルパス '//------------------ Const CSVファイルパス = "D:\予約メール.csv" Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 '//--------------------------------------------------- Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) '//--------------------------------------------------- Const 保存件名 = "保存したいタイトル名" ' このタイトルを含むメールを保存 Dim メール As MailItem Dim メールID As Variant For Each メールID In Split(EntryIDCollection, ",") Set メール = Session.GetItemFromID(メールID) If InStr(メール.Subject, 保存件名) > 0 Then CSVへ追記 メール.Body, メール.ReceivedTime End If Next End Sub '//--------------------------------------------------- Sub CSVへ追記(受信メッセージ, 受信時間) '//--------------------------------------------------- Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim CSVファイル If fso.FileExists(CSVファイルパス) Then Set CSVファイル = fso.OpenTextFile(CSVファイルパス, ForAppending) Else Set CSVファイル = fso.CreateTextFile(CSVファイルパス) CSVファイル.WriteLine "受付番号,予約希望,希望時間,受信日時" End If Dim 一行 Dim 受付番号 As String 受付番号 = "" Dim 予約希望 As String 予約希望 = "" Dim 希望時間 As String 希望時間 = "" For Each 一行 In Split(受信メッセージ, vbNewLine) If InStr(一行, "受付番号:") > 0 Then 受付番号 = Trim(Mid(一行, Len("受付番号:") + 1)) End If If InStr(一行, "[ ご予約 第1希望日 ]") > 0 Then 予約希望 = Trim(Mid(一行, Len("[ ご予約 第1希望日 ]") + 1)) End If If InStr(一行, "[ 第1希望日時 ご希望時間 ]") > 0 Then 希望時間 = Trim(Mid(一行, Len("[ 第1希望日時 ご希望時間 ]") + 1)) End If Next CSVファイル.WriteLine """" & 受付番号 & """,""" & 予約希望 & """,""" & 希望時間 & """,""" & 受信時間 & """" End Sub
--------------------------------------------------------------
コメントの関数を使用した修正コード
--------------------------------------------------------------
Option Explicit '// 保存ファイルパス '//------------------ Const CSVファイルパス = "D:\予約メール.csv" Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 '//--------------------------------------------------- Private Sub Application_NewMailEx(ByVal EntryIDCollection As String) '//--------------------------------------------------- Const 保存件名 = "保存したいタイトル名" ' このタイトルを含むメールを保存 Dim メール As MailItem Dim メールID As Variant For Each メールID In Split(EntryIDCollection, ",") Set メール = Session.GetItemFromID(メールID) If InStr(メール.Subject, 保存件名) > 0 Then CSVへ追記 メール.Body, メール.ReceivedTime End If Next End Sub '//--------------------------------------------------- Sub CSVへ追記(受信メッセージ, 受信時間) '//--------------------------------------------------- Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim CSVファイル If fso.FileExists(CSVファイルパス) Then Set CSVファイル = fso.OpenTextFile(CSVファイルパス, ForAppending) Else Set CSVファイル = fso.CreateTextFile(CSVファイルパス) End If Dim 受付番号 As String Dim 予約希望 As String Dim 希望時間 As String 受付番号 = getText("受付番号:", 受信メッセージ) 予約希望 = getText("[ ご予約 第1希望日 ]", 受信メッセージ) 希望時間 = getText("[ 第1希望日時 ご希望時間 ]", 受信メッセージ) CSVファイル.WriteLine """" & 受付番号 & """,""" & 予約希望 & """,""" & 希望時間 & """,""" & 受信時間 & """" End Sub ' 値を取得する getText()関数を定義 Private Function getText(strTarget As String, strBody As String) As String Dim leng_s As Long ' 指定文字の開始位置 Dim leng_e As Long ' 指定文字の終了位置 leng_s = InStr(strBody, strTarget) ' 本文から指定文字の位置を返す If leng_s > 0 Then leng_s = leng_s + Len(strTarget) ' 文字の開始位置に文字数を足す leng_e = InStr(leng_s, strBody, vbCrLf) ' 指定文字の末尾から改行文字までの位置を返す strAns = Trim(Mid(strBody, leng_s, leng_e - leng_s)) ' 指定の文字間を切り取り、空白文字を削除 getText = Replace(strAns, vbTab, "") ' タブ文字を置換 Else getText = "" End If End Function
早速ですみません。
> getText の先頭にブレークポイントを設定してメールを受信し
背景黄色→ メール = Session.GetItemFromID(メールID)
↓ F8
「実行時エラー'-2147221233(8004010f)':処理が失敗しました。オブジェクトがみつかりません。」
となりました。
【イミディエイト】
?Session(Enter)
Mapi
?メールID(Enter)
000000009A6A71664CD0E54892D9BE5698EEFC5724CD2000
となり、この「Session」や「メールID」は値がとれているようです。(素人でとれているという表現がただしいのかわかりませんが。。。)
ここに問題があるのだろうということくらいしかわからず
この後の対応方法が不明なんです。通常であればどのように問題点を切り分け解決にすすめていくのでしょう。。。
?メール(Enter)
エラーが発生します
内容は「実行時エラー'91'オブジェクト変数またはWith ブロック変数が設定されていません。」
以上が、イミディエイトで行った内容です。
ステップイン・ステップオーバー・ステップアウトいずれを行なっても同じ結果なんですね。
ここに問題があるのではと思い
「受付番号 = getText("受付番号:", CStr(受信メッセージ))」
受付番号を選択した状態で「クイックウォッチ」を実行
ウォッチリストに
式:受付番号 値:<対象範囲外> 型:Empty 対象:ThisOutlookSesseion.CSVへ追記
と出ています。
参考になるかわかりませんが、現状は以上になります。
コメント遅くなりました。
こちらでは現象が再現しないので、なかなか原因がわからないのですが、
2013/02/04 18:46:30 のコメントで提示されていた outputcsvのマクロ(VBS ではなく VBA ですよね?)単体で動かしたときは、上手く動いたんでしょうか。
これがちゃんと動くのであれば、起動時にこれを毎回動かしてあげるのも手かもしれません。
もっとも、イベント処理になると今回と同じ現象が出るかもしれませんが。
早速ですみません。
2013/02/07 15:54:29> getText の先頭にブレークポイントを設定してメールを受信し
背景黄色→ メール = Session.GetItemFromID(メールID)
↓ F8
「実行時エラー'-2147221233(8004010f)':処理が失敗しました。オブジェクトがみつかりません。」
となりました。
【イミディエイト】
?Session(Enter)
Mapi
?メールID(Enter)
000000009A6A71664CD0E54892D9BE5698EEFC5724CD2000
となり、この「Session」や「メールID」は値がとれているようです。(素人でとれているという表現がただしいのかわかりませんが。。。)
ここに問題があるのだろうということくらいしかわからず
この後の対応方法が不明なんです。通常であればどのように問題点を切り分け解決にすすめていくのでしょう。。。
?メール(Enter)
エラーが発生します
内容は「実行時エラー'91'オブジェクト変数またはWith ブロック変数が設定されていません。」
以上が、イミディエイトで行った内容です。
ステップイン・ステップオーバー・ステップアウトいずれを行なっても同じ結果なんですね。
ここに問題があるのではと思い
「受付番号 = getText("受付番号:", CStr(受信メッセージ))」
受付番号を選択した状態で「クイックウォッチ」を実行
ウォッチリストに
式:受付番号 値:<対象範囲外> 型:Empty 対象:ThisOutlookSesseion.CSVへ追記
と出ています。
参考になるかわかりませんが、現状は以上になります。
コメント遅くなりました。
2013/02/09 18:22:51こちらでは現象が再現しないので、なかなか原因がわからないのですが、
2013/02/04 18:46:30 のコメントで提示されていた outputcsvのマクロ(VBS ではなく VBA ですよね?)単体で動かしたときは、上手く動いたんでしょうか。
これがちゃんと動くのであれば、起動時にこれを毎回動かしてあげるのも手かもしれません。
もっとも、イベント処理になると今回と同じ現象が出るかもしれませんが。