マクロ非搭載のブックを開いたときにマクロを自動実行する

ブックを開いたときにマクロを自動実行するには、イベントプロシージャの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にセットされます。

個人用マクロブックが開かれたときも含まれるので、WBがThisWorkbook(マクロ保存先ブック)は処理をスキップしています。

自動実行の対象にしないブックが開かれた場合にも処理をスキップします。ここでは、所定の名前のシートと範囲がない場合にスキップしています。ファイル名で判別するなど用途に応じてカスタマイズしてください。

 

タイトルとURLをコピーしました