Outlook のリマインダーが無能すぎる

Outlook なんて使ってる人がどれくらいいるかはわかりませんが、うちでは標準で使用しています。

世間的に Outlook は単に “メールソフト” と思っておられる方もそこそこいるとは思いますが、結構いろんな機能がぶちこまれています  (Wikipedia の主張によると個人情報管理ソフトらしい)。うちだと会議の予定とかも基本 Outlook に一元化されているので、どれだけ快適に Outlook を使用できるかが効率化において結構なポイントになります。

で、予定表があるんだから当然リマインダー機能があります。予定開始の 15 分前になるとリマインダーウィンドウがポップしてお知らせしてくれるわけです。

**が**、この機能正直**クソの役にも立ちません**。なぜかというと、**最前面に表示されない**のです。作業しているときに Outlook が前面に出ていることなんてまずないので**リマインダーウィンドウが出てても気づかない**ことがめちゃめちゃ多いです (一応タスクバーのアイコンはチカチカしますので運が良ければ目に入ります)。

無能すぎるので **Outlook VBA** でハックしていきます。

## 前準備 — 自己署名証明書取得

まず Outlook VBA でマクロを組んでいくための前準備をしていきます。

セキュリティの問題で**好き勝手マクロを実行できるようにはなっていません**ので、**証明書を作っておく**か**署名なしのマクロの実行許可**をしておく必要があります。後者は危険が危ないすぎるので、今回は自分用に証明書を作成しておきます。

[こちら](https://support.office.com/ja-jp/article/%E3%83%9E%E3%82%AF%E3%83%AD-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B-956e9cc8-bbf6-4365-8bfa-98505ecd1c01)の「**自己署名入りデジタル証明書を作成する**」を参考にデジタル証明書を作成します。

> TL;DR — C:\Program Files (x86)\Microsoft Office\root\Office16\SelfCert.exe を起動して後は流れで。

## 単純にウィンドウをポップさせる

証明書も作成できたのでマクロを記述していきます。

Outlook を起動し、**Alt + F11** で VBA のウィンドウを開きましょう。左のペインから “**Project1 - Microsoft Outlook Objects - ThisOutlookSession**” と開きます。するといかにもテキストを入力できそうなウィンドウが開きます。ここで “**ツール(T) - デジタル署名(D)**” から**先程作成した証明書を登録**しておきましょう。

**リマインダーが出たときに呼び出されるサブルーチンは` Application_Reminder `**となっています。詳細な説明は[こちら](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.application.reminder)。なので、まずはこうなります。

```vb
Private Sub Application_Reminder(ByVal Item As Object)
    ' TODO
End Sub
```

公式によると、`Item`に入ってくるのは`AppointmentItem`、`MailItem`、`ContactItem`、`TaskItem`のどれかとなっています。ここで**予定表のアイテムは`AppointmentIem`**なので、場合分けとしてこうしておきます。

```vb
Private Sub Application_Reminder(ByVal Item As Object)
    If TypeOf Item Is AppointmentItem Then
        ' TODO
    End If
End Sub
```

では、**ウィンドウを表示させるコード**を書いていきます。**`MsgBox`の第 2 引数に`vbSystemModal`を指定する**とモーダルウィンドウとなり、最前面表示になります。

```vb
Private Sub Application_Reminder(ByVal Item As Object)
    If TypeOf Item Is AppointmentItem Then
        MsgBox "まもなく予定の時間です。", vbInformation + vbSystemModal, "リマインド"
    End If
End Sub
```

セーブしたら適当な予定を入れてリマインダーを表示させてみましょう。こうなれば**成功**です。

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/e4e61d1c-72c9-0cb1-bc89-4163ad62a906.jpeg)

## 詳細な情報も一緒に表示してみる

これだけでもかなり便利にはなりましたが、これだけだと少し寂しいですし、**ぶっちゃけ[こちらの記事](http://memorandum0.blog.fc2.com/blog-entry-2.html)とやってること変わりません**ので、もう少し踏み込んでみましょう。

`AppointmentIem`は**様々なプロパティ**をもっています。詳細は[公式リファレンス](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.appointmentitem)を見ていただければと思いますが、まあ今回の要件で便利そうなのはおおむねこんなところでしょう。

| プロパティ名         | 型                                                           | 内容                             |
| -------------------- | ------------------------------------------------------------ | -------------------------------- |
| Subject              | String                                                       | 名称                             |
| Body                 | String                                                       | 内容                             |
| Location             | String                                                       | 場所                             |
| StartInStartTimeZone | Date                                                         | 開始する日付(終日では時刻なし)   |
| EndInEndTimeZone     | Date                                                         | 終了する日付(終日では時刻なし)   |
| Duration             | Long                                                         | 期間                             |
| AllDayEvent          | Boolean                                                      | 終日の予定か                     |
| IsRecurring          | Boolean                                                      | 定期的な予定か                   |
| Categories           | String                                                       | カテゴリ                         |
| Importance           | [OlImportance](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olimportance) | 重要度                           |
| Sensitivity          | [OlSensitivity](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olsensitivity) | 機密度                           |
| MeetingStatus        | [OlMeetingStatus](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olmeetingstatus) | 会議の状態                       |
| Organizer            | String                                                       | 開催者                           |
| OptionalAttendees    | String                                                       | 任意出席者                       |
| RequiredAttendees    | String                                                       | 必須出席者                       |
| Resources            | String                                                       | リソース                         |
| ResponseRequested    | Boolean                                                      | 出席依頼への返信を希望しているか |
| ResponseStatus       | [OlResponseStatus](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olresponsestatus) | 要請への応答                     |

これを使って**ウィンドウの文面をより具体的にする**ことができます。たとえば今回は、以下のようなコードを組んでみます。

```vb
Private Sub Application_Reminder(ByVal Item As Object)
    If TypeOf Item Is AppointmentItem Then
        Dim message As String
        message = message & "件名　　: " & Item.Subject & vbCrLf
        message = message & "場所　　: " & Item.Location & vbCrLf
        message = message & "開始時間: " & Item.Start & vbCrLf
        message = message & "終了時間: " & Item.End & vbCrLf
        message = message & "期間　　: " & Item.Duration & "分" & vbCrLf
        MsgBox message, vbInformation + vbSystemModal, "リマインド"
    End If
End Sub
```

以下のようなウィンドウが出れば**成功**です。

![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/be165ea2-b484-e578-536c-76d730fb2b84.jpeg)

## 予告

今回の試みで Outlook リマインダーの無能さをなんとかできました。

さらなる試みとして、**より便利に**してみようかと思います。具体的には、**たまたま席を離れていてもリマインダーを受け取れる**と便利ですよね。方法としては**メールを送信する**方法、また[こちらの記事](https://qiita.com/BlueRayi/items/ffc70df12ddb8013b01c)で使った **Pushover を使用する**方法を考えています。

まあ三日坊主気質なので**いつの間にか立ち消えになっている可能性がビンビン**ですが、**万が一**次回記事が出たときはよろしくお願いいたします。