自作アドイン用メニューの作成

以下をThisWorkBook内に記載する。

・参考
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_080.html ツールバーの動的追加
http://officetanaka.net/excel/vba/tips/tips83.htm FaceIDの一覧

Option Explicit

' ツールバーの生成と、メニューへの項目追加

Private Const C_ToolBarName As String = "XlsDevMenu"
Private Const C_TopMenuName As String = "開発サポート(&1)"
Private Const C_TopMenuBar As String = "Worksheet Menu Bar"

Private mlMenuCmdBarCtl As CommandBarControl ' メニュー

'ツールバーが存在する場合True
Private Function hasToolBar(sName As String) As Boolean
    Dim oObj As Object
    For Each oObj In Application.CommandBars
        If oObj.Name = C_ToolBarName Then
            hasToolBar = True
            Exit Function
        End If
    Next
    hasToolBar = False
    Exit Function
End Function

' アイコンの追加
Private Sub createMenu( _
    sCaption As String, _
    sMacroName As String, _
    nFaceId As Long, _
    Optional ByVal sShortCutKey As String = "" _
)
    ' ツールバーへの登録
    With Application.CommandBars(C_ToolBarName).Controls.Add(msoControlButton)
        If Len(sShortCutKey) > 0 Then
            .Caption = "&" & sShortCutKey ' ショートカットキー
        End If
        .OnAction = ThisWorkbook.Name & "!" & sMacroName
        .Style = msoButtonIconAndCaption ' イメージとテキストを表示
        .FaceId = nFaceId
    End With

    ' メニューへの登録
    With mlMenuCmdBarCtl.Controls.Add(msoControlButton)
        .Caption = sCaption
        .OnAction = ThisWorkbook.Name & "!" & sMacroName
        .FaceId = nFaceId
    End With
End Sub

' メニュー追加
Private Sub Workbook_Open()
    On Error GoTo ErrHand
    Dim oObj As Object
    
    ' ツールバーの作成
    If Not hasToolBar(C_ToolBarName) Then
        Application.CommandBars.Add(C_ToolBarName).Visible = True
    End If
    ' ツールバーに登録済のメニューを全削除
    With Application.CommandBars(C_ToolBarName)
        For Each oObj In .Controls
            oObj.Delete
        Next
    End With
        
    ' 同名のメニューが既に存在するなら削除
    For Each oObj In Application.CommandBars(C_TopMenuBar).Controls
        If oObj.Caption = C_TopMenuName Then
            Set mlMenuCmdBarCtl = oObj
            Exit For
        End If
    Next
    ' メニュー配下のアイテムを消去
    If mlMenuCmdBarCtl Is Nothing Then
        Set mlMenuCmdBarCtl = Application.CommandBars(C_TopMenuBar).Controls.Add(msoControlPopup)
    End If
    With mlMenuCmdBarCtl
        .Caption = C_TopMenuName
        For Each oObj In .Controls
            oObj.Delete
        Next
    End With

    ' 機能追加 (メニュー表示用名称, マクロ名, アイコンID, ショートカットキー)
    Call createMenu("Accessからの貼付け(&q)", "MacroPaste", 279, "q")
    Call createMenu("ドラッグ&ドロップ編集切替(&x)", "setCellDragAndDrop", 705, "x")
    Call createMenu("ヘッダ・フッタの一括設定(&.)", "setHeadFoot", 278, ".")
    
    Exit Sub
ErrHand:
    MsgBox Err.Description
End Sub

' 動作確認用
Public Sub openTest()
    Call Workbook_Open
End Sub