スポンサーリンク

Excelマクロを自動実行する方法|イベントプロシージャ

Excelにはイベントプロシージャという機能があります。
これを使えば、ファイルを開いたときやデータを入力したときにプログラムを起動できます。

イベントプロシージャの作成方法

イベントプロシージャを登録する場所の図

プログラムを書く画面(Visual Basic)の左側に、シートやファイルの名前が表示されています。
イベントプロシージャは”Sheet1″や”ThisWorkbook”に登録します。
“ThisWorkbook”をダブルクリックしてみましょう。

WorkBookを開いたときに起動するプログラムを書くウィンドウ

ウィンドウが出てきて、左上が”Workbook”、右上が”Open”になっています。
これはつまり、ファイルを開いたときにプログラムを実行するという意味です。

以下のプログラムを書いてみましょう。

Private Sub Workbook_Open()

MsgBox ThisWorkbook.Name

End Sub

これで、ファイルを開いたときにファイル名が表示されたら成功です。

①ファイルに登録する場合

“ThisWorkbook”にプログラムを登録する場合です。

ThisWorkbookに登録する図

Workbook_Open:ファイルを開いたとき

WorkBookを開いたときに起動するプログラムを書くウィンドウ

右上を”Open”にするとファイルを開くときに実行します。

例えば以下のコードで、ファイルを開いたときに1枚目のシートが必ず表示されます。

Private Sub Workbook_Open()

Worksheets(1).Activate

End Sub

以下のコードは、ファイルを開いたときに書式を整えてくれます。

Private Sub Workbook_Open()

Cells.Font.Name = "Meiryo UI"
Cells.Font.Size = 11
Cells.Font.Color = vbBlack

End Sub

Workbook_BeforeClose:ファイルを閉じるとき

Workbookを閉じたときに実行するコードを書くウィンドウ

右上を”BeforeClose”にするとファイルを閉じるときに実行します。

次のコードは、ファイルを閉じるときにフォントを整えてくれます。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

For i = 1 To Worksheets.Count
    Worksheets(i).Cells.Font.Name = "游ゴシック"
    Worksheets(i).Cells.Font.Size = 12
Next i

End Sub

【関連記事】Excelマクロで書式を設定する方法

例えば以下のコードは、A1セルが入力されているかをチェックしてくれます。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If Cells(1, 1) = "" Then
    MsgBox ("A1が入力されていません")
    Cancel = True
End If

End Sub

他には、スペースを削除すると書式統一に便利だったりします。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

endRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To endRow
    Target = Cells(i, 1)
    Target = Replace(Target, " ", "")
    Target = Replace(Target, " ", "")
    Cells(i, 2) = Target
Next i

End Sub

【関連記事】Excelマクロで文字を置換する方法

Workbook_Activate:ファイルを編集対象にしたとき

Workbookがアクティブになったときに実行するコードを書くウィンドウ

右上を”Activate”にするとファイルがアクティブ(編集対象)になったときに起動します。

例えば、どのファイルが編集対象になったか調べることができます。

Private Sub Workbook_Activate()

MsgBox ThisWorkbook.Name

End Sub

Workbook_SheetActivate:シートを切り替えたとき

シートが切り替わった時に実行するコードを書くウィンドウ

右上を”SheetActivate”にするとシートを変えたときに起動します。

以下のコードは、切り替えたシートの名前を表示してくれます。

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

MsgBox Sh.Name

End Sub

“ByVal Sh As Object”は、”Sh”が今回対象になるシートであることを意味しています。

Workbook_SheetChange:シートを編集したとき

シートを編集したときに実行するコードを書くウィンドウ

右上を”SheetChange”にすると、シートを編集したときに起動します。

例えば、以下のコードで編集した位置を取得できます。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Sheet = Sh.Name
r = Target.Row
c = Target.Column
MsgBox Sheet & "の" & r & "行" & c & "列"

End Sub

SheetChangeと書いていますが、編集したときなので注意しましょう。

②シートに登録する場合

シート単位でイベントを登録することができます。
個別のシートに登録するので、別のシートでは実行されません。

シートにイベントプロシージャを登録する図

好きなシートをダブルクリックするとウィンドウが現れ、左上が”Worksheet”になります。

Worksheet_SelectionChange:セルの選択を変えたとき

セルを選択したときに実行するコードを書くウィンドウ

右上を”SelectionChange”にすると、セルを選択したときに起動します。

以下のコードは、選択したセルの行を取得します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

MsgBox Target.Row

End Sub

ここで、Targetとは選択されたセル自身を指します。

Worksheet_Activate:シートを編集対象にしたとき

セルをアクティブにしたときに実行するコードを書くウィンドウ

右上を”Activate”にすると、シートがアクティブになったときに起動します。

以下のコードは、編集対象にしたシート名を表示してくれます。

Private Sub Worksheet_Activate()

MsgBox ActiveSheet.Name

End Sub

Worksheet_Change:シートを編集したとき

セルを編集したときに実行するコードを書くウィンドウ

右上を”Change”にすると、シートを編集したときに起動します。

例えば、もし編集したセルが1行目の場合だけプログラムを起動することが可能です。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Row = 1 Then
    MsgBox Target.Value
End If

End Sub

または、入力したデータの値に合わせて処理を変えることもできます。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Value = "A" Then
    MsgBox Target.Value & "が入力されました"
End If

End Sub

入力した文字を結合して、別のセルに出力することも可能です。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column < 3 Then
    text1 = Cells(Target.Row, 1)
    text2 = Cells(Target.Row, 2)
    text3 = text1 & " " & text2
    Cells(Target.Row, 3) = text3
End If

End Sub

まとめ

今回はイベントプロシージャでプログラムを自動実行する方法を解説しました。
勝手に起動してくれるので、書式統一など必ず実行したい処理があるときに便利ですね。

コメント

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