私は、Outlook VBAで
[メールの作成 や 読み込みを行いたい]
/ [予定 アポやスケジュールを管理したい]
/ [仕事・タスクを登録したい]
/ [アドレス帳や連絡先を管理したい]
/ [HELPからOutlookのプロパティやメソッドを探りたい]
です。※目的の処理を選択してください。
まぁ、そんなに難しく考えないで、サンプルのソースを貼り付けて、遊んでみてください。
ファイル内ショートカット:
[メールなどデータの作成]
/[データを読み込む、データの指定方法]
/[拡張子.msgの取り扱い]
↑目的の処理を選択してください。
話が脱線したり、長くなってしまうけど
まずは、VBSからOutlookを起動してみた。
と言っても単純に
CreateObject("Outlook.Application")
で作成しただけです
'VBSからOutlook起動のテスト Dim oApp 'As Outlook.Application OutlookのApplication オブジェクトを入れる Dim myNameSpace 'As Outlook.NameSpace 名前のスペースと言われても、、 Dim myFolder 'As Outlook.Folder フォルダー指定 '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 とやりがちだけど '通常サイズ olNormalWindow=2 で表示(ほかに olMaximized=0,olMinimized=1) oApp.ActiveWindow.WindowState = 2 'olNormalWindow=2 を セット '終了確認 vbYesNo=4 で はいといいえを聞き、 If MsgBox("アウトルックを終了しますか?", 4) = 6 Then ' vbYes=6[はい]だったら閉じる oApp.Quit 'アウトルックを終了する End If
データ処理には、おおざっぱに書くと 読む と 書く の 2つがあると思います。
まずは、書く・作成からやってみたいと思います。
.CreateItem(種類)で、アイテムを作成して、あとはプロパティのセット、メソッド・処理の実行そんなパターンです。
'VBSからOutlook メールの作成をテスト Dim oApp 'As Outlook.Application OutlookのApplication オブジェクトを入れる Dim myNameSpace 'As Outlook.NameSpace 名前のスペースと言われても、、 Dim myFolder 'As Outlook.Folder フォルダー指定 '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 とやりがちだけど '通常サイズ olNormalWindow=2 で表示(ほかに olMaximized=0,olMinimized=1) oApp.ActiveWindow.WindowState = 2 'olNormalWindow=2 を セット 'ここからメールの作成 Dim mITEM 'As Outlook.MailItem 'メールアイテム 'CreateItemでメールアイテムの作成 Set mITEM = oApp.CreateItem(0) 'olMailItem=0 0メールアイテムを指定 mITEM.Display '編集画面表示 'データのセット mITEM.Subject = "件名はここにセット" mITEM.To = "test4@ken3.org" '宛先 mITEM.CC = "test5@ken3.org ; test6@ken3.org" 'CC セミコロンで複数アドレスは区切る mITEM.Body = "本文" & vbCrLf & "2行目" & vbCrLf & "xxxxx" '動作 'mITEM.Save '.Saveで保存下書きへ※テストなのでコメントにしました 'mITEM.Send '.Sendで送信※コメントを外すと送信されます
↑を実行すると、メールが作成されるので、テストしてみてください。
操作・試行錯誤の動画:[テスト動画]Outlook CreateItem(0) olMailItem=0 でメールアイテムを作成
CreateItem:各CreateItemのテストは下記(リンク先)を見てください
先輩やQA掲示板の先生達に
下記のコード1行をイミディエイトに打ち込んで確認してみてください
ActiveInspector.Width = 800
と言われたら?
いきなり、経験者・自分たちの目線で話したけど、
?の人、初めての人は何言ってんだコイツと、あせると思います。
動画の手順が参考になれば・・・[https://youtu.be/Hti2Ybi2R14?t=78]
先輩やQA掲示板の先生達に
「ウォッチ式で確認して」と言われたら
動画の手順が参考になれば・・・[https://youtu.be/9qlahSwozo8?t=109]
新規作成ができたら、次は 読み込み(データの取得・選択)です
Outlookのアイテム(メール、連絡先、仕事、予定...)
は、
フォルダーの下にぶら下がってます。
私がサンプルでよく使っている、受信トレイの指定
.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
ですが、この渡している6は
OlDefaultFolders 列挙 をヘルプで見ると、
下記の値 フォルダ タイプ を 指定することができます。
名前 | 値 | 説明 |
---|---|---|
olFolderCalendar | 9 | 予定表フォルダ。 |
olFolderConflicts | 19 | 競合フォルダ (同期の失敗フォルダのサブフォルダ)。Exchange アカウントの場合のみ。 |
olFolderContacts | 10 | 連絡先フォルダ。 |
olFolderDeletedItems | 3 | 削除済みアイテム フォルダ。 |
olFolderDrafts | 16 | 下書きフォルダ。 |
olFolderInbox | 6 | 受信トレイ フォルダ。 |
olFolderJournal | 11 | 履歴フォルダ。 |
olFolderJunk | 23 | 迷惑メール フォルダ。 |
olFolderLocalFailures | 21 | ローカルの失敗フォルダ (同期の失敗フォルダのサブフォルダ)。Exchange アカウントの場合のみ。 |
olFolderManagedEmail | 29 | 管理対象のフォルダ グループの最上位フォルダ。管理対象のフォルダについて詳しくは、Microsoft Office Outlook のヘルプを参照。Exchange アカウントの場合のみ。 |
olFolderNotes | 12 | メモ フォルダ。 |
olFolderOutbox | 4 | 送信トレイ フォルダ。 |
olFolderSentMail | 5 | 送信済みアイテム フォルダ。 |
olFolderServerFailures | 22 | サーバーの失敗フォルダ (同期の失敗フォルダのサブフォルダ)。Exchange アカウントの場合のみ。 |
olFolderSyncIssues | 20 | 同期の失敗フォルダ。Exchange アカウントの場合のみ。 |
olFolderTasks | 13 | 仕事フォルダ。 |
olFolderToDo | 28 | To Do フォルダ。 |
olPublicFoldersAllPublicFolders | 18 | Exchange パブリック フォルダ ストア内の All Public Folders フォルダ。Exchange アカウントの場合のみ。 |
olFolderRssFeeds | 25 | RSS フィード フォルダ。 |
フォルダーのオブジェクト .GetDefaultFolder で 取得したら、
.Display で 画面に表示しています。
指定したフォルダーの下にアイテムやサブフォルダーが存在するので、
.Items.Count でアイテム数
.Items(n) で取り出したり、
.Folders("名前") で サブフォルダーを指定したり、
.Folders.Count で サブフォルダーの数がわかるので、
ループで回して、
.Folders.Item(n) で n番目のフォルダーを使用したり。
下記、いつもの、右往左往している、怪しい実演動画です(笑)
[Youtubeで見る]
テストで作ったコードは、
'フォルダーとその下のアイテムを探る。。。Outlook2007でテスト
Sub tset() Dim oNamespace As NameSpace Dim oFolder As Outlook.Folder 'フォルダー Dim mITEM As Outlook.MailItem 'メールアイテム Dim n As Integer 'ループのカウンター Dim subFolder As Folder 'サブフォルダー1つ下を探る Dim c As Integer 'フォルダのループカウンタ ' NameSpace オブジェクトへの参照を取得します。 Set oNamespace = Application.GetNamespace("MAPI") ' 既定のフォルダへの参照を取得し、フォルダを表示します。 Set oFolder = oNamespace.GetDefaultFolder(olFolderInbox) '受信トレイを指定 oFolder.Display '選択したフォルダーの表示 'Set Application.ActiveExplorer.CurrentFolder = oFolder 'フォルダーの下には ITEMここではメール と サブフォルダーが存在します '受信トレイ直下のアイテム・メールの件名を表示 'メール数分ループ Debug.Print "メールの数は " & oFolder.Items.Count For n = 1 To oFolder.Items.Count 'アイテム数分ループ Set mITEM = oFolder.Items(n) '↑代入が終わったので、各プロパティに mITEM.XXXX で アクセスする Debug.Print "件名:" & mITEM.Subject '件名表示 Next Debug.Print "---" 'サブフォルダー Debug.Print "サブフォルダーの数は " & oFolder.Folders.Count Debug.Print "---" For c = 1 To oFolder.Folders.Count 'サブフォルダーの数だけループする Set subFolder = oFolder.Folders.Item(c) 'c番目のフォルダーを代入 Set Application.ActiveExplorer.CurrentFolder = subFolder '移動 'サブフォルダーのメール数分ループ Debug.Print "サブフォルダ名: " & subFolder.Name & " には、" Debug.Print "メールが " & subFolder.Items.Count & "通" For n = 1 To subFolder.Items.Count 'アイテム数分ループ Set mITEM = subFolder.Items(n) '↑代入が終わったので、各プロパティに mITEM.XXXX で アクセスする Debug.Print "件名:" & mITEM.Subject '件名表示 Next Debug.Print "---" Next '使用したオブジェクトの解放 = Nothing Set mITEM = Nothing Set subFolder = Nothing Set oFolder = Nothing Set oNamespace = Nothing End Sub
一般的に受信トレイにサブフォルダーを作りメールを保存していると思います。
サブフォルダーのデータを取り出す方法としてイロイロな処理方法があるのですが、
下記サブフォルダーの探り方のサンプルです。
再帰処理で全てのフォルダーを処理
ソースコードと簡単な解説は
[Outlook2007 VBA 再帰処理で全てのフォルダーに触ってみる]
を見てください。
サブフォルダー名を指定して読み込む
ソースコードと簡単な解説は
[Outlook指定したサブ フォルダー名のメールをExcelで取得したい]
を見てください
アイテムデータ(メールや連絡先など)を読み込む
その他、Outlookのサンプルは、
・[メールを読む]
↑などを見てください。
※その他、サンプルとリンクの工事中(近日修正・作成予定)
フォルダーの下のアイテムを検索するには、
モロ DB処理に似ていて(フィルター処理に似ているかなぁ)
Set oITEM = oFolder.Items.Find("[項目] = '値'")
で探すことができそうです。
検索されたか?データ取得の確認は、
If Not oITEM Is Nothing Then 'オブジェクトの中身が入ってれば
でチェックすることができます。
複数ヒットする可能性がある時は、Items.FindNext あたりが使えそうです。
操作・試行錯誤の動画:Outlook VBA 連絡先 更新方法 と アドレスでITEMを検索する方法
コードは↓
[XXXXXさんへ Outlook VBA 連絡先 更新方法 と アドレスでITEMを検索する方法]
↑などを見てください。
Outlookで現在選択されているアイテムを知るには、
ActiveExplorer.Selection
から探るといいかも。
? Application.ActiveExplorer.Selection.Count
で、1や2など、選択されているアイテムの数がわかります。
あとは、.ITEM(n)でn番目に選択されているアイテムにたどり着くことができます。
? typename(Application.ActiveExplorer.Selection.Item(1))
MailItemあとは、目的(使用したいアイテム)の型を宣言して
Dim cITEM As ContactItem '連絡先
Dim tITEM As TaskITEM 'タスク、仕事
Dim mITEM As MailItem 'メール アイテム
Dim aITEM As AppointmentItem '予定、アポ アイテム
みたいに、型宣言すると、プロパティやメソッドが探りやすいです。
操作・試行錯誤の動画:[テスト動画]Outlook VBA 現在選択されているアイテムを探る テスト
実際の応用例 と コードは↓
Outlook VBA 選択された連絡先の氏名+フリガナを使い、仕事を作成
https://ken3memo.hatenablog.com/entry/20120214/1329185640
↑を見てください。
Outlook アイテムをドラックandドロップで投げると.msgが作られる
アイテムの拡張子が全て.msg?で紛らわしいけど。
[操作動画 Outlook アイテムをドラックandドロップで投げる]
Outlookのアイテムをドラックandドロップでデスクトップに投げると、
XXXX.msgの拡張子でファイルが作られます。
これ↑を逆にデスクトップからoutlookに ドラックandドロップで投げると、
アイテムが追加されます。
メール、連絡先、予定表、仕事...が全て 拡張子.msgなので、
わかりにくいのですが(なぜアイコンだけが変化・区別しているのか不明だけど)
上記の操作で、簡易的な データの受け渡し、インポート機能として使えるかなぁ
例)担当の連絡先を引き継ぐ場合、連絡先からデスクトップにアイテムをなげ、USBなどで渡す
※USBのデータ渡しは 消し忘れの紛失が怖いし社内規定でNGのところもあるか
だまされたと思って、一度、デスクトップにアイテムを ぶん投げて 遊んでみてください。
拡張子が .msg の Outlookアイテムファイル
は、.OpenSharedItem("ファイル名")で簡単に取り込めるみたいです。
が、読み込み後、フォルダーの指定でエラーが発生してしまう。。。
(なんか、単純ミスのような気もしますが、コードとテスト動画を見てアレンジしてください)
テストの動画: [VBA OpenSharedItemで.msgの取り込みテスト]
作成したコード:
苦肉の策・強引に On Error Resume Next ですすめてますが・・・
'.msgを読み込むテスト Outlook2007でテスト
Sub read_msg() Dim oNamespace As NameSpace Dim oItem As Object 'アイテム .msgから読み込みセット Dim oFolder As Folder 'フォルダー ' NameSpace オブジェクトへの参照を取得します。 Set oNamespace = Application.GetNamespace("MAPI") ' 既定のフォルダ 参照を取得し、フォルダを表示します。 Set oFolder = oNamespace.GetDefaultFolder(6) 'olFolderInbox=6 oFolder.Display ' .msg ファイルを開きます。.OpenSharedItemで取り込み Set oItem = oNamespace.OpenSharedItem("F:\TEMP\AAAAA.msg") 'テストで↑USBメモリなどから固定の名前を読み込む 'oItem.Display '読み込んだアイテムを表示(いらない) On Error Resume Next 'エラーを無視して次の行へ '下記のMOVEで同じフォルダーだとエラーが発生?するので、苦肉の策 oItem.Move oFolder '読み込んだ アイテムを指定したフォルダーへ 'On Error GoTo 0 'エラー無視を解除(エラーをここから下は表示) '使用したオブジェクトの解放 = Nothing Set oItem = Nothing Set oFolder = Nothing Set oNamespace = Nothing End Sub
xxxxITEMを.msgファイルとして、書き出すには、
.SaveAs パス+ファイル名, タイプ(olMSG=3やolTXT=0など)
で書き出すことができます。
(コードとテスト動画を見てアレンジしてください)
テストの動画: [Outlook VBA .SaveAsでアイテムを書き出す]
作成したコード:
'アイテムの書き出し .SaveAs ファイルの場所, olmsg で書き出す
Sub write_msg_test() Dim oNamespace As NameSpace Dim oFolder As Outlook.Folder 'フォルダー Dim cITEM As Outlook.ContactItem '連絡先アイテム Dim n As Integer 'ループのカウンター Dim strFILENAME As String ' NameSpace オブジェクトへの参照を取得します。 Set oNamespace = Application.GetNamespace("MAPI") ' 既定のフォルダへの参照を取得し、フォルダを表示します。 Set oFolder = oNamespace.GetDefaultFolder(olFolderContacts) '連絡先を指定 oFolder.Display '選択したフォルダーの表示 'Set Application.ActiveExplorer.CurrentFolder = oFolder 'フォルダーの下 アイテムを.SaveAs で 書き出す '連絡先の数分ループ Debug.Print "連絡先の数は " & oFolder.Items.Count For n = 1 To oFolder.Items.Count 'アイテム数分ループ Set cITEM = oFolder.Items(n) '変数に代入 '↑代入が終わったので、cITEM.XXXX で メソッド(動作)の実行 strFILENAME = "F:\TEMP\連絡先" & n & ".msg" 'ファイル名をフォルダー+連絡nの連番 にする cITEM.SaveAs strFILENAME, olMSG 'olMSG=3やolTXT=0など書き出すタイプを指定する Next '使用したオブジェクトの解放 = Nothing Set cITEM = Nothing Set oFolder = Nothing Set oNamespace = Nothing End Sub
ページが長くなってしまったので、目的別に分割してしまいました。
分割前の方が全体を一度に見れるので、もしかしたら変更前がよかったかも?と思いつつ、
※(分割前の記事は[20120214分割前のOutlook記事]です(見比べてみてください))
下記のように記事を分割してみました
ここまで、読んでいただきどうもです。ここから下は、広告と三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
とても急ぎで連絡がほしい、そんな時は:
[YouTubeの動画にコメントする]※通知が届くので気が付きやすいです
[twitterでDMを送る]かなぁ。※最近DMの通知が表示されなかったり、20件制限などがあるし・・
気軽に連絡してください。何か連絡手段を考えないとなぁ・・・
三流君の[Outlookヘルプの探り方]でオブジェクト、プロパティやメソッドの探り方を少し書いてみたり、
ken3memo : Outlook関係の→
[メモ・記事をチェック] /
[ブックマークを見る] /
[アウトルックの動画解説へ]
で、まとめてみたり※↑まとまってないじゃん、放り込んだだけでしょ・・・
Menu :
[Outlook操作(TOP)] /
[VBA(TOP)] /
[三流君(TOP)]