Outlook の予定表を Excel に出力するマクロを作ってみました。

Attribute VB_Name = "週間予定Excel"
Sub Excel週間予定()

'期間指定
Dim dateFrom As Date
Dim dateTo As Date
'初期値
dateFrom = Date
'入力ダイアログを表示
dateFrom = InputBox("開始日を入力してください。", "週間予定", dateFrom)
'7日間
dateTo = DateAdd("d", 6, dateFrom)
'MsgBox dateFrom
'MsgBox dateTo

'予定表モジュールを取得
Dim calmod As CalendarModule
Set calmod = Application.ActiveExplorer.NavigationPane.Modules.GetNavigationModule(olModuleCalendar)
'MsgBox calmod

'Excelを取得
Dim Excelapp As Object
Set Excelapp = CreateObject("Excel.Application")

'表示
Excelapp.Visible = True

'ブックを作成
Excelapp.Workbooks.Add

'ヘッダを準備
Excelapp.Range("A1:G1") = Array("予定表", "件名", "場所", "開始時刻", "終了時刻", "終日イベント", "本文")

'2行目から
Dim row As Integer
row = 2

'すべての予定表グループに対して
Dim grp As NavigationGroup
For Each grp In calmod.NavigationGroups
'MsgBox grp

'すべての予定表に対して
Dim fol As NavigationFolder
For Each fol In grp.NavigationFolders
'MsgBox fol

'チェックされている予定表のみ
If fol.IsSelected Then
'MsgBox fol

'予定の絞り込み
Dim col As Items
Set col = fol.Folder.Items
col.Sort "[Start]"
col.IncludeRecurrences = True
Dim appointment
Set appointment = col.Find("[Start] < """ & Format(dateTo, "yyyy/mm/dd") & """ AND [End] >= """ & Format(dateFrom, "yyyy/mm/dd") & """")

'見つかった予定に対して
While Not appointment Is Nothing

Excelapp.Cells(row, 1).Value = fol.DisplayName
Excelapp.Cells(row, 2).Value = appointment.Subject
Excelapp.Cells(row, 3).Value = appointment.Location
Excelapp.Cells(row, 4).Value = appointment.Start
Excelapp.Cells(row, 5).Value = appointment.End
Excelapp.Cells(row, 6).Value = appointment.AllDayEvent
Excelapp.Cells(row, 7).Value = appointment.Body
row = row + 1

Set appointment = col.FindNext
Wend

End If

Next

Next

'MsgBox "end"

End Sub

使い方

  • このマクロを Outlook で実行してください。Excel ではありません。
  • 開始日の入力が求められますので入力してください。年は省略できます。開始日から7日間の予定が対象となります。
  • 新しい Excel ブックが開きます。

これを作る前にググッて見つかったサンプルのほとんどは、共有予定表に直接アクセスする方法をとっていました。しかし、このマクロは、ローカル Outlook に落としてきた予定表を見ています。たぶん次のようなメリットがあるのではないかと思います。

  • 参照する予定表の選択を Outlook 本体に持てること。予定を取得するアカウントのリストを、マクロの中や Excel シートに持つ必要がありません。
  • ユーザーの共有予定以外を利用できること。 SharePoint に作成した予定表も、ローカル Outlook に取り込めば参照できます。
  • 予定表ごとに表示の ON/OFF ができること。

Outlook でマクロを実行する

[開発]タブを表に出します。

[ファイル] - [オプション] - [リボンのユーザー設定]

この設定は Excel ではやってあるという人が多いのではないでしょうか。Office を入れた直後に。あれと同じです。

コード解説

予定表をクロールする

まず、次のコードで予定表モジュールを取得します。

Application.ActiveExplorer.NavigationPane.Modules.GetNavigationModule(olModuleCalendar)

次のように入れ子になっているので、順番に処理していきます。

Outlook予定表

予定表 (NavigationFolder) のプロパティ

DisplayName
予定表の名前。ユーザー名の代替として利用。
IsSelected
予定表のチェックボックスの状態。

予定の項目とプロパティ

項目プロパティ
件名Subject
場所Location
開始時刻Start
終了時刻End
終日イベントAllDayEvent
本文Body

予定の絞り込み処理は、次のページから借用しました。

Excel の操作の解説は、ググればたくさん出てくると思いますので割愛します。VB のことはあまり知らなくて、For Each や Array は書き方を調べるところからでした。