Outlook なんて使ってる人がどれくらいいるかはわかりませんが、うちでは標準で使用しています。
世間的に Outlook は単に “メールソフト” と思っておられる方もそこそこいるとは思いますが、結構いろんな機能がぶちこまれています (Wikipedia の主張によると個人情報管理ソフトらしい)。うちだと会議の予定とかも基本 Outlook に一元化されているので、どれだけ快適に Outlook を使用できるかが効率化において結構なポイントになります。
で、予定表があるんだから当然リマインダー機能があります。予定開始の 15 分前になるとリマインダーウィンドウがポップしてお知らせしてくれるわけです。
が、この機能正直クソの役にも立ちません。なぜかというと、最前面に表示されないのです。作業しているときに Outlook が前面に出ていることなんてまずないのでリマインダーウィンドウが出てても気づかないことがめちゃめちゃ多いです (一応タスクバーのアイコンはチカチカしますので運が良ければ目に入ります)。
無能すぎるので Outlook VBA でハックしていきます。
前準備 — 自己署名証明書取得
まず Outlook VBA でマクロを組んでいくための前準備をしていきます。
セキュリティの問題で好き勝手マクロを実行できるようにはなっていませんので、証明書を作っておくか署名なしのマクロの実行許可をしておく必要があります。後者は危険が危ないすぎるので、今回は自分用に証明書を作成しておきます。
こちらの「自己署名入りデジタル証明書を作成する」を参考にデジタル証明書を作成します。
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
**となっています。詳細な説明はこちら。なので、まずはこうなります。
Private Sub Application_Reminder(ByVal Item As Object)
' TODO
End Sub
公式によると、Item
に入ってくるのはAppointmentItem
、MailItem
、ContactItem
、TaskItem
のどれかとなっています。ここで**予定表のアイテムはAppointmentIem
**なので、場合分けとしてこうしておきます。
Private Sub Application_Reminder(ByVal Item As Object)
If TypeOf Item Is AppointmentItem Then
' TODO
End If
End Sub
では、ウィンドウを表示させるコードを書いていきます。MsgBox
の第 2 引数にvbSystemModal
を指定するとモーダルウィンドウとなり、最前面表示になります。
Private Sub Application_Reminder(ByVal Item As Object)
If TypeOf Item Is AppointmentItem Then
MsgBox "まもなく予定の時間です。", vbInformation + vbSystemModal, "リマインド"
End If
End Sub
セーブしたら適当な予定を入れてリマインダーを表示させてみましょう。こうなれば成功です。
詳細な情報も一緒に表示してみる
これだけでもかなり便利にはなりましたが、これだけだと少し寂しいですし、ぶっちゃけこちらの記事とやってること変わりませんので、もう少し踏み込んでみましょう。
AppointmentIem
は様々なプロパティをもっています。詳細は公式リファレンスを見ていただければと思いますが、まあ今回の要件で便利そうなのはおおむねこんなところでしょう。
プロパティ名 | 型 | 内容 |
---|---|---|
Subject | String | 名称 |
Body | String | 内容 |
Location | String | 場所 |
StartInStartTimeZone | Date | 開始する日付(終日では時刻なし) |
EndInEndTimeZone | Date | 終了する日付(終日では時刻なし) |
Duration | Long | 期間 |
AllDayEvent | Boolean | 終日の予定か |
IsRecurring | Boolean | 定期的な予定か |
Categories | String | カテゴリ |
Importance | OlImportance | 重要度 |
Sensitivity | OlSensitivity | 機密度 |
MeetingStatus | OlMeetingStatus | 会議の状態 |
Organizer | String | 開催者 |
OptionalAttendees | String | 任意出席者 |
RequiredAttendees | String | 必須出席者 |
Resources | String | リソース |
ResponseRequested | Boolean | 出席依頼への返信を希望しているか |
ResponseStatus | OlResponseStatus | 要請への応答 |
これを使ってウィンドウの文面をより具体的にすることができます。たとえば今回は、以下のようなコードを組んでみます。
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
以下のようなウィンドウが出れば成功です。
予告
今回の試みで Outlook リマインダーの無能さをなんとかできました。
さらなる試みとして、より便利にしてみようかと思います。具体的には、たまたま席を離れていてもリマインダーを受け取れると便利ですよね。方法としてはメールを送信する方法、またこちらの記事で使った Pushover を使用する方法を考えています。
まあ三日坊主気質なのでいつの間にか立ち消えになっている可能性がビンビンですが、万が一次回記事が出たときはよろしくお願いいたします。