こんにちは、Ryoです。
何らかの操作時に処理を行うプロシージャとしてイベントプロシージャがありますが、用途によってはイベントの有効/無効を切り替えることで更に使い勝手を良くすることができるケースもあるかと思います。今回はシートに配置したボタンでイベントON/OFFを切り替えるサンプルについて書いていこうと思います。
1.サンプル概要
Sheet1のシートモジュールにWorksheet_Changeイベントとして、入力された値が50を超える場合は全て「50」として入力される形にしてあります。

120と入力しEnterで確定すると、イベント処理通り50となります。

このイベント処理に対し、有効/無効の切り替えを行っていきます。ワークシート上に配置したボタンをクリック毎に「Event ON」「Event OFF」と表示文字列も合わせて切り替えます。
≪Event ON≫

≪Event OFF≫

一連の動作としては以下動画に簡単にまとめています。
以上がサンプル概要になります。
2.サンプルコード
◆シートモジュール(Sheet1)
Private Sub Worksheet_Change(ByVal Target As Range) '※ ワークシート(Sheet1)の値が変更になった際に処理を行う '入力された値をチェックし、50を超える場合は '「50」として入力する If Target.Value > 50 Then Target.Value = 50 '本例の場合、文字列を入力してもイベントが有効であれば '「50」として入力される End Sub
シートモジュールではChangeイベントを使用して「Sheet1」ワークシートのセルの値が変更された際に処理を行っています。入力された値が50を超える場合、そのセルの値を強制的に「50」とします。
このイベント処理に対し、Sheet1に配置したボタンをクリックすることで有効/無効を切り替える処理を実行しているのが以下標準モジュールのサンプルコードになります。
◆標準モジュール(シート上のボタンへの割付け)
Sub ボタン1_Click()
'※Sheet1のシートモジュールに記述したWorksheet_change
' イベントに対し、ボタンを推す毎にイベント有効(Event ON)と
' 無効(Event OFF)を切り替える処理を行うサンプル
'Sheet1上のコマンドボタンに対する処理
' (・・・Sheet上に作成するボタンは図形扱い)
With Worksheets("Sheet1").Shapes(1).TextFrame.Characters
'ボタンのテキストが”Event ON”以外での処理
If .Text <> "Event ON" Then
'フォント設定
.Font.Name = "メイリオ"
.Font.Size = 14
.Font.Color = RGB(0, 0, 255)
'ボタン上に表示されるテキスト文字列指定
.Text = "Event ON"
'イベントを有効(=True)
Application.EnableEvents = True
'テキスト文字が”Event ON”の場合の処理
Else
'フォント設定
.Font.Name = "游ゴシック"
.Font.Size = 12
.Font.Color = RGB(255, 0, 0)
'ボタン上のテキスト文字列を指定
.Text = "Event OFF"
'イベントを無効(=False)
Application.EnableEvents = False
End If
End With
End Sub
配置されたボタンは図形扱いとなるので、Worksheets(“Sheet1″).Shapes(1)として指定しています。シート上にボタンしかないサンプルなのでShapes(1)=1番目の図形と指定していますが、複数の場合は(”ボタン1”)のように図形名を指定しても良いかと思います。
クリックする毎にON/OFFを切り替えるので文字表示も合わせて変えていきます。表示文字列に対する処理であればWorksheets(“Sheet1”).Shapes(1).TextFrame.Charactersメソッドを使用し、フォント指定や文字列指定を行うことが可能です。
後はイベントの有効/無効をそれぞれの分岐処理で指定するので、EnableEventsプロパティを利用します。
構文:オブジェクト.EnableEvents = True/False
EnableEventsプロパティはTrueでイベントを有効、Falseで無効とします。サンプルではボタンクリック毎に表示文字列「Event ON」で有効(True)と「Event OFF」で無効(False)を切り替えているので、ワークシートの入力された値がイベントON/OFFにより変わるという形になります。
3.まとめ
シートモジュールに記述したイベント処理を常時有効にするような形が一般的ですが、そのイベント処理のON/OFFをスイッチ的な形で切り替えることは可能なのだろうかと思い、書いてみた次第です。
私自身も過去に製作したものを使用している中で一時的にイベント処理をオフにしたいケースもあるので、知っておくと有用なこともあるかと思います。
以上、イベントの有効/無効の設定、及び切り替え処理を行う方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo

