【Excel VBA】一瞬でExcelワークシートへOutlookの予定表を取り込む

Outlookの予定表に登録されている予定をExcelシートへ一覧表にしたいことはないでしょうか。

今回はOutlook予定表に登録されている予定をExcelへ出力する方法をご紹介します。



予定一覧をExcelへ出力する方法について

今回のOutlook予定表出力VBAの実装先は、出力結果を書き込む先のExcelブック側となります。

Excelブック側からVBAを実行し以下の流れで処理が行われます。

Excelブック(VBA) → 予定一覧ちょうだい → Outlook
Excelブック ← 予定一覧を出すよ ← Outlook

では早速実装をして動かしてみましょう!


Excel VBAからOutlookを操作するための下準備

①まずExcelを起動し、「開発」タブをクリックします。

②VBEの画面が開いたら、メニューから「ツール」>「参照設定」を選択します。

③「Microsoft Outlook XX.X Object Library」を探してチェックボックスにチェックし「OK」をクリックします。

以上です。


VBAを実装する

続いてVBAを実装します。

今回VBAは以下の通りとなります。
なお、VBAは前回の「【Excel VBA】カンタン!Outlookの連絡先をExcelワークシートへ取り込む」をベースに、連絡先部分を予定表へ変更をおこなったものとなります。

Sub Outlookの予定表を取り込む()

    'Outlook用の定義
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Folder
    Dim olConItems As Outlook.Items
    Dim olItem  As AppointmentItem
    
    'Excel用の定義
    Dim wbBook As Workbook
    Dim wsSheet As Worksheet
    
    Dim lnContactCount As Long
    
    Dim strDummy As String
    
    'スクリーンの更新は行われません。
    Application.ScreenUpdating = False
    
    'Excelのブックとワークシートのオブジェクトを設定します。
    Set wbBook = ThisWorkbook
    Set wsSheet = wbBook.Worksheets(1)
    
    '書き込み先のセルを指定します。また1行目にタイトルを記述します。
    With wsSheet
        .Range("A1").CurrentRegion.Clear
        .Cells(1, 1).Value = "件名"
        .Cells(1, 2).Value = "場所"
        .Cells(1, 3).Value = "開始日時"
        .Cells(1, 4).Value = "終了日時"
        .Cells(1, 5).Value = "予定の本文"
        .Cells(1, 6).Value = "予約者"
        .Cells(1, 7).Value = "必須出席者"
        .Cells(1, 8).Value = "任意出席者"

        With .Range("A1:Z1")
            .Font.Bold = True
            .Font.ColorIndex = 10
            .Font.Size = 11
        End With
    End With
    
    wsSheet.Activate
    
    'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。
    Set olApp = New Outlook.Application
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
    Set olConItems = olFolder.Items
            
    '取得結果を記述する行番号を指定します。2行目のセルから開始されることになります。
    lnContactCount = 2
    
    For Each olItem In olConItems
    Debug.Print TypeName(olItem)
        If TypeName(olItem) = "AppointmentItem" Then
            With olItem
                Cells(lnContactCount, 1).Value = .Subject
                Cells(lnContactCount, 2).Value = .Location
                Cells(lnContactCount, 3).Value = .Start
                Cells(lnContactCount, 4).Value = .End
                Cells(lnContactCount, 5).Value = .Body
                Cells(lnContactCount, 6).Value = .Organizer
                Cells(lnContactCount, 7).Value = .RequiredAttendees
                Cells(lnContactCount, 8).Value = .OptionalAttendees

            End With
            lnContactCount = lnContactCount + 1
        End If
    Next olItem
    
    'Null out the variables.
    Set olItem = Nothing
    Set olConItems = Nothing
    Set olFolder = Nothing
    Set olNamespace = Nothing
    Set olApp = Nothing
    
    '日付順にソート.
    With wsSheet
        .Range("A2", Cells(2, 10).End(xlDown)).Sort Key1:=Range("C2"), Order1:=xlAscending
        .Range("A:F").EntireColumn.AutoFit
    End With
            
    'Turn screen updating back on.
    Application.ScreenUpdating = True
    
    MsgBox "Outlook予定表の取り込みが完了しました!", vbInformation
    
End Sub

実装手順は以下の通りです。今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。



早速実行する

①「開発」タブの「VBA」をクリックし「Outlookの予定先を取り込む」を選択し、「実行」をクリックします。

②Excelのワークシートに書き込まれたら完成です!

なお、実行にあたり予定の登録数が多い場合は処理に時間がかかることがありますのでご注意ください。

今回のVBAについて説明

予定表のリストはolFolderCalendarというメンバーに格納されています。
コードではolItemオブジェクトのタイプ名が”AppointmentItem”だった場合に処理を進めるようにしています。

If TypeName(olItem) = “AppointmentItem” Then

また連絡先の項目はプロパティに格納されており、今回は以下の項目に絞っています。
件名:Subject
場所:Location
開始日時:Start
終了日時:End
予定の本文:Body
予約者:Organizer
必須出席者:RequiredAttendees
任意出席者:OptionalAttendees

予定表のすべて項目は以下となっていますので、必要に応じて取捨選択頂ければと思います。



【参考】AppointmentItem オブジェクト (Outlook)

名前 説明
attachments 指定されたアイテムのすべての添付ファイルを表す Attachments オブジェクトを返します。
autoresolvedwinner Outlook アイテムに関連付けられている請求先情報を表す文字列を設定または返します。
BillingInformation 連絡先の記念日を示す日付を設定または返します。読み取り/書き込み。
Body Outlook アイテムの本文を表す文字列型 (String) の値を返すか設定をします。 値の取得と設定が可能です。
BusyStatus 予定のユーザーのビジー状態を示す**OlBusyStatus** 定数を設定または返します。 値の取得と設定が可能です。
Categories Outlook アイテムに割り当てられた分類項目を表す文字列を設定または返します。 値の取得と設定が可能です。
Companies Outlook アイテムに関連付けられている会社の名前を表す文字列を設定または返します。 値の取得と設定が可能です。
AutoResolvedWinner ブール値アイテムが自動競合解決の勝者であるかどうかを返します。読み取り専用です。
BillingInformation Outlook アイテムに関連付けられている請求先情報を表す文字列を設定または返します。読み取り/書き込み。
ConversationTopic Outlook アイテムのテーマスレッドのトピックを表す文字列を返します。 読み取り専用です。
Creationtime Outlook アイテムの作成日時を示す日付を返します。 読み取り専用です。
Duration 期間 (分単位) を示す長整数型 (Long ) の値を取得または設定します。 値の取得と設定が可能です。
End 終了日時を示す日付を設定または返します。 値の取得と設定が可能です。
EndInEndTimeZone タイムゾーンで表される予定の終了日時を表す日付値を設定を取得または取得します。 値の取得と設定が可能です。
EndUTC 世界協定時刻 (UTC) 形式で表現される予定の終了日時を表す日付値を設定を取得または取得します。 値の取得と設定が可能です。
LastModificationTime Outlook アイテムが最後に変更された日付と時刻を指定する日付を返します。 読み取り専用です。
Location 予定の特定のオフィスの場所を表す文字列を設定または返します (たとえば、建物1の部屋1または Suite 123)。 値の取得と設定が可能です。
Meetingstatus 予定アイテムがリンクされている会議ワークスペースの URL を表す文字列型 (string ) の値を返します。 読み取り専用です。
MeetingWorkspaceURL 連絡先の勤務先住所の番地部分を表す文字列を設定または返します。読み取り/書き込み。
Organizer 予定の開催者の名前を表す文字列を返します。 読み取り専用です。
PropertyAccessor 連絡先に使用する電子名刺の種類を指定する定数 OlBusinessCardType を返します。値の取得のみ可能です。
BusinessFaxNumber オブジェクトのプロパティの作成、取得、設定、および削除をサポートする**PropertyAccessor** オブジェクトを返します。 読み取り専用です。
Recipients Outlook アイテムのすべての受信者を表す Recipients コレクションを取得します。 読み取り専用です。
ReminderMinutesBeforeStart アラームが予定の開始前に発生する時間を分単位で示すを設定または返します。 値の取得と設定が可能です。
ReminderSet アイテムのアラームが設定されている場合は、 Trueを指定するブール値を設定します。 値の取得と設定が可能です。
ReplyTime 予定の返信時刻を示す日付を設定または返します。 値の取得と設定が可能です。
AppointmentItem 会議の予定に必要な出席者名のセミコロンで区切られた文字列を返します。 値の取得と設定が可能です。
Resources 会議のリソース名のセミコロンで区切られた文字列を返します。 値の取得と設定が可能です。
ResponseRequested 現在のユーザーの予定の会議の全体的な状態を示す**olresponsestatus** クラスの定数を取得します。 読み取り専用です。
Responsestatus Outlook アイテムに関連付けられている会社の名前を表す文字列を設定または返します。読み取り/書き込み。
Size Outlook アイテムのサイズ (バイト単位) を示す値を返します。 読み取り専用です。
Start 開始日時を示す日付を設定または返します。 値の取得と設定が可能です。
Startinstarttimezone 予定の開始日時を表す日付値を設定を取得または取得します。 値の取得と設定が可能です。
Starttimezone 予定の開始時刻のタイムゾーンに対応する**TimeZone** 値を設定または返します。 値の取得と設定が可能です。
Subject Outlook アイテムの件名を示す 文字列 を返すか、設定します。 値の取得と設定が可能です。



追記:Find、FindNextメソッドで期間指定し、抽出する予定を絞り込む

前回連絡先出力の時にご紹介したFind、FindNextメソッドを利用して、抽出する予定を絞り込む機能を追加しましたので、追記いたします。

【Outlook VBA】Outlook連絡先をVBAのFindメソッドで検索してみよう

コードは以下の通りです。

Sub Outlookの予定表を取り込む_期間指定Ver()

    'Outlook用の定義
    Dim olApp As Outlook.Application
    Dim olNamespace As Outlook.Namespace
    Dim olFolder As Folder
    Dim olConItems As Outlook.Items
    Dim olItem  As AppointmentItem
    
    'Excel用の定義
    Dim wbBook As Workbook
    Dim wsSheet As Worksheet
    
    Dim lnContactCount As Long
    
    Dim strDummy As String
    
    'スクリーンの更新は行われません。
    Application.ScreenUpdating = False
    
    'Excelのブックとワークシートのオブジェクトを設定します。
    Set wbBook = ThisWorkbook
    Set wsSheet = wbBook.Worksheets(1)
    
    '書き込み先のセルを指定します。また1行目にタイトルを記述します。
    With wsSheet
        .Range("A1").CurrentRegion.Clear
        .Cells(1, 1).Value = "件名"
        .Cells(1, 2).Value = "場所"
        .Cells(1, 3).Value = "開始日時"
        .Cells(1, 4).Value = "終了日時"
        .Cells(1, 5).Value = "予定の本文"
        .Cells(1, 6).Value = "予約者"
        .Cells(1, 7).Value = "必須出席者"
        .Cells(1, 8).Value = "任意出席者"

        With .Range("A1:Z1")
            .Font.Bold = True
            .Font.ColorIndex = 10
            .Font.Size = 11
        End With
    End With
    
    wsSheet.Activate
    
    'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。
    Set olApp = New Outlook.Application
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
    Set olConItems = olFolder.Items
    
    '取得結果を記述する行番号を指定します。2行目のセルから開始されることになります。
    lnContactCount = 2
    
    Dim objAppt As AppointmentItem
    Dim strStart As String
    Dim strEnd As String
    
    strStart = Format("2019/09/16", "yyyy/mm/dd") '抽出する予定の開始日を指定
    strEnd = Format("2019/09/17", "yyyy/mm/dd")  '抽出する予定の終了日を指定
    strEnd = DateAdd("d", 1, strEnd)   ' 1日追加
    
    'Findメソッドで期間指定して抽出する予定を絞り込む
    Set olItem = olConItems.Find("[End] < """ & strEnd & """ AND [Start] >= """ & strStart & """")
    
    
    
    While TypeName(olItem) = "AppointmentItem"
        'Findで検索すると期間範囲外の余計なものまでヒットしてしまうので、再度フィルタリングする
        If olItem.Start >= strStart And olItem.End < strEnd Then
            With olItem
                Cells(lnContactCount, 1).Value = .Subject
                Cells(lnContactCount, 2).Value = .Location
                Cells(lnContactCount, 3).Value = .Start
                Cells(lnContactCount, 4).Value = .End
                Cells(lnContactCount, 5).Value = .Body
                Cells(lnContactCount, 6).Value = .Organizer
                Cells(lnContactCount, 7).Value = .RequiredAttendees
                Cells(lnContactCount, 8).Value = .OptionalAttendees
            End With
            lnContactCount = lnContactCount + 1
        End If
        Set olItem = olConItems.FindNext

    Wend
    
    
    'Null out the variables.
    Set olItem = Nothing
    Set olConItems = Nothing
    Set olFolder = Nothing
    Set olNamespace = Nothing
    Set olApp = Nothing
    

    With wsSheet
        .Range("A2", Cells(2, 10).End(xlDown)).Sort Key1:=Range("C2"), Order1:=xlAscending
        .Range("A:F").EntireColumn.AutoFit
    End With
            
    'Turn screen updating back on.
    Application.ScreenUpdating = True
    
    MsgBox "Outlook予定表の取り込みが完了しました!", vbInformation
    
End Sub

今回は2019/09/16~2019/09/17までを指定しました。
期間を変更する箇所は以下となります。

strStart = Format(“2019/09/16“, “yyyy/mm/dd”) ‘抽出する予定の開始日を指定
strEnd = Format(“2019/09/17“, “yyyy/mm/dd”) ‘抽出する予定の終了日を指定

VBAから「Outlookの予定表を取り込む_期間指定Ver」を指定し、実行してみましょう。

はい!絞り込めましたね。

やはり絞り込み機能はあったほうが良いです。


さいごに

いかがでしょうか。

今回はOutlook予定表に登録されている予定をExcelへ出力する方法をご紹介しました。

まだまだ便利な方法がりますので、よろしければご参照頂ければと思います。

Excelの予定一覧から自分のOutlookの予定表へ登録する方法

【Excel VBA】一瞬でExcelワークシートからOutlookの予定表へスケジュールを登録する

Excelの予定一覧から他人のOutlook予定表を登録、編集する方法

【Excel VBA】他人のOutlook予定表をExcelから登録、編集する

他人のOutlook予定表をExcelワークシートへ取り込む方法

【Excel VBA】Outlookの他人の予定表をExcelワークシートへ取り込む

【Excel VBA】先月、今月、翌月分のOutlook予定表データをワンクリックで取り込む

【Excel VBA】先月、今月、翌月分のOutlook予定表データをワンクリックで取り込む

15 件のコメント

  • 大変便利だと思い活用させていただいています。
    1点教えてほしいのですが上記マクロを組んで抽出したところ、
    定期的な予定(例えば毎週水曜日の会議)が抽出されません。
    これが全て抽出されるようなマクロの組み方を教えていただけませんか?

    • 定期的な予定の情報については、少々難しく、GetRecurrencePattern メソッドを呼び出して、指定された予定に関連付けられている RecurrencePattern オブジェクトを取得する形となります。
      Set objPattern = olItem.GetRecurrencePattern

      次に期間を取得します。
      objPattern.PatternStartDate
      objPattern.PatternEndDate

      最後が難しいのですが、日次、週次、月次、年次パターンを取得します。
      objPattern.RecurrenceType

      頻度 (毎週、隔週、3 週間に 1 度など) の場合は
      objPattern.Interval

      会議のある曜日の場合は
      objPattern.DayofWeekMask

      で取得し、期間とパターンで開催日を導きだす必要があります。

      詳細はこちらをご参照ください。
      https://docs.microsoft.com/ja-JP/previous-versions//ee692908(v=technet.10)?redirectedfrom=MSDN

  • コード上で日時指定で実行していますが
    Excel上でボタンを押すと先月分のデータが取り込めるような
    マクロも可能なのでしょうか。

    • はい、可能となります。
      ボタンに関しては、Excel上にボタン配置してマクロを登録をします。

      先月の月末月初は以下の関数で取得し、値をマクロへ渡します。

      先月の月初 =EOMONTH(TODAY(),-2)+1
      先月の月末 =EOMONTH(TODAY(),-1)

      別の機会にでもサンプルコードを提示したいと思います。

  • 大変勉強させて頂いています。
    1点なのですが、こちらの予定表の取り込み先を共有予定表などにすることは可能なのでしょうか?
    よくわかっておらず申し訳ございません。教えていただけますか。

  • 大変便利で使わせて頂いております。
    Excelから会議案内し、予定表をExcelに取得しています。出席者の応答(承諾、仮承諾、辞退、応答なし)も取得したいのですが宜しくお願い致します。

    • いつもご利用ありがとうございます。

      出席者の応答結果を取得する件ですが、ざっと調べたところ、MS側にも載っておらず有力な情報を見つけることはできませんでしたが、
      応答結果のメールから情報を収集すればできそうです。
      具体的には会話ID(ConversationID)と参加者(送信者)のメールアドレス、応答結果を収集し、会議単位でまとめるといった処理となります。
      できましたら別の記事でご紹介したいと思いますので、完成までお時間頂ければと思います。

  • 大変返信遅れ申し訳ありません。
    とても参考になり早速実装させて頂きました。
    ありがとうございました。
    少し質問させて下さい。
    Conversation IDとEntryIDは会議案内した時点で変わらないものでしょうか。
    現在、ユーザーフォームから打ち合わせ案内とタスク仕事納期を送信し、送信した情報をExcelシートに自動で入力させようと色々参考にさせて作りました。
    Outlook の変更点をExcelシートに反映したいと思っています。
    例えば、欠席したら打ち合わせは必要なしとしてセルに打ち合わせ否と入力させるこんな感じです。
    あっ、質問は、会議の日にちを変更するとIDも変わってしまうのかです。
    IDを照合して会議日が変わった事をExcelシートに反映したいと考えています。
    長々と書きましたが、ご教示お願い致します。

    • ご質問の会議の日にちを変更するとID(ConversationIDとEntryID)は変わるかにつきましては、
      会議を新規登録した時点でIDは発番され、それ以降に案内通知を実施したり、会議の日にちや時間を変更したとしてもIDは変わることはありません。
      EntryIDの取り扱いについてはこちらをご参考頂ければと思います。
      https://extan.jp/?p=2275
      よろしくお願いいたします。

  • 確認させて頂きました。
    やりたい事がやれそうです。
    VBAをやり始めて3ヵ月が経ちましたが楽しくなって来ました。また、色々と参考にさせて頂きます。
    ありがとうございました。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です