VBA向Excel菜單欄添加新菜單的通用方法


問題需求:

  1、菜單欄屬於CommandBars集合,可以通過菜單欄名稱或索引值對其進行引用:CommandBars(“Worksheet Menu Bar”)或CommandBars(1)

  2、新添加的菜單是一個彈出式控件,其類型為msoControlPopup。

  3、通過Add方法向Controls集合中添加新的控件。Add方法可以指定控件的類型、內置控件的ID號、位置及是否是一個臨時控件。如果是一個臨時控件,則在關閉Excel時會自動刪除該菜單。

  4、可以指定新菜單的位置。如果不指定,則會在菜單工具欄末尾添加新菜單。

  5、使用Caption屬性指定新菜單的名稱,使用OnAction屬性指定單擊菜單后的行為。

  6、為了避免指定的菜單不存在,可以使用FindControl方法查找要指定的菜單。若指定的菜單不存在,則在工作表菜單欄末尾添加新菜單。

  以下是向Excel工作表菜單欄中添加菜單的VBA代碼:  

Sub AddNewMenu()
  Dim HelpMenu As CommandBarControl
  Dim NewMenu As CommandBarPopup
   
  '利用ID屬性查找幫助菜單
  Set HelpMenu = CommandBars(1).FindControl(ID:=30010)
   
    If HelpMenu Is Nothing Then
        '如果該菜單不存在,則將新菜單添加到末尾
        '設置新菜單為臨時的
        Set NewMenu = CommandBars(1).Controls _
          .Add(Type:=msoControlPopup, Temporary:=True)
    Else
        '將新菜單添加到幫助菜單之前
        Set NewMenu = CommandBars(1).Controls _
          .Add(Type:=msoControlPopup, Before:=HelpMenu.Index, _
          Temporary:=True)
    End If
   
  '添加標題並指定快捷鍵
  NewMenu.Caption = "統計(&S)"
  End Sub

  運行該過程后,將在工作表菜單的“幫助”菜單左側添加一個名為“統計”的新菜單。

  注:要刪除新添加的菜單,使用Delete方法即可,例如代碼:

CommandBars(1).Controls("統計(&S)").Delete

將刪除剛創建的“統計”菜單。
添加菜單項
與添加新菜單一樣,在添加菜單項及子菜單時,使用Add方法,且指定合適的控件類型,其代碼清單如下:

Sub AddNewMenu()
    Dim HelpMenu As CommandBarControl
    Dim NewMenu As CommandBarPopup
    Dim MenuItem As CommandBarControl
    Dim SubMenuItem As CommandBarButton
   
    On Error Resume Next
    '如果菜單已存在,則刪除該菜單
    CommandBars(1).Controls("統計(&S)").Delete
   
    '利用ID屬性查找幫助菜單
    Set HelpMenu = CommandBars(1).FindControl(ID:=30010)
   
    If HelpMenu Is Nothing Then
        '如果該菜單不存在,則將新菜單添加到末尾
        '設置新菜單為臨時的
        Set NewMenu = CommandBars(1).Controls _
          .Add(Type:=msoControlPopup, Temporary:=True)
    Else
        '將新菜單添加到幫助菜單之前
        Set NewMenu = CommandBars(1).Controls _
          .Add(Type:=msoControlPopup, Before:=HelpMenu.Index, _
          Temporary:=True)
    End If
   
    '添加菜單標題並指定熱鍵
    NewMenu.Caption = "統計(&S)"
   
    '添加第一個菜單項
    Set MenuItem = NewMenu.Controls.Add _
      (Type:=msoControlButton)
    With MenuItem
        .Caption = "輸入數據(&D)..."
        .FaceId = 162
        .OnAction = "Macro1"
    End With
   
    '添加第二個菜單項
    Set MenuItem = NewMenu.Controls.Add _
      (Type:=msoControlButton)
    With MenuItem
        .Caption = "匯總數據(&T)..."
        '添加快捷鍵
        .ShortcutText = "Ctrl+Shift+T"
        .FaceId = 590
        .OnAction = "Macro2"
    End With
   
    '添加第三個菜單項
    '本菜單有子菜單項,因此其類型為msoControlPopup
    Set MenuItem = NewMenu.Controls.Add _
      (Type:=msoControlPopup)
    With MenuItem
        .Caption = "數據報表(&R)..."
        '添加分隔線
        .BeginGroup = True
    End With
   
    '添加子菜單
    '添加第一個子菜單
    Set SubMenuItem = MenuItem.Controls.Add (Type:=msoControlButton)
    With SubMenuItem
        .Caption = "月匯總(&M)"
        .FaceId = 110
        .OnAction = "Macro3"
    End With
   
    '添加第二個子菜單
    Set SubMenuItem = MenuItem.Controls.Add _
      (Type:=msoControlButton)
    With SubMenuItem
        .Caption = "季度匯總(&Q)"
        .FaceId = 222
        .OnAction = "Macro4"
    End With
End Sub

  注意,菜單類型的不同,有二個菜單項(類型為msoControlButton)、有一個菜單項帶有子菜單(其類型為msoControlPopup)FaceID屬性確定出現在菜單文本旁邊的圖像,以數字表示,一個數字代表一個內置的圖像。
在Caption屬性中使用&號表示該菜單項的熱鍵。

  在第二個菜單項中,利用ShortcutText屬性為該菜單項添加了一個快捷鍵,用戶按此快捷鍵可以直接運行命令。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM