イベントとは【Excel】

【アイキャッチ】ExcelVBA_イベント 03.モジュールとプロシージャ

イベントとは、Excel で特定の操作が行われたことを Excel から VBA に通知する仕組みです。イベント用の特別な手順を作成することにより、特定の操作でマクロを自動的に実行できます。
たとえば、Excel ワークブックを開くと、ワークブックを表す Workbook オブジェクトの Open イベントが発生します。 Open イベントが発生すると、Open イベントに割り当てられた特別な手順が自動的に実行されます。

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

Excelのイベントプロシージャは「ブック」と「シート」に分かれます。ここでは「ブック」「シート」のそれぞれのプロシージャの作り方を紹介します。
まずは「開発」タブ-「VisualBasic」ボタンをクリックし「VBE」を開き準備します。

ブックに対してのイベントプロシージャの作り方

プロジェクトエクスプローラから対象ブックのの「ThisWorkbook」をダブルクリックします。
コードウィンドウの「オブジェクト」ボックスで「WorkBook」を選択します。「プロシージャ」ボックスは自動的に「Open」が選択され、下記プロシージャが記述されます。目的がブックが開く時のイベントであれば、このままプロシージャを記述します。違うイベントを作成したい場合は、「プロシージャ」ボックスからイベントを選択し、自動作成された「Open」イベントは削除します。

イベントとは1

特定シートに対してのイベントプロシージャの作り方

プロジェクトエクスプローラから対象ブックのの「対象のシート」をダブルクリックします。
コードウィンドウの「オブジェクト」ボックスで「WorkSheet」を選択します。「プロシージャ」ボックスは自動的に「SelectionChange」が選択され、下記プロシージャが記述されます。

イベントとは2

目的がシートでセルの選択範囲で変更したときのイベントであれば、このままプロシージャを記述します。違うイベントを作成したい場合は、「プロシージャ」ボックスからイベントを選択し、自動作成された「SelectionChange」イベントは削除します。

引数について
イベントによっては引数が指定されます。SelectionChangeイベントの場合は「(ByVal Target As Range)」という引数が指定あれましたが
 ・ByVal:値渡しで
 ・Target:Targetという名前(変数)の
 ・As Range:Range型
という考えた方になります。「ByVal」は気にしなくていいです。プロシージャ内で「Target」変数が使えるようになり「Target」変数には編集されたセルの情報が格納されます。
下記のように記述すると選択したセルが表示されます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    MsgBox Target.Address
End Sub

シート共通のイベントプロシージャの作り方

全てのワークシートのイベントプロシージャを作る時はブックの「Workbook_SheetXXXXXX」を利用します。

イベントとは3

ブックのイベント

ブックのイベントで利用できる代表的なイベントを紹介します。

Workbook_BeforeClose(Cancel As Boolean)

ブックを閉じる前に発生するイベント。「Cancel=True」とプロシージャに指定するとブックを閉じることを中止することができます。

Workbook_BeforePrint(Cancel As Boolean)

印刷する前に発生するイベント。「Cancel=True」とプロシージャに指定すると印刷を中止することができます。

Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

ブックを保存する前に発生するイベント。「SaveAsUI=True」の場合別名保存している場合です。例えば下記のような記述ができます。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If SaveAsUI Then
        MsgBox "別名保存は許可しません。"
        Cancel = True
    End If
End Sub

Workbook_NewSheet(ByVal Sh As Object)

新しいシート追加した時に発生するイベント。「Sh」はシート情報を格納しています。
例えば、下記のように記述するとシート追加時に必ずA1セルに現在んぼ日付をセットします。

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    Sh.Range("A1") = Date
End Sub

Workbook_Open()

ブックを開いたときに発生するイベント。

シートのイベント

シートのイベントで利用できる代表的なイベントを紹介します。

Worksheet_Activate()

ワークシートがアクティブになったとき発生するイベント。

Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

セル上でダブルクリックした時に発生します。セルをダブルクリックするとセルが編集状態になります。このイベントを使うことで編集を取りやめすることができます。下記サンプルは1行目でダブルクリックされた場合、セルを編集できないようにしています。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Row = 1 Then
        Cancel = True
    End If
End Sub

Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

セル上で右クリックした時に発生します。右クリックするとコンテキストメニューが表示されますが、「Cancel=True」を指定することでコンテキストメニューの表示を取りやめことができます。下記サンプルは1行目で右クリックされた場合、コンテキストメニュー表示をとりやめます。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Row = 1 Then
        Cancel = True
    End If
End Sub

Worksheet_Change(ByVal Target As Range)

セルのデータが変更されたときに発生します。変数Targetでセルの位置を確認できます。
下記サンプルでは、2行目のセルに入力されたデータの書式を太字に更新します。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 2 Then
        Target.Font.Bold = True
    End If
End Sub

Worksheet_Deactivate()

ワークシートがアクティブでなくなった場合に発生するイベント。
下記サンプルは他のシートを選択できないようにします。

Private Sub Worksheet_Deactivate()
    MsgBox "他のシートは選択できません。"
    Me.Activate
End Sub

Worksheet_SelectionChange(ByVal Target As Range)

選択されたセルが変更されたときに発生するイベント。
下記サンプルは10行目以降を選択できないようにしています。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row >= 10 Then
        MsgBox "10行目以降は選択できません。"
        Range("A1").Activate
    End If
End Sub

コメント

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