5
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

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

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に入ってくるのはAppointmentItemMailItemContactItemTaskItemのどれかとなっています。ここで予定表のアイテムは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

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

01.jpg

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

これだけでもかなり便利にはなりましたが、これだけだと少し寂しいですし、ぶっちゃけこちらの記事とやってること変わりませんので、もう少し踏み込んでみましょう。

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

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

02.jpg

予告

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

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

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
5
Help us understand the problem. What are the problem?