「画像のトグルスイッチ」では、けっこう無理をして、オリジナル画像のスイッチを配置しました。
画像でなくて、文字で代用するのでかまわない、というのであれば、もっと簡単に実現できます。やってみました。
やりかたは、以下のとおりです。「セルを選択したとき」なので 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として絶対行番号を用いていますが、これを出発セルからの相対行番号で行うようにしておくと、より拡張性が高くなります。「画像のトグルスイッチ」でやったような、複数のグループのスイッチ群を配置することが楽になります。群の識別は列番号でもよいでしょうが、セルの塗りつぶし色で判別するなどとすると、よりエレガントですね。