張貼者:2010年5月29日 上午6:25Administrator ExcelHelp
[
已更新 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
注意:
- 你可以把菜單工作表的Visible屬性,(在VBA編輯器內)改為 2 - xlSheetVeryHidden,那就不會給用戶看到。
- 如果你想每次轉到其他檔案時把菜單關掉,每次回到此檔案時就把菜單再顯示,你應該分別把 Workbook_Open 和 Workbook_BeforeClose 換成 Workbook_Activate 和 Workbook_Deactivate。
- 有一個小問題:如果檔案已經改動過,而關閉檔案時你回答「取消」,返回工作表,這時菜單已經不存在,因為 BeforeClose已經執行了。(這是Excel的設計。)
|
|
|
|
|
 Updating...
Ĉ Administrator ExcelHelp, 2010年5月29日 上午6:27
|