category name  »  page title date

セルのトグルスイッチ

画像のトグルスイッチ」では、けっこう無理をして、オリジナル画像のスイッチを配置しました。
画像でなくて、文字で代用するのでかまわない、というのであれば、もっと簡単に実現できます。やってみました。

左のような感じで、スイッチ欄を配置します。ここでは、C列の5~14行をスイッチにしました。できるだけそれらしく見えるよう、セルの書式を整えてあります(青色で塗りつぶして白い罫線で囲んだだけですが)。
この、スイッチのセルを選択したときだけ、選択されたセルの値が ON/OFF されるようにしてあります。マウスでの選択は、クリックですから、あたかもそこをクリックしてトグルするように見えます。

ところでこの図を見ると、行1の高さと列Aの幅が 0 になっている点に留意しておいてください。

やりかたは、以下のとおりです。「セルを選択したとき」なので Worksheet_SelectionChange() イベントを利用します。簡単ですので、次のコードを見てください。
終わりかけに選択を A1 セルに飛ばしているのは重要です。これを「箸置き」と言っていますが、こうしておかないと、同じスイッチを続けてクリックすることができません。Selection が Change されませんからね。箸置きが目立たないように、行1と列Aを見えないようにしたのでした。

ワークシート

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      'スイッチの範囲外なら何もしない
      If Target.Column <> ColumnNum Then Exit Sub
      If Target.Row < StartRow Then Exit Sub
      Application.EnableEvents = False
      'スイッチがクリックされた時に実行する関数
      SwitchClicked Target.Row
      '選択を箸置きに戻す
      ActiveSheet.Range("A1").Select
      Application.EnableEvents = True
End Sub

こうした後で、標準モジュールに SwitchClicked() を定義します。
ここでは、C列の5行目以降にスイッチがあるとして(本番ではもっと正確に最終行なども定義しておいたほうがよいでしょう)、セルの値が True の場合は ● を False の場合は - を表示するようにしました。

標準モジュール       SwitchClicked()

Public Const ColumnNum = 3   'スイッチはC列
Public Const StartRow = 5      'スイッチは5行目から始まる
Private Const onChar = "●"
Private Const offChar = "-"

'----- スイッチのセルの取得
Private Property Get switchCell(rowNum)
      Set switchCell = ActiveSheet.Cells(rowNum, ColumnNum)
End Property
'----- Activesheet でスイッチがクリックされた時実行
Public Sub SwitchClicked(rowNum)
      SwValue(rowNum) = Not SwValue(rowNum)
      ActiveSheet.Cells(3, 3).value = _
            "[" & switchCell(rowNum).Offset(0, 1).value & _
            "] が押されました。結果は " & CBool(SwValue(rowNum))
End Sub
'----- スイッチの値の取得/表示
Public Property Get SwValue(rowNum)
      SwValue = (switchCell(rowNum).value = onChar)
End Property
Public Property Let SwValue(rowNum, sw)
Dim newChar
      newChar = offChar
      If sw Then newChar = onChar
      switchCell(rowNum).value = newChar
End Property

こうしておくと、ワークシート上のスイッチをクリックするごとに値が反転し、文字も入れ替わります。現在のセルの値は、SwValue(行番号) で取得できます。

ここでは、各スイッチのIDとして絶対行番号を用いていますが、これを出発セルからの相対行番号で行うようにしておくと、より拡張性が高くなります。「画像のトグルスイッチ」でやったような、複数のグループのスイッチ群を配置することが楽になります。群の識別は列番号でもよいでしょうが、セルの塗りつぶし色で判別するなどとすると、よりエレガントですね。