
VBAはなんと、プログラムを起動することすら自動化できます。
今回は誰でも自動化できるようにイベントプロシージャについて解説します。
私はfor文すら知らないプログラミングのド素人からVBAとPythonを独学しました。
会社では通常業務に加えて作業自動化と機械学習をしています。

・マクロを起動することすらめんどくさい
・ファイルを開いたら勝手に起動してほしい
・誰がファイルを使っても同じ結果になってほしい
こんな悩みを解決する記事です。
Excelにはイベントプロシージャという機能があります。
これを使えば、ファイルを開いたときやデータを入力したときに、勝手にプログラムを起動してくれます。
イベントプロシージャの作成方法
プログラムを書く画面(Visual Basic)の左側を見てみましょう。
こんな感じで、シートやファイルの名前が表示されているはずです。↓

イベントプロシージャは”Sheet1″や”ThisWorkbook”に登録します。
“ThisWorkbook”をダブルクリックしてみましょう。
すると、ウィンドウが出てきます。

左上が”Workbook”、右上が”Open”ですね。
これがつまり、ファイルを開いたときに自動実行するプログラムです。
以下のプログラムを書いてみましょう。↓
Private Sub Workbook_Open()
MsgBox ThisWorkbook.Name
End Sub
ThisWorkbookは実行ファイルのことです。
なので、ファイルを開いたときにそのファイルの名前が表示されます。
イベントプロシージャの作り方は、たったのこれだけ。
②プログラムを書く
実行タイミングの例

具体的に、どんなタイミングで実行できるの?
ということを解説します。
①ファイル単位で登録する場合
“ThisWorkbook”をダブルクリックして、プログラムを登録する場合です。

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

右上を”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:ファイルを閉じるとき

右上を”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
書式変換の自動化については、以下の記事で詳しく解説しています。
以下のコードは、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
Workbook_Activate:ファイルを編集対象にしたとき

右上を”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
ここで、Shに注目しましょう。
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と書いていますが、編集したときなので注意。
SheetChange:シートを編集したとき
②シート単位で登録する場合
シート単位でイベントを登録することができます。

好きなシートをダブルクリックするとウィンドウが現れ、左上が”Worksheet”になっています。
個別のシートに登録するので、別のシートでは実行されません。

全シートで実行したいなら、ThisWorkbookに登録しましょう。
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

入力したデータをそのまま受け取れると、
色々なプログラムに応用できます。
まとめ
今回はイベントプロシージャでプログラムを自動実行する方法を解説しました。
コメント