次のような○×のチェックリストをExcelで作成するとします。
入力規制のリストで○×を入れて、ドロップダウンリストで選ばせる方法はよく使われますね。でも、選択項目が多くなると意外と面倒で使いづらいことないですか?
結局、実務ではコピペして使っちゃったり。。。。
なので、今回はダブルクリックするたびに
空白 → ○ → × → 空白 →・・・・
のような仕組みをVBAで作ってみます!
まず、VBAの使い方自体わからない方は、こちらの記事の最後のほうにあるボタンの中で、簡単に説明してます。そちらをチェックしてください。
VBAには、ワークシートの操作によって処理を実行する仕組みが準備してあります。
その中に「ダブルクリックしたら実行する」という便利なものがあるんです。そこに処理するためのコードを書くと、ダブルクリックするたびに実行されるわけです。では、実際にどうするのか?をスクショで説明していきます。
1.VBAを立ち上げ、Sheetを選択する
VBAを開いて左側に出る、Excelファイル内が階層表示されている箇所から、「仕組みを入れたいシート」を選択します。今回はSheet1を選択します。
2.ウインドウのWorksheetを選ぶ
シートを選択すると、図のように、ウインドウが表示されます。
ウインドウの左上にリスト選択できるところがあるので「Worksheet」を選びます。
すると無条件で下図のように何やら選択されます。
これは「シート内のセルの選択がかわったら実行する」という項目です。セルを選択するたびに実行させることができるものです。例えば、なにか入力させたくない場所、もしくは入力注意事項出したい場所のセルを選択したらメッセージを出すとかに使えます。
今回は、使いませんので後で消すことにしますが、Private Sub〜End Sub
内に命令は書いてませんので、消さなくても動作に変わりありません。
<Macの方>
私がMacでExcelを使っていた2020年前半までは、アプリ自体の不具合で、オブジェクトのWorksheetすら選択できませんでした。Private Sub〜End Subまでをシートのウインドウに直接コピペすることで回避してくださいと公式に案内があったぐらいです。ですが、2019年から1年も改善放置されていたわけですから、さすがに今は使えるでしょう。まだ選択できない方はコピペしましょう。(私はExcel for Macを使うのやめたので現状どうなのかわかりません)
3.イベントのBefore DoubleClickを選択する
上の「2.ウインドウのWorksheetを選ぶ」で「Worksheet」を選択したリストボックスの右側のリストボックスを使います。
そのリストボックスの中にイベントリストがあるので、その中から「Before DoubleClick」を選びます。
4.最初に出てきた不要な部分を消す
リストからイベントを選択すると、それにあった記入欄が自動的に作成されます。
今回は使う所だけ残して消しましょう。消し方は直接カーソルを合わせてDeleteします。メモやワードと一緒です。先に説明しましたが、残しておいても問題はありません。わかりにくいので消しておくだけです。
5.コードを記入する
さあ、コードを記入します。記入する場所は、イベントを選択したときに作成された、Private Sub〜End Subの間に書きます。
まず、コードはこうなります。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim r As Integer, c As Integer
With ActiveCell
r = .Row
c = .Colum
If r >= 3 And r <= 5 And c >= 2 And c <= 5 Then
Select Case .Value
Case ""
.Value = "○"
Case "○"
.Value = "×"
Case "×"
.Value = ""
End Select
Cancel = True
End If
End With
End Sub
このコードに解説を併記してみます。
これで始めの表の黄色の部分はダブルクリックするたびに○×が変わり、○×以外の値の場合は普通のExcelの動きをします。
このサンプルコード内の行、列の範囲を変えれば別の表にも使えます。今回の趣旨とは少しずれるのであまり深く掘り下げませんが、2つ以上の表やエリアを指定したいときは、IF〜Then
の条件の書き方を変えれば設定できます。「もう!ちまちま考えるのがめんどくさい!(笑)」という方は、IF文を複数続けて書いちゃえば解決します。
簡単に下の図でまとめておきます。
また、Select Case
の内容を工夫すればラジオボタンのように、複数項目のうち1つだけしか選べないようにすることも可能です。例えば1つ選ばれたら、他は消すという命令を入れるなどです。
VBAに慣れている方は、そんな面倒なことしなくてもラジオボタンをActiveXで作成すればいいじゃないかとお思いでしょうが、これがMacの場合、ActiveXが使えません。フォームコントロールは使えますが意外と自由度がない。そうなるとワークシート上でセルを使って工夫したほうが使いやすい。。。。OSを選ばずになんとかしたいなら、なるべくそのOSに特化した機能は使わないように別の方法を考えないといけません。WinとMacが仲良しになれば解決するんですけどね(笑)
話がずれたので戻します。このサンプルコードについてもう少し解説しますと、
ActiveCell
はTarget
としてもこの中では動きます。この中でという言い方をしたのは、自動的に生成されたコードの最初の文Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
のカッコの中に、ByVal Target As Range, Cancel As Boolean
とあります。これはこのコードのくくりの中なら、選択されたセルの情報をTarget
として、ダブルクリックした行為の可否をCancel
をスイッチとして使えますよということです。
ここでActiveCell
で紹介しているのは、使い勝手がよいからです。実はTarget
ですと操作対象が結合セルの場合、このサンプルはエラーで止まります。厳密に言えばActiveCell
とはTarget
は違うんです。なんかこの先は面倒くさそうですよね(笑)なのでActiveCell
としてます。もし、VBAをよく使う方は、シートを指定して.Cells
を使ったほうがよりいいかもしれません。
もう一つのCancel
についてです。
サンプルコードの中にもCancel=True
と「ダブルクリックしたことを無かった事とする」で登場しています。
この行を省略するとどうなるかといいますと、Excelの通常操作でダブルクリックをしてセルを選択した時と同じ挙動をします。これを今回の場合で説明しますと、ダブルクリックしたあと、サンプルコードの命令が動いて、○、×、空白のいずれかがセルに入力されます。そのあと、セルが選択された状態のまま止まります。セルの値のあとにカーソルが点滅している状態です。
それでもよければ省略してもいいのですが、セルの編集をした後、みなさんもEnterキーを押しますよね?このCancel=True
は、その「Enterキーを押す」処理と同じことだと思ってください。
現在ExcelVBAでファイル操作の記事を作成中です。そのあとにでもこの仕組で図形で作った○印を有・無や男・女などの所定の場所に表示するものなどを紹介しようかなと思います。
- 加筆
- 2021年9月20日 コードを1つに修正
- 2022年2月16日 複数エリアの簡易説明追加