ファイルを開いたときに、当日または近日中に行う処理についての通知を自動表示するマクロです。
同じファイルを毎日のように開いて入力を行うが、特定の日には異なる処理が必要といった業務はよくあると思います。そして「特定の日」の部分をついスルーしてしまうということも…。
ならば、そのファイル自体にイベントを登録して通知を出すようにしようというわけです。
準備:期限リストの作成
1列目に日付、2列目に内容を入力したリストを作成し、リストの範囲に名前を設定します。名前は、[数式]タブの[名前の定義]から設定できます。
リストの作成後は、そのワークシートが邪魔な場合は非表示にしても構いません。
マクロコード
標準モジュールに登録します。プロシージャ名 Auto_Open
は変更不可です。
Private Sub Auto_Open()
Const nameSht As String = "期限Sheet" '期限リストのあるシート
Const nameRng As String = "期限List" '期限リストの範囲の名前
Dim aryDay '期限リストを格納する配列
Dim aMsg1 As String, aMsg2 As String
Dim i As Long, m As Long
On Error GoTo EXTSUB
aryDay = ThisWorkbook.Sheets(nameSht).Range(nameRng)
For i = 1 To UBound(aryDay)
m = aryDay(i, 1) - Date
Select Case m
Case 0 '期限当日
aMsg1 = aMsg1 & vbCrLf & aryDay(i, 2) & " の期限は【本日】です!!"
Case 1 To 3 '1~3日後期限
aMsg2 = aMsg2 & vbCrLf & m & "日後 : " & aryDay(i, 2)
End Select
Next i
If aMsg1 & aMsg2 = "" Then GoTo EXTSUB
If aMsg1 <> "" Then aMsg1 = aMsg1 & vbCrLf & vbCrLf
MsgBox aMsg1 & aMsg2, vbInformation, "直近の期限"
EXTSUB:
End Sub
Workbook_Open と Auto_Open
ファイルを開いたときに自動実行するマクロとしては、イベントプロシージャのWorkbook_Open
のほうが主流ですが、標準モジュールの Auto_Open
もあります。
実用上の重要な違いは、ほかのブックのマクロからブックが開かれた場合に、Workbook_Open
は実行される、Auto_Open
は実行されない という点です。今回のようなルーティン業務のブックは、集計などでほかのマクロから開かれることもありうるので、その際にメッセージが表示されて処理中断になることを避けるため、Auto_Open
を用いました。
Auto_Openは旧バージョンとの互換用なので使用は控えるべきという説もあるのですが、筆者はそう警戒しなくてもよいと思います。365になっても普通に使えますし、積極的に廃止する理由もないでしょうから。
応用について
マクロ有効ブック(xlsm)にしたくない場合や、複数のファイルでオープン時の自動実行を行いたい場合は、こちらの方法で応用できます。