Outlookの予定表に登録されている予定をExcelシートへ一覧表にしたいことはないでしょうか。
例えば月次集計で定例会実施件数など活動履歴を集計したいときなどです。
そんな時に悩むことは、
・VBAでOutlookの予定表情報を一括取得したいが方法がわからない
ですよね。
今回はそんなお悩みを解決する、
・VBAで期間指定でOutlook予定表に登録されている予定をExcelへ出力する方法
についてまとめます!
もくじ
予定一覧をExcelへ出力するイメージ
今回のOutlook予定表を出力するVBAの実行イメージについて説明をします。
まずVBAの実装先は、出力結果を書き込む先のExcel側となります。
Excelブック側からVBAを実行し以下の流れで処理が行われます。
①Excelブック(VBA) → 予定一覧ちょうだい → Outlook
②Excelブック ← 予定一覧を出すよ ← Outlook
Excel側のVBAを実行すると、
ExcelのワークシートにOutlookの予定表情報が書き込まれます!
カンタンですね。
早速VBAを実装をして動かしてみましょう!
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
'オブジェクトを解放します。
Set olItem = Nothing
Set olConItems = Nothing
Set olFolder = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
'スクリーンの更新を再開します。
Application.ScreenUpdating = True
MsgBox "Outlook予定表の取り込みが完了しました!", vbInformation
End Sub
実装手順は以下の通りです。今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
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メソッドを利用して、抽出する予定を絞り込む機能を追加しましたので、追記いたします。
コードは以下の通りです。
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
'オブジェクトを解放します。
Set olItem = Nothing
Set olConItems = Nothing
Set olFolder = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
'スクリーンの更新を再開します。
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」を指定し、実行してみましょう。
はい!絞り込めましたね。
やはり絞り込み機能はあったほうが良いです。
さいごに
いかがでしょうか。
今回は
・VBAで期間指定でOutlook予定表に登録されている予定をExcelへ出力する方法
についてまとめました。
まだまだ便利な方法がりますので、よろしければご参照頂ければと思います。
返信遅くなり申し訳ございません。
返信ありがとうございます!
ちょっとそれで試してみたいと思います!
また不明点あれば宜しくお願い致します!
とても便利で業務に活用させて頂いてます!
ありがとうございます。
1点質問させて下さい。
上記内容にて出力させる事が出来ましたが、一部、「(件名)-個別の会議」「(件名)-個別の予定」となっている分に関して読み込む事が出来ませんでした・・・
(スケジュール内のアイテムを開き、上部青枠に記載されている部分です)
これが”AppointmentItem”に該当しない為か分かりませんが、「個別の~」も一緒に読み込むようにすることは可能でしょうか?
ご教授頂けますと幸いです。
いつもご利用ありがとうございます。
「-個別の~」とついているアイテムを取得する件につきまして、おそらく追加フォルダ側のアイテムになるかと存じますので、
以下の記事を参考に検証いただけますでしょうか。
https://extan.jp/?p=3370
設定例としては以下のようになります。
Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar).Folders(“個別の予定”)
この場合は規定の予定表の配下にある「個別の予定」フォルダが対象となりますが、規定の予定表以外のフォルダである場合は
GetDefaultFolderメソッドでは拾えませんので、その点ご了承ください。
いただいた修正コード適応して、無事に所望の結果を出力できるようになりました。
早速の対応ありがとうございました。
2023年4月6日 11:26 PM
に回答いただいたものです。
その節は対応ありがとうございました。
「返信する」からうまく返信画面が表示されないので、
再度「コメントを残すから」投稿しています。
当方の事情
複数のグループ会社があり、外部会社(扱い)のメンバー分は今回修正いただいたコードで
正しくメールアドレスを取得することができました。
ところが、内部(扱い)分が、
/o=ExchangeLabs/ou=Exchange Administrative Group,,,
と出力されてしまっている状況です。
ざっくり調べたところ、
「LegacyExchangeDNが表示されている状況」のようです。
修正コードのうち、elseの部分
Else
Cells(lnContactCount, 6).Value = .Organizer
End If
が動作していません。(ブレークポイント設定してもこのElseの処理で止まりません)
この部分が、元の通り、.Organizer(表示名)を表示させるためには
どのようにコード修正すればよいでしょうか?
御指南いただけると助かります。
内部(扱い)分であれば、表示名からメールアドレスにすることは当方でも何とかできそうです。
ご面倒おかけしますが、ご対応のほどよろしくお願いします。
レス太
いつもご利用ありがとうございます。
LegacyExchangeDNとなっているところをOrganizerプロパティに置き換える件につきまして、
LegacyExchangeDNの固有の文字列が含んでいるかどうかを判定すれば振り分けが可能かと存じます。
以下サンプルとなりますが、InStr関数の条件のところは適宜調整の上ご確認いただければと存じます。
Dim objRecipient As Object
For Each objRecipient In .Recipients
If .Organizer = objRecipient.Name And InStr(objRecipient.Address, “ou=Exchange”) = 0 Then
Cells(lnContactCount, 6).Value = objRecipient.Address
Exit For
Else
Cells(lnContactCount, 6).Value = .Organizer
End If
Next
回答ありがとうございました。
回答を参考に改めて、コードを解読してみます。
また、質問すると思います、その時はよろしくお願いします。
‘Outlook用の定義
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Folder
Dim olConItems As Outlook.Items
Dim olItem As AppointmentItem
”—————————————-
“Dim olApp As Outlook.Application”
コードに使用する変数がこれでいいのか不安…
”—————————————-
Dim olFolder As Folder
このコードだけ”Outlook.”は必要ないんですか?
”—————————————-
“Namespace”の”MailItem”の使い分けが不明
”—————————————-
”Excelの定義_オブジェクト”
Dim wbBook As Workbook
Dim wsSheet As Worksheet
これで十分
”—————————————-
変数の意味
“Dim strDummy As String ”
“Dim objAppt As AppointmentItem”
”—————————————-
wsSheet.Activate
のコードの意味
”—————————————-
Set olItem = olConItems.Find(“[End] = “”” &
strStart & “”””)
と
‘Findで検索すると期間範囲外の余計なものまでヒットしてしまうので、再度フィルタリ
ングする
手順がよくわかりませんでした。
コードの説明を小学生レベルで説明お願いします
”—————————————-
TypeName(olItem) = “AppointmentItem”
サイトで説明がありましたが、納得できないので説明お願いします。
あと”AppointmentItem”のダブルコーテーションの意味もお願いします
”—————————————-
If olItem.Start >= strStart And olItem.End < strEnd Then
条件式がわかりませんでした。
''—————————————-
Set olItem = olConItems.FindNext
コードの意味が理解できなかったので詳細に説明お願いします。
''—————————————-
Sub Outlookの予定をExcelに取り込む_期間指定()
【参考にしたコード】
''——-初期設定——-''
''—-cellsの列幅—-
Columns("A:B").ColumnWidth = 45
Columns("C:D").ColumnWidth = 16
Columns("E").ColumnWidth = 5
Columns("F").ColumnWidth = 9
Columns("G:H").ColumnWidth = 5
Dim lnContactCount As Long
Dim strDummy As String ''use?
''————————
'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
'スクリーンの更新は行われません。
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
olConItems.Sort "[start]"
Dim objAppt As AppointmentItem
Dim strStart
Dim strEnd
strStart = Format(Date, "yyyy/mm/dd") '抽出する予定の開始日を指定
strEnd = Format(Date, "yyyy/mm/dd") '抽出する予定の終了日を指定
strEnd = DateAdd("m", 2, strEnd) ' 1m追加
'Findメソッドで期間指定して抽出する予定を絞り込む
Set olItem = olConItems.Find("[End] = “””
& 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
'オブジェクトを解放します。
Set olItem = Nothing
Set olConItems = Nothing
Set olFolder = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
'スクリーンの更新を再開します。
Application.ScreenUpdating = True
MsgBox "Outlook予定表の取り込みが完了しました!", vbInformation
End Sub
ご質問につきまして、以下にご回答いたします。
このコードだけ”Outlook.”は必要ないんですか?
⇒検証の際にマッチしない型があったので汎用的に使えるFolderのみの方を指定していますが、通常利用であればOutlookを付けても問題ないかと思います。
“Namespace”の”MailItem”の使い分けが不明
⇒“Namespace”は直訳すると名前空間といい、いわゆる住所みたいなものです。OutlookApplicationオブジェクトの”MAPI”という名前空間を指定しています。
”MailItem”は1件のメールアイテムを指します。予定アイテムであればAppointmentItemとなります。
関係としてはOutlook>MAPI Namespace>規定フォルダ>メール/予定>アイテム(MailItem/AppointmentItem)のような形になります。
wsSheet.Activateのコードの意味
⇒Excelシートを選択し表示させる内容になります。
‘Findで検索すると期間範囲外の余計なものまでヒットしてしまうので、再度フィルタリングする
手順がよくわかりませんでした。
⇒Findメソッドで検索すると、指定した条件以外のものも含まれてしまう不具合があったので、別の方法で再度フィルタリングしています。
あと”AppointmentItem”のダブルコーテーションの意味もお願いします。
⇒ダブルコーテーションでくくる理由は文字列として認識させるためです。
If olItem.Start >= strStart And olItem.End < strEnd Then 条件式がわかりませんでした。 ⇒取得した予定アイテムの開始日と終了日が指定期間内であるかどうかを判定しています。 Set olItem = olConItems.FindNext コードの意味が理解できなかったので詳細に説明お願いします。 ⇒Findメソッドの次の検索をFindNextメソッドで実行します。条件に合致した予定アイテムをolItemへセットしています。 OutlookのVBAは独自要素が多いのでわかりにくいですね。 仕様だとおもっていただければ幸いです。
VBAの記事ありがとうございます。
さっそくですが、質問をまとめてきたのでよろしくお願いいたします。