CommandBar介紹-菜單欄


在Excel5和Excel95時,菜單和工具欄分別使用不同的對象。從Excel97開始,所有的菜單和工具欄都使用同一種對象CommandBar來表示。

一般來說包括三種常用的CommandBar類型。通過CommandBar對象的Type屬性可以判斷該對象是下列三種類型的其中之一。Type屬性返回一個msoBarType常量(包括msoBarNormal, msoBarMenu, msoBarPopup)。
第一種是菜單欄,msoBarMenu,可以自定義菜單以及子菜單添加在工作表的菜單上。如下圖:


第二種是工具欄,msoBarNormal,可以在Excel的各個位置創建自定義工具欄。如下圖:


第三種是右鍵菜單,msoBarPopup,可以自定義右鍵菜單,或在默認右鍵菜單上添加菜單項。如下圖:

CommandBar對象包含的項目叫做Control。Excel2003包括大約124個內置CommandBar和上千個Control。

接着的三篇文章將介紹怎樣使用VBA代碼創建自定義菜單和工具欄。

自定義菜單

Excel有兩種常用的菜單,一個叫做工作表菜單欄(Worksheet Menu Bar),另外一個叫做圖表菜單欄(Chart Menu Bar)。Chart Menu Bar在選擇圖表時顯示。
下面的代碼分別創建工作表菜單和圖表菜單。

Sub DeleteMenu()
On Error Resume Next
'關閉文件前刪除自定義菜單
    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
 
'如發現有相同菜單,關閉該菜單后再打開本文件
    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"
' 第一級菜單
        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"
'第二級菜單
            With .Controls.Add(Type:=msoControlButton)
.Caption = "SubMenu 01"
'.Style = msoButtonCaption
                ' 設置Face ID,Style屬性不能設置為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
 
' 如果已經存在菜單,刪除
    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 "你點擊了: " & sCall, vbInformation
End Sub

Auto_Open和Auto_Close過程分別在打開和關閉工作簿時執行。CommandBars(”Worksheet Menu Bar”)表示工作表菜單,使用該對象的Controls屬性的Add方法可以添加自定義菜單。
CommandBarControl對象的Add方法語法如下:

expression.Add(Type, Id, Parameter, Before, Temporary)

expression 必需。該表達式返回一個 CommandBarControls 對象。
Type Variant 類型,可選。添加到指定命令欄的控件類型。可以為下列 MsoControlType 常量之一:msoControlButton、msoControlEdit、msoControlDropdown、msoControlComboBox 或 msoControlPopup。
Id Variant 類型,可選。指定內置控件的整數。如果該參數為 1,或者忽略該參數,將在命令欄中添加一個空的指定類型的自定義控件。
Parameter Variant 類型,可選。對於內置控件,該參數用於容器應用程序運行命令。對於自定義控件,可以使用該參數向 Visual Basic 過程傳遞信息,或用其存儲控件信息(類似於第二個 Tag 屬性值)。
Before Variant 類型,可選。表示新控件在命令欄上位置的數字。新控件將插入到該位置控件之前。如果忽略該參數,控件將添加到指定命令欄的末端。
Temporary Variant 類型,可選。設置為 True 將使新命令欄為臨時命令欄。臨時命令欄在關閉容器應用程序時刪除。默認值為 False。

對於主菜單的命令欄,Type屬性一般使用msoControlPopup。如果第一級菜單不是彈出菜單,Type屬性一般使用msoControlButton。如果需要第二級菜單,則需要設置第一級菜單的Type屬性為msoControlPopup。

菜單命令欄控件的幾個常用屬性包括:
Caption:命令欄控件的題注;
OnAction:一個Visual Basic的過程名,該過程在用戶單擊或更改某命令欄控件的值時運行;
BeginGroup:表示控件是否現在的命令欄控件組的最前面;
State:這個屬性沒有在幫助文件中顯示。這個屬性可以為兩個常數之一:msoButtonDown和msoButtonUp。msoButtonDown表示在菜單左側顯示一個檢查符號。msoButtonUP則取消選擇;
可以通過下面的代碼來處理菜單欄的選擇和取消:

Sub CheckMenu()
With CommandBars.ActionControl
If .State = msoButtonDown Then
.State = msoButtonUp
Else
.State = msoButtonDown
End If
End With
End Sub

Faceid:菜單欄控件圖標;
另外還可以使用Picture和Mask屬性來制作自定義的圖標。

.Picture = LoadPicture(ThisWorkbook.Path & "\menufore.bmp")
.Mask = LoadPicture(ThisWorkbook.Path & "\menumask.bmp")

圖表菜單欄的創建方法和工作表菜單欄類似。

在關閉文件時,一般需要清除自定義菜單。可以直接使用CommandBarControl對象的Delete方法。

Sub DeleteMenu()
On Error Resume Next
' 關閉文件前刪除自定義菜單
    CommandBars("Worksheet Menu Bar").Controls("MyMenu").Delete
CommandBars("Chart Menu Bar").Controls("MyMenu").Delete
End Sub

將上面的代碼復制到一個標准模塊中,保存文件,然后重新打開,將生成如下工作表菜單欄:

圖表菜單欄在選擇圖表時顯示,如下圖:

示例文件下載:Box.Net | SkyDrive


免責聲明!

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



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