在Excel5和Excel95時(shí),菜單和工具欄分別使用不同的對(duì)象。從Excel97開始,所有的菜單和工具欄都使用同一種對(duì)象CommandBar來表示。
一般來說包括三種常用的CommandBar類型。通過CommandBar對(duì)象的Type屬性可以判斷該對(duì)象是下列三種類型的其中之一。Type屬性返回一個(gè)msoBarType常量(包括msoBarNormal, msoBarMenu, msoBarPopup)。
第一種是菜單欄,msoBarMenu,可以自定義菜單以及子菜單添加在工作表的菜單上。如下圖:
第二種是工具欄,msoBarNormal,可以在Excel的各個(gè)位置創(chuàng)建自定義工具欄。如下圖:
第三種是右鍵菜單,msoBarPopup,可以自定義右鍵菜單,或在默認(rèn)右鍵菜單上添加菜單項(xiàng)。如下圖:
CommandBar對(duì)象包含的項(xiàng)目叫做Control。Excel2003包括大約124個(gè)內(nèi)置CommandBar和上千個(gè)Control。
接著的三篇文章將介紹怎樣使用VBA代碼創(chuàng)建自定義菜單和工具欄。
自定義菜單
Excel有兩種常用的菜單,一個(gè)叫做工作表菜單欄(Worksheet Menu Bar),另外一個(gè)叫做圖表菜單欄(Chart Menu Bar)。Chart Menu Bar在選擇圖表時(shí)顯示。
下面的代碼分別創(chuàng)建工作表菜單和圖表菜單。
Sub DeleteMenu() On Error Resume Next '關(guān)閉文件前刪除自定義菜單 CommandBars("Worksheet Menu Bar").Controls("MyMenu").Delete CommandBars("Chart Menu Bar").Controls("MyMenu").Delete End Sub Sub CloseMe() DeleteMenu ThisWorkbook.Close False End Sub Sub Auto_Close() Call CloseMe End Sub Sub Auto_Open() Dim newMenu As CommandBarControl Dim i As Integer '如發(fā)現(xiàn)有相同菜單,關(guān)閉該菜單后再打開本文件 On Error Resume Next CommandBars("Worksheet Menu Bar").Controls("MyMenu").Delete On Error GoTo 0 '在幫助菜單后添加自定義菜單 Set newMenu = CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, _ Temporary:=True, Before:=CommandBars("Worksheet Menu Bar").Controls.Count) With newMenu .Caption = "MyMenu" ' 第一級(jí)菜單 With .CommandBar.Controls.Add(Type:=msoControlButton) .Caption = "Menu 01" .State = msoButtonDown .Style = msoButtonCaption .OnAction = "CheckMenu" End With '添加彈出菜單 With .CommandBar.Controls.Add(Type:=msoControlPopup) .Caption = "Menu 02" '第二級(jí)菜單 With .Controls.Add(Type:=msoControlButton) .Caption = "SubMenu 01" '.Style = msoButtonCaption ' 設(shè)置Face ID,Style屬性不能設(shè)置為msoButtonCaption .FaceId = 16 .OnAction = "MenuProc" End With With .Controls.Add(Type:=msoControlButton) .Caption = "SubMenu 02" .Style = msoButtonCaption .OnAction = "MenuProc" End With End With ' 退出菜單 With .CommandBar.Controls.Add(Type:=msoControlButton) .Caption = "退出" .BeginGroup = True .Picture = LoadPicture(ThisWorkbook.Path & "\menufore.bmp") .Mask = LoadPicture(ThisWorkbook.Path & "\menumask.bmp") .OnAction = "CloseMe" End With End With ' 如果已經(jīng)存在菜單,刪除 On Error Resume Next CommandBars("Chart Menu Bar").Controls("MyMenu").Delete On Error GoTo 0 '在幫助菜單后添加自定義圖表菜單 With CommandBars("Chart Menu Bar").Controls.Add(Type:=msoControlPopup, _ Temporary:=True, Before:=CommandBars("Chart Menu Bar").Controls.Count) .Caption = "MyMenu" With .CommandBar.Controls.Add(Type:=msoControlButton) .Caption = "ChartMenu" .Style = msoButtonCaption .OnAction = "MenuProc" End With End With End Sub Sub CheckMenu() With CommandBars.ActionControl If .State = msoButtonDown Then .State = msoButtonUp Else .State = msoButtonDown End If End With End Sub Sub MenuProc() Dim sCall As String sCall = CommandBars.ActionControl.Caption MsgBox "你點(diǎn)擊了: " & sCall, vbInformation End Sub
Auto_Open和Auto_Close過程分別在打開和關(guān)閉工作簿時(shí)執(zhí)行。CommandBars(”Worksheet Menu Bar”)表示工作表菜單,使用該對(duì)象的Controls屬性的Add方法可以添加自定義菜單。
CommandBarControl對(duì)象的Add方法語法如下:
expression.Add(Type, Id, Parameter, Before, Temporary)
expression 必需。該表達(dá)式返回一個(gè) CommandBarControls 對(duì)象。
Type Variant 類型,可選。添加到指定命令欄的控件類型??梢詾橄铝?MsoControlType 常量之一:msoControlButton、msoControlEdit、msoControlDropdown、msoControlComboBox 或 msoControlPopup。
Id Variant 類型,可選。指定內(nèi)置控件的整數(shù)。如果該參數(shù)為 1,或者忽略該參數(shù),將在命令欄中添加一個(gè)空的指定類型的自定義控件。
Parameter Variant 類型,可選。對(duì)于內(nèi)置控件,該參數(shù)用于容器應(yīng)用程序運(yùn)行命令。對(duì)于自定義控件,可以使用該參數(shù)向 Visual Basic 過程傳遞信息,或用其存儲(chǔ)控件信息(類似于第二個(gè) Tag 屬性值)。
Before Variant 類型,可選。表示新控件在命令欄上位置的數(shù)字。新控件將插入到該位置控件之前。如果忽略該參數(shù),控件將添加到指定命令欄的末端。
Temporary Variant 類型,可選。設(shè)置為 True 將使新命令欄為臨時(shí)命令欄。臨時(shí)命令欄在關(guān)閉容器應(yīng)用程序時(shí)刪除。默認(rèn)值為 False。
對(duì)于主菜單的命令欄,Type屬性一般使用msoControlPopup。如果第一級(jí)菜單不是彈出菜單,Type屬性一般使用msoControlButton。如果需要第二級(jí)菜單,則需要設(shè)置第一級(jí)菜單的Type屬性為msoControlPopup。
菜單命令欄控件的幾個(gè)常用屬性包括:
Caption:命令欄控件的題注;
OnAction:一個(gè)Visual Basic的過程名,該過程在用戶單擊或更改某命令欄控件的值時(shí)運(yùn)行;
BeginGroup:表示控件是否現(xiàn)在的命令欄控件組的最前面;
State:這個(gè)屬性沒有在幫助文件中顯示。這個(gè)屬性可以為兩個(gè)常數(shù)之一:msoButtonDown和msoButtonUp。msoButtonDown表示在菜單左側(cè)顯示一個(gè)檢查符號(hào)。msoButtonUP則取消選擇;
可以通過下面的代碼來處理菜單欄的選擇和取消:
Sub CheckMenu() With CommandBars.ActionControl If .State = msoButtonDown Then .State = msoButtonUp Else .State = msoButtonDown End If End With End Sub
Faceid:菜單欄控件圖標(biāo);
另外還可以使用Picture和Mask屬性來制作自定義的圖標(biāo)。
.Picture = LoadPicture(ThisWorkbook.Path & "\menufore.bmp") .Mask = LoadPicture(ThisWorkbook.Path & "\menumask.bmp")
圖表菜單欄的創(chuàng)建方法和工作表菜單欄類似。
在關(guān)閉文件時(shí),一般需要清除自定義菜單??梢灾苯邮褂肅ommandBarControl對(duì)象的Delete方法。
Sub DeleteMenu() On Error Resume Next ' 關(guān)閉文件前刪除自定義菜單 CommandBars("Worksheet Menu Bar").Controls("MyMenu").Delete CommandBars("Chart Menu Bar").Controls("MyMenu").Delete End Sub
將上面的代碼復(fù)制到一個(gè)標(biāo)準(zhǔn)模塊中,保存文件,然后重新打開,將生成如下工作表菜單欄:
Related posts: