本帖最后由 jiulongpo 于 2012-8-6 20:40 编辑
接 细品RibbonX(24):dropDown控件详解
6、创建自定义下拉控件 本示例相当有趣,因为前后使用了两个dropDown元素。与在介绍组合框控件示例时相似,第一个控件中列出了工作簿中的所有工作表。然而,在从工作簿中添加或移除工作表时,我们使用可用的回调来更新下拉列表, 第二个控件允许用户切换所选工作表的可见性:xlSheetVisible、xlSheetHidden和xlSheetVeryHidden。 (1)新建一个工作簿,以.xlsm为扩展名保存后关闭。 (2)在CustomUI Editor中打开该工作簿,并输入下列XML代码: <customUI onLoad=“rxIRibbonUI_onLoad“ xmlns=“http://schemas.microsoft.com/office/2006/01/customui“> <ribbon startFromScratch=“false“> <tabs> <tab id=“rxtabDemo“ label=“Navigation“ insertBeforeMso=“TabHome“> <group id=“rxgrpNavigate“ label=“Navigate To“> <dropDown id=“rxddSelectSheet“ label=“Apply To:“ visible=“true“ onAction=“rxddSelectSheet_click“ getItemID=“rxitemddSelectSheet_getItemId“ getItemCount=“rxitemddSelectSheet_getItemCount“ getItemLabel=“rxitemddSelectSheet_getItemLabel“/> <dropDown id=“rxddSheetVisible“ label=“Set To:“ onAction=“rxddSheetVisible_click“> <item id=“rxitemddSheetVisible1“ label=“Visible“/> <item id=“rxitemddSheetVisible2“ label=“Hidden“/> <item id=“rxitemddSheetVisible3“ label=“VeryHidden“/> </dropDown> </group> </tab> </tabs> </ribbon> </customUI> 生成回调签名,并复制代码后关闭CustomUI Editor。 在Excel中打开该工作簿,打开VBE并将回调签名代码粘贴到一个标准模块中。注意到,少生成了一个回调签名:getItemID,需要补充。 首先处理onLoad回调。在代码开始处添加两个变量,一个包含RibbonUI对象,另一个存放所选的工作表名: Public RibbonUI As IRibbonUI Dim sSheetName As String 接着,设置onLoad回调确保RibbonUI对象在装载时被捕获: ‘customUI.onLoad回调 Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI) Set RibbonUI = ribbon End Sub 下面的代码获取工作表数: ‘rxddSelectSheet getItemCount回调 Sub rxitemddSelectSheet_getItemCount(control As IRibbonControl, ByRef returnedVal) returnedVal = Worksheets.Count End Sub 下一步,设置getItemLabel回调,返回下拉列表中每个项目的文本: ‘rxddSelectSheet getItemLabel回调 Sub rxitemddSelectSheet_getItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal) returnedVal = Worksheets(index + 1).Name End Sub 注意到数组参数使用index+1,这是因为VBA默认的数组索引号基于0,而Excel默认的工作表索引是基于1。 接下来,确保为每个下拉项动态生成唯一的ID,回调代码如下: Sub rxitemddSelectSheet_getItemID(control As IRibbonControl, index As Integer, ByRef id) id = “rxitemddSelectSheet” & index+1 End Sub 更新rxddSelectSheet_click过程如下: ‘rxddSelectSheet onAction回调 Sub rxddSelectSheet_click(control As IRibbonControl, id As String, index As Integer) On Error Resume Next Call rxitemddSelectSheet_getItemLabel(control, index, sSheetName) If Err.Number <> 0 Then MsgBox “Sorry,that worksheet does not exist!” RibbonUI.InvalidateControl “rxddSelectSheet” End If End Sub 已经完成动态dropDown控件的设置后,再来为静态下拉列表设置唯一的回调: ‘rxddSheetVisible onAction回调 Sub rxddSheetVisible_click(control As IRibbonControl, id As String, index As Integer) ‘检查已选择的工作表 On Error Resume Next sSheetName = Worksheets(sSheetName).Name If Err.Number <> 0 Then MsgBox “Sorry,but you need to select a valid sheet first!” Exit Sub End If ‘改变工作表的可见性 Select Case id Case “rxitemddSheetVisible1″ Worksheets(sSheetName).Visible = xlSheetVisible Case “rxitemddSheetVisible2″ Worksheets(sSheetName).Visible = xlSheetHidden Case “rxitemddSheetVisible3″ Worksheets(sSheetName).Visible = xlSheetVeryHidden End Select If Err.Number <> 0 Then MsgBox “Sorry,this is the only visible sheet.” & vbCrLf & “You cann’t hide the all!” End If On Error GoTo 0 End Sub 至此,全部代码已完成。可以测试了,如下图所示。
|