大家好,我們今日繼續(xù)講解VBA代碼解決方案的第121講內(nèi)容:如何在Excel工作表的菜單中自定義添加新的菜單項(xiàng)和子菜單
在我之前的文章中講到,我最初VBA是學(xué)習(xí)前輩的代碼,前輩的文件響應(yīng)代碼就是通過菜單的自定義來實(shí)現(xiàn)的,今日我們也來談?wù)勛远x菜單的問題。添加菜單可以用Add方法。
Add方法應(yīng)用于CommandBarControls對象時(shí),新建一個(gè)CommandBarControl對象并添加到指定命令欄上的控件集合,語法如下:
expression.Add(Type, Id, Parameter, Before, Temporary)
參數(shù)expression 是必須的,返回一個(gè)CommandBarControls對象,代表命令欄中的所有控件。
參數(shù)Type是可選的,添加到指定命令欄的控件類型,可以為下面所列的常數(shù)之一。
msoControlButton 1 命令按鈕
msoControlEdit 2 文本框
msoControlDropdown 3 下拉列表控制框
msoControlComboBox 4 下拉組合控制框
msoControlPopup 10 彈出式控件
參數(shù)Id是可選的,標(biāo)識整數(shù)。如果將該參數(shù)設(shè)置為 1或者忽略,將在命令欄中添加一個(gè)空的指定類型的自定義控件。
參數(shù)Parameter是可選的,對于內(nèi)置控件,該參數(shù)用于容器應(yīng)用程序運(yùn)行命令。對于自定義控件,可以使用該參數(shù)向Visual Basic過程傳遞信息,或用其存儲控件信息。
參數(shù)Before是可選的,表示新控件在命令欄上位置的數(shù)字。新控件將插入到該位置控件之前。如果忽略該參數(shù),控件將添加到指定命令欄的末端。
參數(shù)Temporary是可選的。設(shè)置為True將使添加的菜單項(xiàng)為臨時(shí)的,在關(guān)閉應(yīng)用程序時(shí)刪除。默認(rèn)值為False。
下面我們就一個(gè)實(shí)例來講解如何添加菜單。如下面的代碼所示。
Sub MynzTools()
Dim myTools As CommandBarPopup
Dim myCap, myAct As Variant
Dim myid As Variant
Dim i As Byte
myCap = Array('VBA代碼解決方案1', 'VBA代碼解決方案2', 'VBA代碼解決方案3')
myAct = Array('myNz1', 'myNz2', 'myNz3')
With Application.CommandBars('Worksheet menu bar')
.Reset
Set myTools = .Controls.Add(Type:=msoControlPopup)
With myTools
.Caption = 'VBA學(xué)習(xí)'
.BeginGroup = True
For i = 1 To 3
With .Controls.Add(Type:=msoControlButton)
.Caption = myCap(i - 1)
.OnAction = myAct(i - 1)
End With
Next
End With
End With
Set myTools = Nothing
End Sub
Sub MynzDelmyTools()
Application.CommandBars('Worksheet menu bar').Reset
End Sub
Sub myNz1()
MsgBox '歡迎學(xué)習(xí)VBA代碼解決方案第一冊'
End Sub
Sub myNz2()
MsgBox '歡迎學(xué)習(xí)VBA代碼解決方案第二冊'
End Sub
Sub myNz3()
MsgBox '歡迎學(xué)習(xí)VBA代碼解決方案第三冊'
End Sub
代碼解析:myTools過程使用Add方法在Excel工作表菜單欄中加一個(gè)標(biāo)題為'VBA學(xué)習(xí)'的菜單項(xiàng)和3個(gè)子菜單。
第2行到第5行代碼聲明變量類型。
第6,7行代碼使用Array函數(shù)創(chuàng)建數(shù)組用于保存子菜單的名稱,和菜單的動作
第9行代碼,在添加菜單項(xiàng)前先使用Reset方法重置菜單欄以免重復(fù)添加菜單項(xiàng)。Reset方法重置一個(gè)內(nèi)置控件,恢復(fù)該控件原來對應(yīng)的動作,并將各屬性恢復(fù)成初始狀態(tài),
語法如下:expression.Reset
參數(shù)expression 是必須的,返回一個(gè)命令欄或命令欄控件對象。
第10行代碼,使用Add方法在Excel工作表菜單欄中添加菜單項(xiàng)。因?yàn)樵诒纠袑⑻砑拥氖菐в凶硬藛蔚牟藛雾?xiàng),所以將參數(shù)Type設(shè)置為彈出式控件。
第12行代碼,設(shè)定新添加菜單項(xiàng)的Caption屬性為'VBA學(xué)習(xí)'。Caption屬性返回或設(shè)置命令欄控件的標(biāo)題。
第13行代碼,設(shè)置新添加菜單項(xiàng)的BeginGroup屬性為True,分組顯示。
第14行到第18行代碼,在'VBA學(xué)習(xí)'菜單項(xiàng)上添加3個(gè)子菜單并設(shè)置其Caption屬性。和相應(yīng)的動作。
好了,我們看我們的運(yùn)行效果:
運(yùn)行前界面:
點(diǎn)擊添加菜單:
點(diǎn)擊'VBA代碼解決方案1':彈出對話框效果。
上述代碼中:
Sub MynzDelmyTools()
Application.CommandBars('Worksheet menu bar').Reset
End Sub
是重置菜單,也就是說在退出前要重置一下菜單。
關(guān)于菜單內(nèi)容還有一些內(nèi)容,或許充實(shí)到結(jié)集后的文章中。本篇的文章太長了。
今日內(nèi)容回向:
1. 如何設(shè)置菜單?
2 如何讓菜單響應(yīng)不同的動作?