シートイベントのダブルクリックでセルの入力値を切り替える処理の解説
作成したい入力例
まず、この画像のような表があるとします 毎日なんらかの確認作業を行い、確認完了後にチェックを付ける表です
単純に○を入力するだけのなんてことない表ですが、これが項目数が大量にあった場合は結構大変になります 画像は結果表示なので一気に入力されてますが、実際は1つずつ入力する必要があります
そこで、セルをダブルクリックするだけでチェックを入力 して、間違った時のことも考えて、ダブルクリックで○と空白を切り替えるようにします こうすると、結構入力が楽になります
まずは、処理上選択されているセル範囲のみで実行する必要があります 見出しや日付のセルに○が入力されると困ります
名前定義セルの作成
名前の管理ボタンの場所
処理したいセル範囲を選択して、数式タブにある名前の管理ボタンからセル範囲に名前定義を作成します
名前の管理画面から新規作成ボタンを選択します
表示された新しい名前画面から、新規作成内容を設定します 名前はなんでも構いませんが、範囲はシート範囲にするようにしてください
シートを複製しても処理が問題なく動作できるように、名前定義の範囲を限定しておきます
また、画面作成をおこなわずにコードで行いたい場合は以下の記事から行ってください
シートイベントの作成
イベントの作成
シートのイベントプロシージャで処理を作成していきます
今回の処理では、ユーザーの意思による操作で誤操作の可能性の低いダブルクリックを選択 します ダブルクリックは、ワークシート上では編集モードに入る操作なので無意識にしてしまうことは少ないのでこういった処理に向いています
ダブルクリックをしたときに発生するイベントが「BeforeDoubleClick」イベントになりますのでシートモジュールでプロシージャボックスから選択して作成してください
作成したコード
今回作成したコードがこのような形になっています
コード解説
コードコピー Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Range("チェック範囲"), Target) Is Nothing Then
Cancel = True
If Target = "○" Then
Target.ClearContents
Else
Target = "○"
End If
Else: End If
End Sub
このコードでは、ダブルクリックされたセルが指定範囲であれば入力処理を実行します 入力処理では、空白セルには○を入力し、○が入力されていれば消去する処理です
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
シートイベントです。 シートのセルをダブルクリックした後に発生するイベントで、引数Targetにダブルクリックしたセルが代入されます
Targetにはセル範囲が代入されますので、単一セルとは限りません ですが、ダブルクリックはExcelの仕様上必ず1セルに限定されます この仕様からもダブルクリックイベントは使いやすいです
If Not Intersect(Range("チェック範囲"), Target) Is Nothing Then
~~ 中略 ~~
Else: End If
ここでTargetセル範囲と名前定義したセル範囲で処理実行するセル範囲かを判定しています このセル範囲判定に関しては以下の記事で詳しく解説しています
Cancel = True
このコードを実行すると、既定の動作をキャンセルします イベントによって規定の動作は変わります
ここではセルの編集モードに入るのをキャンセルします 最後に解説しますが、入力モードに入られると非常にわずらわしいです
If Target = "○" Then
Target.ClearContents
Else
Target = "○"
End If
最後に入力処理になります
If分岐でセルに○が入力されているかで分岐します ○が入力されていれば、ClearContentsメソッドにより入力内容を消去します ○以外であれば、○を入力します
○以外の別の文字列でも○を入力します これはCOUNTIF関数を使用したことがある人は分かるかもしれませんが、○をカウントするのに別の文字を入力されていてうまく個数が取得できないことがあります そういったことを回避する意味でも指定文字以外なら指定文字にしてしまいます
動きの解説
○が入力される動き
まずは空白セルに○を入力する動きです セル範囲が処理実行可能範囲なので、処理が実行されます またCancelにTrueを代入することで、ダブルクリックしたセルが編集モードに入りません
空白セルで○以外セルなので、○が入力されてい処理が完了です
セルが空白になる動き
今度は○が入力されているセルをダブルクリックしたときの動きです
今回は○が入力されているため、そのセルは空白になります
処理範囲外の動き
最後に処理が許可されていない範囲をダブルクリックしたときの動きです
日付セルは名前定義したセルとは重複していない ため、最初のIf分岐で何も処理を実行しない形になっています
このとき、Cancelも変更されていないため、通常の操作通りセルの編集モードに入っていることが確認できます
この処理は、入力処理ですが非常に応用範囲が広い内容です
例えばセルへのデータ入力ではなく書式設定の変更を行えばダブルクリックでセルの背景色を切り替えたりできます ユーザーフォームの表示処理を行うことも可能です、この場合表示ボタンが必要なくなります
まずは入力処理から行って、動きが確認できたら色々な設定変更を行ってみてください