私は、Outlook VBA
[メールの作成 や 読み込みを行いたい] / [予定 アポやスケジュールを管理したい] / [仕事・タスクを登録したい] / [アドレス帳や連絡先を管理したい] / [HELPからOutlookのプロパティやメソッドを探りたい]
です。※目的の処理を選択してください。


ken3memo : Outlook関係の→ [メモ・記事をチェック] / [アウトルックの動画解説へ]
全ての質問には、答えられませんが、リクエストや質問があったら、[作者(三流君)に質問する] から 気軽に送ってください [三流君(TOP)] / [VBA(TOP)] / [Outlook操作(TOP)]



三流君VBAでOutlookを操作する

まぁ、そんなに難しく考えないで、サンプルのソースを貼り付けて、遊んでみてください。

ファイル内ショートカット:
[メールなどデータの作成] /[データを読み込む、データの指定方法] /[拡張子.msgの取り扱い]
↑目的の処理を選択してください。

スタート・起動 CreateObject("Outlook.Application")で作成

話が脱線したり、長くなってしまうけど
まずは、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

実行結果:[テスト動画]VBSでOutlookを起動
#CreateITEM

データの作成

データ処理には、おおざっぱに書くと 読む書く の 2つがあると思います。
まずは、書く・作成からやってみたいと思います。

CreateITEMで各アイテムの作成

.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 でメールアイテムを作成

各ITEMタイプ別のサンプル

CreateItem:各CreateItemのテストは下記(リンク先)を見てください

  1. メールは[MailItem]でメールを作成
  2. 予定表は[AppointmentItem]を使い、アポ・スケジュールの登録
  3. タスクは[TaskItem]で仕事・タスクを登録したり
  4. 連絡先は[ContactItem]でアドレス帳や配布リストの管理


Outlookのコードを質問した時に「イミディエイトにコードを貼り付けて確認して」と言われたら

先輩やQA掲示板の先生達に
下記のコード1行をイミディエイトに打ち込んで確認してみてください
ActiveInspector.Width = 800
と言われたら?

いきなり、経験者・自分たちの目線で話したけど、
?の人、初めての人は何言ってんだコイツと、あせると思います。
動画の手順が参考になれば・・・[https://youtu.be/Hti2Ybi2R14?t=78]


Outlookのコードを質問した時に「ウォッチ式で確認して」と言われたら

先輩やQA掲示板の先生達に
ウォッチ式で確認して」と言われたら
動画の手順が参考になれば・・・[https://youtu.be/9qlahSwozo8?t=109]


#Read

Folder関係 データを読み込む、イロイロなデータの指定方法

新規作成ができたら、次は 読み込み(データの取得・選択)です

Outlookのアイテム(メール、連絡先、仕事、予定...)
は、
フォルダーの下にぶら下がってます。

フォルダーの指定は、.GetDefaultFolder で 指定すると便利です

私がサンプルでよく使っている、受信トレイの指定 .GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
ですが、この渡している6は
OlDefaultFolders 列挙 をヘルプで見ると、
下記の値 フォルダ タイプ を 指定することができます。

名前説明
olFolderCalendar9予定表フォルダ。
olFolderConflicts19競合フォルダ (同期の失敗フォルダのサブフォルダ)。Exchange アカウントの場合のみ。
olFolderContacts10連絡先フォルダ。
olFolderDeletedItems3削除済みアイテム フォルダ。
olFolderDrafts16下書きフォルダ。
olFolderInbox6受信トレイ フォルダ。
olFolderJournal11履歴フォルダ。
olFolderJunk23迷惑メール フォルダ。
olFolderLocalFailures21ローカルの失敗フォルダ (同期の失敗フォルダのサブフォルダ)。Exchange アカウントの場合のみ。
olFolderManagedEmail29管理対象のフォルダ グループの最上位フォルダ。管理対象のフォルダについて詳しくは、Microsoft Office Outlook のヘルプを参照。Exchange アカウントの場合のみ。
olFolderNotes12メモ フォルダ。
olFolderOutbox4送信トレイ フォルダ。
olFolderSentMail5送信済みアイテム フォルダ。
olFolderServerFailures22サーバーの失敗フォルダ (同期の失敗フォルダのサブフォルダ)。Exchange アカウントの場合のみ。
olFolderSyncIssues20同期の失敗フォルダ。Exchange アカウントの場合のみ。
olFolderTasks13仕事フォルダ。
olFolderToDo28To Do フォルダ。
olPublicFoldersAllPublicFolders18Exchange パブリック フォルダ ストア内の All Public Folders フォルダ。Exchange アカウントの場合のみ。
olFolderRssFeeds25RSS フィード フォルダ。

フォルダーのオブジェクト .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のサンプルは、
・[メールを読む]
↑などを見てください。
※その他、サンプルとリンクの工事中(近日修正・作成予定)

目的のデータを Folder.Items.Findで検索する

フォルダーの下のアイテムを検索するには、
モロ DB処理に似ていて(フィルター処理に似ているかなぁ)
Set oITEM = oFolder.Items.Find("[項目] = '値'")
で探すことができそうです。

検索されたか?データ取得の確認は、
If Not oITEM Is Nothing Then 'オブジェクトの中身が入ってれば
でチェックすることができます。

複数ヒットする可能性がある時は、Items.FindNext あたりが使えそうです。

操作・試行錯誤の動画:Outlook VBA 連絡先 更新方法 と アドレスでITEMを検索する方法



コードは↓
[XXXXXさんへ Outlook VBA 連絡先 更新方法 と アドレスでITEMを検索する方法]
↑などを見てください。

ActiveExplorer.Selection で現在選択されているアイテムを知る

Outlookで現在選択されているアイテムを知るには、
ActiveExplorer.Selection
から探るといいかも。
? Application.ActiveExplorer.Selection.Count
で、1や2など、選択されているアイテムの数がわかります。
あとは、.ITEM(n)でn番目に選択されているアイテムにたどり着くことができます。

1番目の選択されたアイテムを取り出してみます

? typename(Application.ActiveExplorer.Selection.Item(1))

MailItem
など、.Item(1)をTypeName関数で探ると、型の名前が返ってきます。

あとは、目的(使用したいアイテム)の型を宣言して
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

↑を見てください。


#MsgFILE

Outlook アイテムは拡張子が全て.msg?

Outlook アイテムをドラックandドロップで投げると.msgが作られる
アイテムの拡張子全て.msg?で紛らわしいけど。

[操作動画 Outlook アイテムをドラックandドロップで投げる]

Outlookのアイテムをドラックandドロップでデスクトップに投げると、
XXXX.msgの拡張子でファイルが作られます。

これ↑を逆にデスクトップからoutlookに ドラックandドロップで投げると、
アイテムが追加されます。

メール、連絡先、予定表、仕事...が全て 拡張子.msgなので、
わかりにくいのですが(なぜアイコンだけが変化・区別しているのか不明だけど)
上記の操作で、簡易的な データの受け渡し、インポート機能として使えるかなぁ

例)担当の連絡先を引き継ぐ場合、連絡先からデスクトップにアイテムをなげ、USBなどで渡す
  ※USBのデータ渡しは 消し忘れの紛失が怖いし社内規定でNGのところもあるか

だまされたと思って、一度、デスクトップにアイテムを ぶん投げて 遊んでみてください。

.msg ファイル を .OpenSharedItem で 取り込み

拡張子が .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

.SaveAsでolMSGを指定して、書き出し .MSGファイルを作成

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記事]です(見比べてみてください))
下記のように記事を分割してみました

  1. メールの読み書きをしたい時は[MailItem]でメールを作成したり読み込んだり
  2. 予定表は[AppointmentItem]を使い、アポ・スケジュールの登録
  3. 仕事系は[TaskItem]で仕事・タスクを登録したり
  4. 連絡先は[ContactItem]でアドレス帳や配布リストの管理
  5. HELPなどで[Outlookのプロパティやメソッドを探りたい]


[#QA_MESSAGE][ページ内のTOPへ戻る]

ページフッター

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



三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
とても急ぎで連絡がほしい、そんな時は: [YouTubeの動画にコメントする]※通知が届くので気が付きやすいです
[twitterでDMを送る]かなぁ。※最近DMの通知が表示されなかったり、20件制限などがあるし・・
気軽に連絡してください。何か連絡手段を考えないとなぁ・・・

Outlook VBA 情報を Googleで検索する

Google
探す言葉:
ググる。↑添付,予定,本文などの単語や,オブジェクト(MailItem),プロパティ(.Body)やメソッド(.Move)などを入れて検索してみてください。

サイト指定:人気QAサイト や 一次情報MS本家を指定する
条件無し WWW 全体から検索↓指定で見つからなければ 一次情報・二次情報まとめから探る
一次情報は基本のMSDN含む microsoft.comから
まとめ一次・二次情報 Qiita 知識を記録・共有 qiita.comで個人まとめを参考に
手前味噌の三次情報 三流君メモBlog ken3memo.hatenablogから検索
QAサイトの質問から探る
QAはやっぱり人の多いYahoo知恵袋 chiebukuro.yahoo.co.jpから探る
こちらもどうぞ おしえてgoo! oshiete.goo.ne.jp
15分探して見つからなかったら?回答率90%以上 teratail.com
私も利用中 最近過疎ってる失礼 人力検索 q.hatena.ne.jp
意外と穴場? 2ch 5ch.netから探す
検索実行: ←オプション確認後に検索ボタンを押してください

期間指定:情報の鮮度も大切?
指定なし(全て)※不変の情報を得るには指定無しが一番?
3日以内 最新の更新情報を探す時など。
3ヶ月 これはあまり使わないかも
1年以内の更新なら情報鮮度もOK?バランス型
3年も経てばOfficeもバージョンUP?
検索実行: ←オプション確認後に検索ボタンを押してください

Outlook アイテム別の操作

  1. [Mail]でメールを作成したり読み込んだり
  2. [Task]で仕事・タスクを登録したり
  3. [Appointment]予定表 アポ・スケジュールの登録ほか
  4. [Contact]連絡先でアドレスや名簿管理

三流君の[Outlookヘルプの探り方]でオブジェクト、プロパティやメソッドの探り方を少し書いてみたり、

ken3memo : Outlook関係の→ [メモ・記事をチェック] / [ブックマークを見る] / [アウトルックの動画解説へ]
で、まとめてみたり※↑まとまってないじゃん、放り込んだだけでしょ・・・




Menu : [Outlook操作(TOP)] / [VBA(TOP)] / [三流君(TOP)]