Excelにはイベントプロシージャという機能があります。
これを使えば、ファイルを開いたときやデータを入力したときにプログラムを起動できます。
イベントプロシージャの作成方法
プログラムを書く画面(Visual Basic)の左側に、シートやファイルの名前が表示されています。
イベントプロシージャは”Sheet1″や”ThisWorkbook”に登録します。
“ThisWorkbook”をダブルクリックしてみましょう。
ウィンドウが出てきて、左上が”Workbook”、右上が”Open”になっています。
これはつまり、ファイルを開いたときにプログラムを実行するという意味です。
以下のプログラムを書いてみましょう。
Private Sub Workbook_Open()
MsgBox ThisWorkbook.Name
End Sub
これで、ファイルを開いたときにファイル名が表示されたら成功です。
①ファイルに登録する場合
“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
“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
まとめ
今回はイベントプロシージャでプログラムを自動実行する方法を解説しました。
勝手に起動してくれるので、書式統一など必ず実行したい処理があるときに便利ですね。
コメント