ブックを開いたときにマクロを自動実行するには、イベントプロシージャのWorkbook_Open
を使います。これを個人用マクロブックで応用することで、活用範囲を広げる方法を紹介します。
マクロ有効ブックでないブック(.xlsx)を開いたときにも動作させられます
規定・定型ファイルなど拡張子を変更したくない場合に有効です
マクロは一つに集約できます
自動実行するブックのすべてに作成する必要がありません
個人用マクロブック(PERSONAL.xlsb)に保存
個人用マクロブックにイベントプロシージャとして保存します。
VBEのプロジェクトエクスプローラーで、VBAProject (PERSONAL.XLSB) > Microsoft Excel Objects > ThisWorkbook をダブルクリックして、エディター領域にコードを貼り付けてください。
個人用マクロブックについてはこちらを参照してください。
マクロコード
ここでは、以下のトピックで紹介したブックを開いたときに期限を通知するマクロを例に説明します。
Option Explicit
'------------------------------------
'Excelアプリのオブジェクト変数
Private WithEvents appXL As Application
'------------------------------------
'Excel起動時(PERSONAL.xlsbオープン時)の処理。オブジェクト変数セット
Private Sub Workbook_Open()
Set appXL = Application
End Sub
'------------------------------------
'ブックオープン時の処理
Private Sub appXL_WorkbookOpen(ByVal WB As Workbook)
Const nameSht As String = "期限シート"
Const nameRng As String = "期限リスト"
Dim aryDay
Dim aMsg1 As String, aMsg2 As String
Dim i As Long, m As Long
' PERSONAL.xlsbのオープンは対象外
If WB Is ThisWorkbook Then GoTo EXTSUB
' 指定の名前が付いた範囲がないブック(エラーになる)は対象外
On Error GoTo EXTSUB
aryDay = WB.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
aMsg2 = aMsg2 & vbCrLf & aryDay(i, 2) & "の期限が " & m & "日後です"
End Select
Next i
If aMsg1 & aMsg2 = "" Then GoTo EXTSUB
If aMsg1 = "" Then aMsg1 = aMsg1 & vbCrLf & vbCrLf
MsgBox aMsg1 & aMsg2, vbInformation, "直近の期限"
EXTSUB:
Set WB = Nothing
End Sub
Private WithEvents appXL As Application
WithEvents
キーワードを使用してExcelアプリケーションオブジェクトの変数 appXL
を宣言しています。これにより、appXL
でブックを開くイベントに反応できるようになります。
Private Sub Workbook_Open()
Excel起動時に個人用マクロブック(PERSONAL.xlsb)が開かれたときの処理です。ここでは変数 appXL
にオブジェクトをセットするだけです。
Private Sub appXL_WorkbookOpen(ByVal WB As Workbook)
何らかのブックが開かれたときの処理です。開いたブックは変数 WB
にセットされます。
個人用マクロブックのオープン時(Excelの起動時)は除外します。WB
が ThisWorkbook
(マクロ保存先ブック)は処理をスキップしています。
自動実行の対象にしないブックが開かれた場合にも処理をスキップします。ここでは、所定の名前のシートと範囲がない場合にスキップしています。ファイル名で判別するなど用途に応じてカスタマイズしてください。
同じ構造の応用で次のようなこともできます。