
這里,創(chuàng)建了一個簡單的動態(tài)菜單控件演示,為Excel2007工作簿中的三個工作表中的每一個顯示不同的菜單。圖1展示了激活工作表sheet1時出現(xiàn)的菜單。當(dāng)激活一個工作表時,VBA過程發(fā)送為工作表指定的XML代碼。在本示例中,直接存儲XML代碼在工作表里,使之更易閱讀。此外,XML標(biāo)志可以作為字符串變量存儲在代碼中。
圖1:動態(tài)菜單近件使得可以取決于內(nèi)容來創(chuàng)建變化的菜單
創(chuàng)建新選項卡、新組和動態(tài)菜單控件的RibbonX代碼如下:
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“本示例需要無論何時用戶激活新工作表時,都使Ribbon無效的一種方式。這里使用了先前顯示分頁符的示例相同的方法。聲明了一個IRibbonUI類型的Public變量MyRibbon,無論何時激活一個新工作表,都將在Workbook_SheetActivate過程中調(diào)用UpdateDynamicRibbon過程:
onLoad=”ribbonLoaded”>
<ribbon>
<tabs>
<tab id=”CustomTab” label=”Dynamic”>
<group id=”group1″ label=”Dynamic Menu Demo”>
<dynamicMenu id=”DynamicMenu”
getContent=”dynamicMenuContent”
imageMso=”RegionLayoutMenu”
size = “l(fā)arge”
label=”Sheet-Specific Menu”/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Sub UpdateDynamicRibbon()
‘ Invalidate the Ribbon to force a call to dynamicMenuContent
On Error Resume Next
MyRibbon.Invalidate
If Err.Number <> 0 Then
MsgBox “Lost the Ribbon object. Save and reload.”
End If
End Sub
UpdateDynamicRibbon過程使MyRibbon對象無效,強(qiáng)制對名為dynamicMenuContent(一個通過RibbonX代碼里getContent參數(shù)引用的過程)的VBA回調(diào)過程的調(diào)用。注意錯誤處理代碼。一些對VBA代碼的編輯銷毀了MyRibbon對象,而該對象是在打開工作簿時創(chuàng)建的。試圖使不存在的對象無效將會導(dǎo)致錯誤,消息框?qū)⑼ㄖ脩舯仨毐4婀ぷ鞑竞笤僦匦麓蜷_。而重新打開該工作簿是重新創(chuàng)建MyRibbon對象的唯一方式。
dynamicMenuContent過程的代碼如下。該過程遍歷活動工作表A列中的單元格,讀取XML代碼,將其保存在名為XMLcode的變量中。當(dāng)附加了所有的XML后,傳遞給returnedVal參數(shù),使動態(tài)菜單控件有新的代碼,因此顯示一組不同的菜單選項。
Sub dynamicMenuContent(control As IRibbonControl, _
ByRef returnedVal)
Dim r As Long
Dim XMLcode As String
‘ Read the XML markup from the active sheet
For r = 1 To Application.CountA(Range(”A:A”))
XMLcode = XMLcode & ActiveSheet.Cells(r, 1) & ” “
Next r
returnedVal = XMLcode
End Sub









