category name  »  page title date

一番簡単なトグルスイッチ

画像のトグルスイッチ」では、けっこう無理をして、オリジナル画像のスイッチを配置しました。これは、スイッチそのものを動的に配置しようとしたからです。

画像を使って、最初から固定されたスイッチをということであれば、ずっと簡単にできます。

左のような感じで、スイッチ画像を配置します。ここでは、2組用意しました。それぞれ、画像は一つずつのように見えますが、実は ON と OFF の画像が重なっていて、グループ化されています。スイッチの状態に応じて、そのどちらかを表示して、相棒を隠すようにしています。
図の右半分に「選択」というタイトルで出ているリストが、「図形の書式 - オブジェクトの選択と表示」で表示したウィンドウです。これを見てわかるように、Toggle-01 に表示されているのが、Toggle-01-ON という名前の画像、Toggle-02 に表示されているのが、Toggle-02-OFF という画像で、そういう命名規則で画像が配置されています。
全画像に、ToggleSW のマクロを登録しておきます。

以上、おわり。現在のスイッチの状態は、ToggleValue(グループ番号) で取得できます。

標準モジュール           ToggleSW(), ToggleValue()

'----- スイッチ名の接頭語
Private Const HeadElement = "Toggle"
'----- すべてのスイッチに登録するマクロ
Public Sub ToggleSW()
Dim swName, elements, onOff, groupNumber, oppStr, riseButtonName
      swName = Application.Caller
      elements = Split(swName, "-")
      If elements(0) <> HeadElement Then Exit Sub
      groupNumber = Val(elements(1))
      onOff = (elements(2) = "ON")
      With ActiveSheet
            .Shapes(getSwName(groupNumber, onOff)).Visible = False
            .Shapes(getSwName(groupNumber, Not onOff)).Visible = True
      End With
      Application.ScreenUpdating = True
    '次は動作確認用の MsgBox
      MsgBox groupNumber & " is  " & ToggleValue(groupNumber)
End Sub
'----- スイッチ名を編成
Private Property Get getSwName(groupNumber, onOff)
Dim onOffStr
      onOffStr = "OFF": If onOff Then onOffStr = "ON"
      getSwName = _
            HeadElement & "-" & Format(groupNumber, "00") & "-" & onOffStr
End Property
'----- 現在のスイッチの状態を取得
Public Property Get ToggleValue(groupNumber) As Boolean
      ToggleValue = _
            (ActiveSheet.Shapes(getSwName(groupNumber, True)).Visible)
End Property