[Outlook マクロ] 予定表に登録されている予定を取得する

日報を Outlook のメールで作成するとき、Outlook の予定表に登録されている予定をマクロ (VBA) で取得して、メールの本文に貼り付けられたら便利かも?と思いました。そこで、「メールのテンプレートを元に、2015 年 12 月 24 日の日報メールを自動で作成する」というテーマで、試してみました。

環境は、Windows 8.1、Outlook 2013 です。

マクロを作成する前の準備

■メールのテンプレートの作成

Outlook で、日報のテンプレートとなる適当なメールを作成します。今回は下のようにしました。

outlook-get-appointments-by-macro_w4beqwoc

“<<Appointments>>” の部分には、後でマクロから予定の件名を埋め込む際のしるしとなります。

メールを作成したら、「Outlook テンプレート形式」 (.oft) で、適当なファイル名を付けて保存しておきます。保存先はどこでも OK です。

■予定の登録

適当な予定を数件登録しておきます。目的の日付 (2015 年 12 月 24 日) の予定だけがメールに貼り付けられているのを確認するために、あえて他の日付の予定も登録しました。

日付 開始時刻 終了時刻 件名
2015/12/24 13:00 13:30 昼寝
2015/12/24 15:00 16:00 おやつ会
2015/12/24 終日 クリスマスイブ
2015/12/25 9:00 12:00 大掃除
2015/12/25 終日 クリスマス

VBA でマクロを作成する

プログラム全体はこのようになりました。

 

上のプログラムは、こんな流れで処理を行っています。

  1. 予定表の取得
  2. 予定表に登録されているすべての予定の取得
  3. 日付でフィルターをかける
  4. テンプレート ファイルからメールを新規作成
  5. メールの本文に予定の件名を埋め込み

■予定表の取得

予定表を取得するには、Outlook アプリケーションの現在のセッションに対して、 GetDefaultFolder メソッドを実行します。このメソッドは、取得するフォルダーの種類を指定する必要がありますので、ここでは予定表フォルダー (OlDefaultFolders.olFolderCalendar) を指定します。

■予定表に登録されているすべての予定の取得

予定表に登録されているすべての予定は、予定表 (Folder オブジェクト) の、Items プロパティに設定されています。

■日付でフィルターをかける

フィルターをかけるためには、すべての予定 (Items オブジェクト) の Restrict メソッドを実行します。このメソッドを実行すると、フィルターに一致する 0~N 件の予定のみが取得されます。フィルター文字列については、少し長くなるので後述します。

■テンプレートからメールを新規作成

テンプレート ファイルのパスを指定して、メールを新規作成します。

■メールの本文に予定の件名を埋め込み

予定の件名の頭に”・”を付けて、さらに改行でつなげます (箇条書き風にします)。そして、テンプレート上の “<<Appointments>>” と記述された部分に埋め込みます。

■実行結果

マクロを実行すると、下のようなメールが作成されました。2015 年 12 月 24 日の予定だけが出力されています。

outlook-get-appointments-by-macro_kckssmr1

予定の抽出条件の指定 (フィルター文字列の作成)

予定にフィルターをかける際に肝心となる、フィルター文字列についてです。2015 年 12 月 24 日に登録されている予定を抽出するフィルター文字列を作成します。
予定には、開始時刻・終了時刻が設定されているものと、開始時刻・終了時刻が設定されていない、いわゆる「終日」のものがありますが、いずれも対象とすることにします。

■開始時刻・終了時刻が設定されている予定を取得するフィルター文字列の作成

2015 年 12 月 24 日の、開始時刻・終了時刻が設定されている予定を指定するには、下のようにします。

[Start] は開始日時、[End] は終了日時を表すフィールドです。注意点として、日時の値は、年・月・日・時・分までを指定する必要があります。秒を指定すると、エラーにはならないのですが、正しい結果を得ることができませんでした。

■終日の予定を取得するフィルター文字列の作成

2015 年 12 月 24 日の、終日の予定を取得するを指定するには、下のようにします。

[AllDayEvent] は終日の予定であるかどうかを表すフィールドです。True なら終日、False なら終日ではありません。予定を入力する画面の、[終日] チェック ボックスと連動しています。

注意点として、終日の予定であっても、開始日時 ([Start]) には時・分までを指定する必要があります。よって、0:00 を指定しています。

最後に、2 つの文字列を “Or” 演算子で結合することにより完成です。これを、Restrict メソッドの引数に指定しています。

■フィールドを指定する際の注意点

フィルター文字列における予定のフィールドは角括弧 [] で書きます。たとえば、開始時刻は [Start] と書きます。また、このフィールドと値を、等号 (=) や不等号 (> や <= など) で比較する式を書く際、フィールドは必ず左辺に書かなければならないようです。つまり、

は OK ですが、

では正しい結果が得られないようです。ランタイム エラーにもならないため、注意が必要です。(ハマってしまい 1 時間ほど頭を悩ませた人間がここにいる…。)

ところで、開始日時や終了日時以外にもいろいろなフィールドがありますが、他のフィールドの値でフィルターをかけたい時、どのような名前を指定すれば良いのでしょうか。これはおそらく、予定のオブジェクトである AppointmentItem オブジェクトに定義されているプロパティの名前を指定すればよいのではないかと考えています (未検証ですが)。

さらに機能追加など

上で作ったプログラムだと簡素すぎるし、日報ぽくないし、何より 2015 年のクリスマスイブ限定のプログラムとか、使えん…。そこで、機能追加をしました。

  • 当日の日付からメールを作成する。
  • メールの件名と本文に日付を出力する。
  • 明日の予定も出力する。
  • 会議は他の予定と分けて出力する。
  • 「定期的な予定」として登録されている予定も出力する。

テンプレートはこんな感じ。
outlook-get-appointments-by-macro_fv34on17

プログラム全体です。

KPDN

KPDN has written 21 articles

プログラミングとゲームが好きな、しがないにゃんこ好きです。わんこも同じぐらい好きです。最近、物忘れどんどんが酷くなってきた。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">