ツールバーを変更できないようにする


ツールバーを作る方法は「新しいツールバーを作る」をご覧ください。

ツールバーの位置を指定する

さて、マクロで作成したツールバーは、VisibleプロパティにTrueを設定すると画面に表示されます。このとき、ただTrueにしただけでは、ツールバーがワークシート上にフローティング状態で表示されてしまいます。別に決まっていませんが、ツールバーといえばやはり画面の上部に居てほしいものです。ツールバーの表示位置を決めるにはPositionプロパティに表示位置を表す定数を指定します。次のコードは、新しいツールバーを作り、ワークシートの左側に表示します。

Sub Sample1()
    Dim myBar As CommandBar, i As Long
    Set myBar = CommandBars.Add         ''新しいツールバーを作成します
    For i = 1 To 3
        myBar.Controls.Add ID:=i + 1    ''ダミーのボタンを追加します
    Next i
    myBar.Position = msoBarLeft         ''ツールバーを左に表示します
    myBar.Visible = True
End Sub

ツールバーのPositionプロパティに設定できるのは次の定数です。

定数 位置
msoBarLeft 0
msoBarTop 1
msoBarRight 2
msoBarBottom 3
msoBarFloting 4 フローティング

ツールバーを変更できなくする

ツールバーのProtectionプロパティを使うと、表示位置を変更できなくしたり、ボタンの表示/非表示を禁止することなどができます。次のコードは、新しいフローティング状態のツールバーを作り、移動できなくします。

Sub Sample2()
    Dim myBar As CommandBar, i As Long
    Set myBar = CommandBars.Add         ''新しいツールバーを作成します
    For i = 1 To 3
        myBar.Controls.Add ID:=i + 1    ''ダミーのボタンを追加します
    Next i
    myBar.Position = msoBarFloating     ''フローティングにします
    myBar.Protection = msoBarNoMove     ''移動を禁止します
    myBar.Visible = True
End Sub

上図はツールバーのタイトルバー上でマウスボタンを押し下げているところです。マウスポインタが変化せず、移動することができません。ちなみに、移動できる場合は下図のようにマウスポインタが変化します。

Protectionプロパティに設定できるのは次の定数です。

定数 制限
msoBarNoProtection 0 保護しない
msoBarNoCustomize 1 ユーザー設定しない
msoBarNoResize 2 サイズ変更しない
msoBarNoMove 4 移動しない
msoBarNoChangeVisible 8 非表示にしない
msoBarNoChangeDock 16 フリーにしない
msoBarNoVerticalDock 32 垂直に固定しない
msoBarNoHorizontalDock 64 水平に固定しない

一般的なツールバーのProtectionプロパティは、msoBarNoProtectionが設定されている状態です。

複数の制限を同時に設定するには、定数を足し算してください。「msoBarNoMove + msoBarNoChangeVisible + msoBarNoCustomize」みたくすると、ワークシート上にフローティング状態で表示され、[ユーザー設定]ダイアログボックスで非表示にすることも、削除することもできない、極悪非道なツールバーになります(^^; よい子は真似しちゃダメだよ。

もし、そんな極悪非道なツールバーを発見したら、次のコードで解除してから削除してやってください。

Sub Sample4()
    Dim c
    For Each c In CommandBars
        If c.BuiltIn = False Then c.Protection = msoBarNoProtection
    Next c
End Sub

BuiltInプロパティは、そのツールバーがExcelの標準ツールバーかどうかを判定します。標準ツールバーの場合はProtectionプロパティを変更できませんので、BuiltInプロパティがFalseとなるユーザーが作成したツールバーだけ制限を解除します。

実用的には、次のような使い方でしょうか。次のコードは、新しいツールバーを作り、右端のボタンをクリックすると「移動可能」と「移動禁止」の状態を切り替えます。

Sub Sample5()
    Dim myBar As CommandBar, i As Long
    Set myBar = CommandBars.Add         ''新しいツールバーを作成します
    For i = 1 To 3
        myBar.Controls.Add ID:=i + 1    ''ダミーのボタンを追加します
    Next i
    With myBar.Controls.Add
        .OnAction = "myMacro2"          ''ボタンがクリックされたとき実行するマクロを設定します
        .BeginGroup = True              ''区切り線を表示します
        .FaceId = 277                   ''ボタンイメージの番号を指定します
    End With
    myBar.Visible = True
End Sub

Sub myMacro2()
    With CommandBars.ActionControl
        If .Parent.Protection = msoBarNoMove Then       ''移動禁止だったら
            .Parent.Protection = msoBarNoProtection         ''移動禁止を解除する
            .State = False                                  ''ボタンが押されていない状態にする
        Else                                            ''移動禁止ではなかったら
            .Parent.Protection = msoBarNoMove               ''移動禁止にする
            .State = True                                   ''ボタンが押されている状態にする
        End If
    End With
End Sub

最初はツールバーを自由に移動できます。

右端の鍵ボタンをクリックすると移動できなくなります。ボタンの表示を"押された状態"にすることで、現在の状態をユーザーに伝えます。

クリックされたボタンはActionControlプロパティで取得します。詳しくは「実行されたメニューを取得する」をご覧ください。

ツールバーのボタンを押された状態にするのは、メニューにチェックマークを付けるのと同じです。詳しくは「メニューにチェックマークを付ける」をご覧ください。