Excelにはイベントプロシージャという機能があります。
これを使えば、ファイルを開いたときやデータを入力したときにプログラムを起動できます。
イベントプロシージャの作成方法
![イベントプロシージャを登録する場所の図](https://htomblog.com/wp-content/uploads/2021/01/image-71.png)
プログラムを書く画面(Visual Basic)の左側に、シートやファイルの名前が表示されています。
イベントプロシージャは”Sheet1″や”ThisWorkbook”に登録します。
“ThisWorkbook”をダブルクリックしてみましょう。
![WorkBookを開いたときに起動するプログラムを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-72.png)
ウィンドウが出てきて、左上が”Workbook”、右上が”Open”になっています。
これはつまり、ファイルを開いたときにプログラムを実行するという意味です。
以下のプログラムを書いてみましょう。
Private Sub Workbook_Open()
MsgBox ThisWorkbook.Name
End Sub
これで、ファイルを開いたときにファイル名が表示されたら成功です。
①ファイルに登録する場合
“ThisWorkbook”にプログラムを登録する場合です。
![ThisWorkbookに登録する図](https://htomblog.com/wp-content/uploads/2021/01/image-73.png)
Workbook_Open:ファイルを開いたとき
![WorkBookを開いたときに起動するプログラムを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-72.png)
右上を”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を閉じたときに実行するコードを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-74.png)
右上を”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:ファイルを編集対象にしたとき
![Workbookがアクティブになったときに実行するコードを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-75.png)
右上を”Activate”にするとファイルがアクティブ(編集対象)になったときに起動します。
例えば、どのファイルが編集対象になったか調べることができます。
Private Sub Workbook_Activate()
MsgBox ThisWorkbook.Name
End Sub
Workbook_SheetActivate:シートを切り替えたとき
![シートが切り替わった時に実行するコードを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-76.png)
右上を”SheetActivate”にするとシートを変えたときに起動します。
以下のコードは、切り替えたシートの名前を表示してくれます。
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name
End Sub
“ByVal Sh As Object”は、”Sh”が今回対象になるシートであることを意味しています。
Workbook_SheetChange:シートを編集したとき
![シートを編集したときに実行するコードを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-77.png)
右上を”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と書いていますが、編集したときなので注意しましょう。
②シートに登録する場合
シート単位でイベントを登録することができます。
個別のシートに登録するので、別のシートでは実行されません。
![シートにイベントプロシージャを登録する図](https://htomblog.com/wp-content/uploads/2021/01/image-78.png)
好きなシートをダブルクリックするとウィンドウが現れ、左上が”Worksheet”になります。
Worksheet_SelectionChange:セルの選択を変えたとき
![セルを選択したときに実行するコードを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-79.png)
右上を”SelectionChange”にすると、セルを選択したときに起動します。
以下のコードは、選択したセルの行を取得します。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Row
End Sub
ここで、Targetとは選択されたセル自身を指します。
Worksheet_Activate:シートを編集対象にしたとき
![セルをアクティブにしたときに実行するコードを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-80.png)
右上を”Activate”にすると、シートがアクティブになったときに起動します。
以下のコードは、編集対象にしたシート名を表示してくれます。
Private Sub Worksheet_Activate()
MsgBox ActiveSheet.Name
End Sub
Worksheet_Change:シートを編集したとき
![セルを編集したときに実行するコードを書くウィンドウ](https://htomblog.com/wp-content/uploads/2021/01/image-81.png)
右上を”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
まとめ
今回はイベントプロシージャでプログラムを自動実行する方法を解説しました。
勝手に起動してくれるので、書式統一など必ず実行したい処理があるときに便利ですね。
コメント