7.10 追加したメニューを変更する
自分だけの新しいメニューを追加した後、その内容を変更したいなんてことはありませんか?例えば、メニューが使えないときはメニューを非活性状態にしたり、メニュー内の特定のボタンを非活性にするとか…。

というわけで、追加したメニューを後から変更する方法です。
メニュー内に新たにボタンを追加する
追加したメニューの中に、さらにボタンなどを追加する方法です。使用するメソッドなど、基本的な方法は「7.9 新しいメニューを追加する」と同じなのでそちらをどうそ。

ポイントは、コマンドバーコントロールオブジェクトの作成の所(Set cbcMenu…)でメニュー1のオブジェクトを作成し、そのオブジェクトに対して操作している点です。例では、右図のように作成したメニュー1の中へ、さらにボタン4を追加しています。


Sub prcMenuButtonAdd()

    On Error GoTo ErrHand

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    'メニュー1のオブジェクトを作ります
    Set cbcMenu = cbrCmd.Controls("メニュー1")

    '念のためボタン3を削除をしておきます
    cbcMenu.Controls("ボタン3").Delete

    'メニュー1の中へボタン4を追加しています
    With cbcMenu.Controls.Add(Type:=msoControlButton)
        .Caption = "ボタン4"
        .OnAction = "prcButton4"
    End With

    'オブジェクトの破棄
    Set cbcMenu = Nothing
    Set cbrCmd = Nothing

    Exit Sub

ErrHand:

    If Err.Number = 5 Then
       Resume Next
    Else
       MsgBox Err.Description
    End If

End Sub
 ※これはエクセルマクロです
メニュー内のボタン見出しや実行する処理を変更する
追加したメニューの中のボタンの見出しや、実行する処理を変更する方法です。使用するメソッドなど、基本的な方法は「7.9 新しいメニューを追加する」と同じなのでそちらをどうそ。

ポイントは、コマンドバーコントロールオブジェクトの作成の所(Set cbcMenu…)でメニュー1のオブジェクトを作成し、そのオブジェクトに対して操作している点です。例では、右図のように作成したメニュー1の中にあるボタン3について、見出し(釦3に変更)と実行する処理(prcHappy3に変更)を変更しています。


Sub prcMenuButtonChange()

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    'メニュー1のオブジェクトを作ります
    Set cbcMenu = cbrCmd.Controls("メニュー1")

    'ボタン3の見出しと実行する処理を変更しています
    With cbcMenu.Controls("ボタン3")
        .Caption = "釦3"
        .OnAction = "prcHappy3"
    End With

    'オブジェクトの破棄
    Set cbcMenu = Nothing
    Set cbrCmd = Nothing

End Sub
 ※これはエクセルマクロです
メニューの活性・非活性、ボタンの活性・非活性を変える
追加したメニューの中のボタンの活性・非活性の切り替えや、メニューの活性・非活性を変更する方法です。活性・非活性を変更する場合には、.Enabledプロパティを使い、設定内容はお馴染みのTrue活性(使える)、False非活性(使えない)です。

その他のポイントは、コマンドバーコントロールオブジェクトの作成の所(Set cbcMenu…)でメニュー1のオブジェクトを作成し、そのオブジェクトに対して操作している点です。例では、右図のように作成したメニュー1の中にあるボタン3を非活性に変更しています。


Sub prcMenuButtonEnabledChange()

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    'メニュー1のオブジェクトを作ります
    Set cbcMenu = cbrCmd.Controls("メニュー1")

    'ボタン3を非活性にします
    cbcMenu.Controls("ボタン3").Enabled = False

    'オブジェクトの破棄
    Set cbcMenu = Nothing
    Set cbrCmd = Nothing

End Sub
 ※これはエクセルマクロです


ちなみに、メニュー全体の活性・非活性切り替えの例は以下をどうぞ。例では、メニュー1を非活性にしています。

Sub prcMenuEnabledChange()

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    'メニュー1のオブジェクトを作ります
    Set cbcMenu = cbrCmd.Controls("メニュー1")

    'メニュー1を非活性にします
    cbcMenu.Enabled = False

    'オブジェクトの破棄
    Set cbcMenu = Nothing
    Set cbrCmd = Nothing

End Sub
 ※これはエクセルマクロです


それと、メニュー2の中にあるボタン2-1を非活性にするときは次のようにします。

Sub prcMenuEnabledChange()

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    'メニュー1のオブジェクトを作ります
    Set cbcMenu = cbrCmd.Controls("メニュー1")

    'ボタン2-1を非活性にします
    With cbcMenu.Controls("メニュー2")
        .Controls("ボタン2-1").Enabled = False
    End With

    'オブジェクトの破棄
    Set cbcMenu = Nothing
    Set cbrCmd = Nothing

End Sub
 ※これはエクセルマクロです
メニュー内のボタンなどを削除する
追加したメニューの中にあるボタンやメニューを削除する方法です。でも、既に出てます(笑)。削除するときは、ボタンやメニューに対して.Deleteメソッドを実行します。

その他のポイントは、コマンドバーコントロールオブジェクトの作成の所(Set cbcMenu…)でメニュー1のオブジェクトを作成し、そのオブジェクトに対して操作している点です。例では、右図のように作成したメニュー1の中にあるボタン3を削除しています。削除時、そのボタンが無いとエラーが出るのでOn Errror…で小細工してます。


Sub prcMenuButtonDelete()

    On Error GoTo ErrHand

    Dim cbrCmd As CommandBar
    Dim cbcMenu As CommandBarControl

    'メニュー用のオブジェクトを作ります
    Set cbrCmd = Application.CommandBars("Worksheet Menu Bar")

    'メニュー1のオブジェクトを作ります
    Set cbcMenu = cbrCmd.Controls("メニュー1")

    'ボタン3を削除をします
    cbcMenu.Controls("ボタン3").Delete

    'オブジェクトの破棄
    Set cbcMenu = Nothing
    Set cbrCmd = Nothing

    Exit Sub

ErrHand:

    If Err.Number = 5 Then
       Resume Next
    Else
       MsgBox Err.Description
    End If

End Sub
 ※これはエクセルマクロです
Copyright(C) 1999-2006 結城圭介。 All rights reserved