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

VBA
スポンサーリンク

Excelにはイベントプロシージャという機能があります。

これを使えば、ファイルを開いたときやデータを入力したときにプログラムを起動できます。

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

プログラムを書く画面(Visual Basic)の左側を見てみましょう。

以下のように、シートやファイルの名前が表示されているはずです。↓

Visual Basicの画面

イベントプロシージャは”Sheet1″や”ThisWorkbook”に登録します。

“ThisWorkbook”をダブルクリックしてみましょう。

すると、ウィンドウが出てきます。

ThisWorkbookのウィンドウ

左上が”Workbook”、右上が”Open”ですね。

つまり、ファイルを開いたときに自動実行するプログラムです。

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

Private Sub Workbook_Open()

MsgBox ThisWorkbook.Name

End Sub

ThisWorkbookは実行ファイルのことです。

なので、ファイルを開いたときにそのファイルの名前が表示されます。

イベントプロシージャの作り方は、

①起動条件を決める
②プログラムを書く

これだけです。

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

“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は編集対象になった(切り替え後の)シートのことを指します。

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と書いていますが、編集したときなので注意です。

SheetActivate:シートを切り替えたとき
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をコピーしました