1) Ribbon load在打开这个加载项时候,为了能够告诉Excel它需要更新功能区,我们需要一个指向功能区对象的指针。该指针在onLoad回调中传递给我们。因此,让我们添加一个模块级对象变量并为其指定Ribbon对象:Sub mynzSheetToolscustomUI_onLoad(ribbon As IRibbonUI) Set moRibbon = ribbon ThisWorkbook.Worksheets("Sheet1").Range("RibbonPointer").Value = "'" & ObjPtr(moRibbon)End Sub 这里,VBA会记住Ribbon对象,因此我们可以要求它从代码中刷新。打开Excel文件并启用宏时,onLoad是第一个被调用的回调。 2)使用工作表选项卡名称填充下拉列表接下来发生的事情是下拉列表请求它需要加载的项目数。这是在mynzSheetToolsbtnSheets getItemCount回调中完成的:'Callback for mynzSheetToolsbtnSheets getItemCountSub mynzSheetToolsbtnSheets_Count(control As IRibbonControl, ByRef returnedVal) Dim lCt As Long Dim oSh As Object For Each oSh In Sheets If oSh.Visible = xlSheetVisible Then lCt = lCt + 1 Next returnedVal = lCtEnd Sub该过程只计算活动工作簿中可见工作表的数量,并将该数量传递给returnedVal变量,该变量将传递回Excel。 3)触发下一个回调,它将获取实际的工作表名称Public Sub mynzSheetToolsbtnSheets_getItemLabel(control As IRibbonControl, Index As Integer, ByRef returnedVal) Dim lCt As Long Dim oSh As Object For Each oSh In Sheets If oSh.Visible = xlSheetVisible Then lCt = lCt + 1 If lCt = Index + 1 Then returnedVal = oSh.Name Exit For End If NextEnd Sub调用此回调的次数与在上一次回调中传递的工作表数相同。索引从零开始,所以你必须注意返回到它的内容。因此,对sub的每次调用都要求一个工作表名称。 4)填充下拉列表时,我们希望它显示活动工作表的名称,由此回调处理.'Callback for mynzSheetToolsbtnSheets getSelectedItemIndexSub mynzSheetToolsbtnSheets_getSelectedItemIndex(control As IRibbonControl, ByRef returnedVal) Dim lCt As Long Dim oSh As Object For Each oSh In Sheets If oSh.Visible = xlSheetVisible Then lCt = lCt + 1 If oSh.Name = ActiveSheet.Name Then returnedVal = lCt - 1 Exit For End If NextEnd Sub 5)最后,如果我们从下拉列表中选择一张工作表,我们希望它将我们带到那里Sub mynzSheetToolsbtnSheets_Click(control As IRibbonControl, id As String, Index As Integer) Dim lCt As Long Dim oSh As Object For Each oSh In Sheets If oSh.Visible = xlSheetVisible Then lCt = lCt + 1 If lCt = Index + 1 Then oSh.Activate Exit Sub End If NextEnd Sub刚才讲过下拉索引从零开始,注意Excel的工作表索引从1开始。 6)更新TOC工作表我们设计一个空回调函数,因此让我们调用在开始时设计的宏:Sub mynzSheetToolsbtnInsertTOC(control As IRibbonControl) UpdateTOCEnd Sub [待续] Ø本讲内容参考程序文件:高级应用01.xlsm Ø第三方应用软件:Office RibbonXEditor-NETFramework-Installer.EXE Ø实现的外接应用程序:mynzSheetTools.xlma 我20多年的VBA实践经验,全部浓缩在下面的各个教程中:【分享成果,随喜正能量】愿意吃亏的人,终究吃不了亏。吃亏多了,总有厚报。爱占便宜的人,定是占不了便宜。赢了微利,却失了大贵。再好的东西,也可能长久拥有,不必计一时回赠,莫如常怀怜悯之情,常施援助之爱,得到人心,他物不缺。莫要以为成败无因,今天的苦果,是昨天所播之种;当下的付出,是明日的善报。。