技巧區‎ > ‎高級程度‎ > ‎

在工具列上的自訂菜單 [2002年7月]

張貼者:2010年5月29日 上午6:25Carson Cheng   [ 已更新 2010年5月29日 上午6:27 ]
在廣州舉行的Office Development Conference看到一個用工具列形式來做的菜單,在打開檔案的時候會出現,關檔後就會消失,覺得不錯,讓人一目瞭然:


  其實基本所需的物件不多,不過因為要在執行時動態地產生這個菜單,所以只要學三個物件:

  CommandBar    很明顯就是工具列本身了
  CommandBarPopup   顧名思義,按下去就會「爆」出東西來的選項
  CommandBarControl 這是最基本的按鈕,按下去會執行巨集

  要加一個「第一步|第一小步」的兩層菜單,並把「第一小步」聯系到「Test」巨集,只要這幾句:

' 需要三個變數作臨時存放用
  Dim cbcMenu As CommandBar
  Dim cbcPopup As CommandBarPopup
  Dim cbcButton As CommandBarControl

  ' 加一個名叫 "ExcelHelp" 的 CommandBar,放於工具列上(頂),並設為臨時(關閉Excel後會消失)
  Set cbcMenu = Application.CommandBars.Add(Name:="ExcelHelp", Position:=msoBarTop, Temporary:=True)

  '  在cbcMenu上加一個 Popup,並顯示「第一步」
  Set cbcPopup = cbcMenu.Controls.Add(Type:=msoControlPopup, Temporary:=True)
  cbcPopup.Caption = "第一步"

  '  在cbcPopup上加一個按鈕,並顯示「第一小步」
  Set cbcButton = cbcPopup.CommandBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
  cbcButton.Caption = "第一小步"
  cbcButton.OnAction = "Test"

  '  把菜單顯示出來
  cbcMenu.Visible = True


  一般菜單都有十多個選項,難道我們要重覆上面的程底嗎?當然不用啦!你可能已想到用迴圈(Loop),不錯!
  但我不打算用Array()(陣列),因為每個按鈕都有所屬的Popup,然後顯示的文字(Caption)和巨集名稱(OnAction),用Array()不單麻煩,也不能輕易更改。
  對!工作表其實最好!

  我把菜單的選項這樣放置在工作表上:


  然後用以下程式產生,要注意的是,我把程式放在Workbook_Open()事件裡,好讓Excel在打開這個檔案後,馬上做一個菜單:

Private Sub Workbook_Open()
   Const colMenu = 1, colPopup = 2, colButton = 3, colMacro = 4  ' 各類資料的相對欄號
   Dim cbcMenu As CommandBar
   Dim cbcPopup As CommandBarPopup
   Dim cbcButton As CommandBarControl
   Dim rMenu As Range
   Dim rCurrent As Range
   
   ' 製作菜單
   ' 在第一欄找 "ExcelHelp" 字樣,作為菜單的名稱
   Set rMenu = SheetMenu.Columns(1).Find("ExcelHelp").CurrentRegion
   Set cbcMenu = Application.CommandBars.Add(Name:=rMenu.Cells(1, colMenu).value, _
                    Position:=msoBarTop, Temporary:=True)
   With cbcMenu
       For Each rCurrent In rMenu.Rows
           If rCurrent.Cells(1, colPopup).value <> vbNullString Then
               ' 製作 Popup
               Set cbcPopup = .Controls.Add(Type:=msoControlPopup, Temporary:=True)
               cbcPopup.Caption = rCurrent.Cells(1, colPopup).value
           End If
           
           ' 製作按鈕
           Set cbcButton = cbcPopup.CommandBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
           With cbcButton
               .Caption = rCurrent.Cells(1, colButton).value
               .OnAction = rCurrent.Cells(1, colMacro).value
           End With
       Next
   End With
   cbcMenu.Visible = True
End Sub


  在關檔的時候,別忘了把這個菜單刪掉(不然要等到Excel關閉的時候才會消失):
Private Sub Workbook_BeforeClose(Cancel As Boolean)
   On Error Resume Next  ' 萬一用戶己自行刪除了菜單(已經不存在)
   Application.CommandBars("ExcelHelp").Delete
End Sub

  注意:
  1. 你可以把菜單工作表的Visible屬性,(在VBA編輯器內)改為 2 - xlSheetVeryHidden,那就不會給用戶看到。
  2. 如果你想每次轉到其他檔案時把菜單關掉,每次回到此檔案時就把菜單再顯示,你應該分別把 Workbook_Open 和 Workbook_BeforeClose 換成 Workbook_Activate 和  Workbook_Deactivate。
  3. 有一個小問題:如果檔案已經改動過,而關閉檔案時你回答「取消」,返回工作表,這時菜單已經不存在,因為 BeforeClose已經執行了。(這是Excel的設計。)

Ĉ
3_3.xls
(37k)
Carson Cheng,
2010年5月29日 上午6:27
Comments