「追加したはずの右クリックメニューが表示されない事件」の真相 ⑤

先日来、2年越しの事件が解決しそうだ。
infoment.hatenablog.com

先日は、追加しようとする右クリックメニューが追加済みでない場合に限り、追加を実行するところまで作成した。

今日は、前回の続きから。
f:id:Infoment:20200804214712p:plain

用が済めば、後片付けが必要だ。
そこで、右クリックメニューを削除する方法として、以下の二つを準備してみた。

  • 指定した右クリックメニューを削除
  • 一括リセット

実際に作成したのが、こちら。

クラスモジュールの一部(RightClickCommand)

今回は、抜粋で掲載。コードの全文は最終回にまとめて掲載としよう。

↓削除する場合。

' 指定CommandBarから指定メニュー削除。
Public Sub DelMenuFromSpecifiedCommandBar(name_to_del As String, _
                                          commandbar_index As Long)
        
    ' 指定メニューが存在する場合のみ、それを削除する。
    ' ※既存の標準メニューも消せるため注意。
    ' ※DuplicateFlagのiを、そのまま削除に用いる。
    If DuplicateFlag(name_to_del, commandbar_index) Then
        Application.CommandBars(commandbar_index).Controls.Item(i).Delete
    End If
    
End Sub

' 各CommandBarから指定メニュー削除。
Public Sub DelMenu(name_to_del As String)

    For Each LoopIndex In TargetArray
        DelMenuFromSpecifiedCommandBar name_to_del, CLng(LoopIndex)
    Next
    
End Sub


↓リセットする場合。

' リセット。
Public Sub ResetMenu()

    For Each LoopIndex In TargetArray
        Application.CommandBars(LoopIndex).Reset
    Next
    
End Sub

リセットする方が、断然スッキリしている。
ただし、消してはいけないものがあったとしても全て消えてしまうので、要注意。

標準モジュール

使用例がこちら。

' 個別削除の場合。
Sub Test_Delete()
    With New RightClickCommand
        .DelMenu "ホゲ"
        .DelMenu "ホげ"
        .DelMenu "ほげ"
    End With
End Sub

' 一括リセットの場合。
Sub Test_Reset()
    With New RightClickCommand
        .ResetMenu
    End With
End Sub

これで、準備は整った。後は、実際の業務で使ってみるだけだ。

ところが実際に使ってみると・・・ん?何かがおかしい。
そう、既にお気づきの方も居られると思うが、このクラスモジュールには、単純で重大な欠陥があったのだ。

ということで次回、最終回に続きます。

参考まで。