私は、Outlook VBA で
[メールの作成 や 読み込みを行いたい ]
/ [予定 アポやスケジュールを管理したい ]
/ [仕事・タスクを登録したい ]
/ [アドレス帳や連絡先を管理したい ]
/ [HELPからOutlookのプロパティやメソッドを探りたい ]
です。※目的の処理を選択してください。
ken3memo : Outlook関係の→
[メモ・記事をチェック ] /
[アウトルックの動画解説へ ]
全ての質問には、答えられませんが、リクエストや質問 があったら、[作者(三流君)に質問する ] から 気軽に送ってください
[三流君(TOP) ] / [VBA(TOP) ] / [Outlook操作(TOP) ]
三流君 Outlook Mail メールを操作する
まぁ、そんなに難しく考えないで、ソースを貼り付けて、遊んでみてください。
Excel など から Set oApp = CreateObject("Outlook.Application") で オブジェクトを作り、コントロールしてます。
#MailItem
As MailItem
MailItem オブジェクト
http://msdn.microsoft.com/ja-jp/library/cc359390.aspx
↑MSDNを参考にして、プロパティやメソッドを探ったり、
[メールの作成へ ]/[メールを読む ]
#CreateItem
メールの作成
次にメールを新規に作りたいと思います。
'メールを作成する Excel2003 Outlook2003 でテストしました
Option Explicit
Sub MAKE_MAIL_ITEM_TEST_NG()
Dim oApp As Object
Dim myNameSpace As Object
Dim myFolder As Object
Dim objMAIL As Object 'メールのオブジェクト
Dim strMOJI As String '本文
'outlook 起動
Set oApp = CreateObject("Outlook.Application")
Set myNameSpace = oApp.GetNamespace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
myFolder.Display '表示 いつものクセで .Visible = True とやりがちだけど
'メールアイテムの作成
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、
objMAIL.Display '画面表示(Mail入力、編集画面を表示)
'宛先・件名・本文 などのデータを代入する
objMAIL.To = "test@ken3.org" '宛先 ほかに.cc や.Bccも可能です
'objMAIL.CC = "vba@ken3.org" '宛先 .cc
'objMAIL.BCC = "vba@ken3.org ; oltest@ken3.org" '宛先を複数は ; セミコロンで区切る
objMAIL.Subject = "テスト メールの件名です " '.Subjectに文字列設定で件名
'本文を作る、(vbCrLfで改行されます)
strMOJI = "こんにちは(このメールtestアドレスなので質問は別便で)" & vbCrLf _
& " ここで 文字列を作って .Bodyに代入する" & vbCrLf _
& " メールアイテムが作成されたらその後、 " & vbCrLf _
& " .save 下書きへ保存 や .sendで送信(確認が出る)" & vbCrLf _
& " 今回は、.Display で メール作成画面を表示" & vbCrLf _
& Now() & "作成"
objMAIL.Body = strMOJI '本文の代入
'添付ファイルを送りたいって? そんな時は、.Attachments.Add "ファイル名"
'objMAIL.Attachments.Add "e:\work\test.txt" '本当はファイルの存在チェックも事前にしたいけど
'objMAIL.Attachments.Add "e:\work\作業報告書.xls" '複数送りたかったら、再度.Addしてね
objMAIL.Display '編集画面のまま止めておきたい時 や テスト中に動作を見たいとき
objMAIL.Save '保存、下書きへ 保存後、用が無かったら.Closeで閉じるのがいいのかなぁ。。。
'objMAIL.Close 2 '閉じる Mailの編集画面を閉じる
'objMAIL.Send '送信箱へ ※セキュリティの警告メッセージが出るよ
'ここで、普通はオブジェクトの開放など、後始末をする。
End Sub
過去のメルマがで三流解説もしてました。
[No.55 Outlookを操作してメールを送りたい]
[No.56 Outlookから複数のアドレスにBCC送信]
[No.78 Outlookでファイルを添付するには?.Attachments.Add]
[No.169 Outlookで複数のファイルを添付するには?]
[No.183 Outlook リッチテキスト形式のメール で グラフを送る]
[AccessサブフォームのデータをOutlook本文に転記する ]
↑CreateObject("Outlook.Application")後に、
.Visible = Trueとやりたいところだけど、
規定のフォルダーを.Displayで表示したり、
あとは空のメールスペースをSet objMAIL = oApp.CreateItem(olMailItem)で作ってから、
あて先(.to) や 件名題名(.Subject) 本文(.Body) 中身をセットして、
次のアクション(メソッド)を発行する感じかなぁ?
複数送信のサンプル:下記、ExcelからOutlook のメールを作成したサンプルです。
[複数事前登録されたアドレスへ メールを送信する ]
[期限まで未回答の人に督促メールをまとめて送信 ]
↓試行錯誤の動画です。見てダメっぷりを笑ってください。
[テスト VBA Outlook メールの作成をテストした ](画像が悪いけど・・)
Outlookの親切な強制改行を止めたい
余談ですが、広告コードをBlogに簡単にUPしたくて、Blogのメール投稿機能を使うことを考えました。
広告コードをVBAで置き換えて自動送信するイメージで。普通に作ったらハマりました。どこでハマったかと言うと、vbCrLfを入れていないのに自動で改行され 長いためか、広告用のリンクコードが途中できれてしまいました。
(親切に設定した文字数でOutlookが改行してくれます。オプションで文字数を増やそうとしたら最大値が132文字でした。これだと、長い文字数の広告リンクコード が途中で切れてしまいます。)
少々危険を感じつつ、↓下記のリンクを見て、レジストリを書き換えて対応しました
[[BUG] Outlook 2003 で電子メール メッセージを送信したときに、想定した位置で行が折り返さない ]
↑データや長い文章をOutlook本文 文字列で送りたい場合はここに注意してください。
※以上、広告職人の余談でした・・・(最近はBlogに機械的な広告は効果なしですが)
↓[レジストリに WrapLinesを変更 PlainWrapLenを設定 ](画像が悪いけど・・)
#Folder
メールを読む
メールの作成ができたら、次は、受信したメールに対して処理を行いたい、そんな流れだと思います。。。
'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
↑をそのまま実行すると、セキュリティのエラーがでるし・・・(涙)
エラーの画像:
↑ここで、1分や2分・・を選択するとうまくデータを取ることができます・・・
↓サンプル実行結果の動画
Excel VBA から OutLookを起動して 受信メールを1つ1つ取り出す
↑三流解説 [え〜と] And [こんな感じ] の音声付き(笑)
セキュリティ関係でハマる
VBA Outlook で
メール.body で 値を参照しようとしただけで、 (MsgBox "本文" & objMAIL.Body)
----
プログラムが Outlook 内に保存されている電子メールアドレスに アクセスしようとしています。よろしいですか?
これが予期しない動作である場合は、[いいえ]をクリックしてください。 このプログラムがウイルスである可能性があります。
----
またまた、ハマったなぁ・・・
VBA Outlook 操作 .Body 参照でエラー
http://ken3-info.blog.ocn.ne.jp/code_gomibako/2009/02/vba_outlook_bod_c69d.html
↑実行した失敗ソースはここに載せときます。
証拠VTR動画は↓
Outlook 操作の失敗 動画
サンプルコードのリンク
概要を見て、おっ、と感じたらタイトルのリンク先に飛んで読んでください
何かの参考となれば、幸いです
概要とリンク先
[No.55 Outlookを操作してメールを送りたい]
Set oApp = CreateObject("Outlook.Application")
で、Outlookのアプリケーションを操作するためのオブジェクトを作成してます。
次に、メールアイテムを
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
で作成して、データをメールアイテムにセットする
objMAIL.To = "test@ken3.org" '宛先
objMAIL.Subject = "テストメールです" '件名
objMAIL.Body = strMOJI '本文の代入
セット後、.Displayで編集画面を表示したり、.Sendで送信したり
[No.56 Outlookから複数のアドレスにBCC送信]
やりたいことは、BCCで複数の宛先を指定することなので、
Dim strBCC As String 'BCC宛先の変数を定義
'文字列で宛先を作る
strBCC = "test@ken3.org ; excel@ken3.org ; access@ken3.org"
objMAIL.BCC = strBCC '宛先の文字列を渡す
なんて感じで、;セミコロン区切りの文字列を.BCCにセットしただけです
[No.78 Outlookでファイルを添付するには?.Attachments.Add]
Attachmentsオブジェクトのヘルプをみて、.Addを探り
objMAIL.Attachments.Add "e:\work\test.txt"
なんて感じで、.Attachments.Add ファイルのパスで添付ファイルをセットしました
[No.101 Outlookの重要度フラグ .Importance = olImportanceHigh]
送信メールの「重要度フラグ」をプログラム(VB)で操作することは可能なのでしょうか??
と質問をもらい、Importance プロパティを発見する
myitem.Importance = olImportanceHigh とセットしてみました。
使用できる定数は(重要度のフラグは)
olImportanceHigh olImportanceLow olImportanceNormal でした。
[No.161 Outlook VBAでフラグ作成 .FlagStatus .FlagRequest .FlagDueBy]
メールにフラグを作成したかったので、
objMAIL.FlagStatus = 2 'olFlagMarked (2)をセット参照設定時は定数で
objMAIL.FlagRequest = "CD返却の件連絡ください" 'フラグ内容をセット
objMAIL.FlagDueBy = DateAdd("d", 5, Now) '期限は5日後をセット
とフラグ関係のプロパティに値をセットしただけでした。
サンプルの実行結果は↓
[No.169 Outlookで複数のファイルを添付するには?]
Dir関数を使用して複数のファイル名を取得して、添付ファイルを作成しました。
strBASEPATH = "C:\Documents and Settings\user2000\My Documents\"
strFILETYPE = "*.xls" 'マッチングパターン
strFileName = Dir(strBASEPATH & strFILETYPE) 'DIR関数にPATH+*.xlsを渡す
'↑すると、一番最初の名前が返ってくる(順不同)
'名前がなくなるまでループ
While strFileName <> "" 'ファイル名が""空文字以外の間ループする
'ファイル名を使って処理を行う
'↓1つ1つ添付する ↓↓パス+ファイル名を渡す
objMAIL.Attachments.Add strBASEPATH & strFileName
'↓次の名前の処理に移るには、Dir関数を引数無しで呼び出します
strFileName = Dir '←引数無しで次のパターンを取り出せる
Wend
'↑こんな感じでループを作って1つ1つファイルを処理してみました。
[No.171 Outlook VBA 受信MailにフラグをSET .Folders .Itemsを探る]
.Folders .Itemsを使い、受信トレイからメールアイテムを取り出し、受信済みのメールにフラグをセットしてみました。
下記、メールアイテムをリストボックスへセットするサンプルです
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
[No.183 VBA Outlook リッチテキスト形式のメール で グラフを送る]
メールの形式を指定したかったので、
objMAIL.BodyFormat = 3 'olFormatRichText=3 で リッチテキスト形式へ
とプロパティをセットして、リッチテキスト形式にしました。
次に、Excelのグラフをコピーしたかったので、
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.ChartArea.Select
Application.CutCopyMode = False
ActiveChart.ChartArea.Copy
で、コピーしました(単にマクロ記録で記録しました。)
貼り付け の コマンドを実行したかったので、
Set oCBs = objMAIL.GetInspector.CommandBars
でコマンドバーを取り出し、
Set oCtl = oCBs.FindControl(, I)
を If oCtl.Caption = "貼り付け(&P)" で 探し、
oCtl.Execute '↑で見つけた oCtl 貼り付けコマンド(outlook)を実行
でも、なんか動作が不安定です。。。
[#QA_MESSAGE ][ページ内のTOPへ戻る ]
ページフッター
ここまで、読んでいただきどうもです。ここから下は、広告と三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
三流君へ メッセージを送る
感想や質問・要望・苦情など 三流君へメッセージを送る。
とても急ぎで連絡がほしい、そんな時 は:
[YouTubeの動画にコメントする ]※通知が届くので気が付きやすいです
[twitterでDMを送る ]かなぁ。※最近DMの通知が表示されなかったり、20件制限などがあるし・・
気軽に連絡してください。何か連絡手段を考えないとなぁ・・・
Outlook VBA 情報を Googleで検索する
Outlook アイテム別の操作
[Mail ]でメールを作成したり読み込んだり
[Task ]で仕事・タスクを登録したり
[Appointment ]予定表 アポ・スケジュールの登録ほか
[Contact ]連絡先でアドレスや名簿管理
三流君の[Outlookヘルプの探り方 ]でオブジェクト、プロパティやメソッドの探り方を少し書いてみたり、
ken3memo : Outlook関係の→
[メモ・記事をチェック ] /
[ブックマークを見る ] /
[アウトルックの動画解説へ ]
で、まとめてみたり※↑まとまってないじゃん、放り込んだだけでしょ・・・
Menu :
[Outlook操作(TOP) ] /
[VBA(TOP) ] /
[三流君(TOP) ]