暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

自定义RibbonX(功能区)触发回调

VBA语言専攻 2022-05-08
184
分享成果,随喜正能量】人生苦短,糊涂一点不较真,大度一点不生气,凡事看淡,一切随缘,人生本过客,何必千千结。生活,从来不会故意刁难任何人,让你烦恼的,一直都是你自己的拿得起、放不下。。
《VBA高级应用30例》,是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三十个专题,今日内容是第一个专题“在EXCEL中构建加载项”,今日讲解:自定义RibbonX(功能区)触发回调

应用1  EXCEL中构建加载项

   Excel是一个功能非常强大的应用程序,具有数千个选项和功能,可帮助我们构建模型、报告和数据分析。但是,在我们日常工作中往往也会需要一些额外的功能,这就需要我们使用VBA来扩充。本文将给大家展示如何创建一个小型实用程序,我将概述来创建外接程序的所有步骤。这些步骤的使用可以帮助大家构建自己的自定义应用。

代码功能实现

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 getItemCount
Sub 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 = lCt
End 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
    Next
End Sub
调用此回调的次数与在上一次回调中传递的工作表数相同。索引从零开始,所以你必须注意返回到它的内容。因此,对sub的每次调用都要求一个工作表名称。

4)填充下拉列表时,我们希望它显示活动工作表的名称,由此回调处理.
'Callback for mynzSheetToolsbtnSheets getSelectedItemIndex
Sub 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
    Next
End 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
    Next
End Sub
刚才讲过下拉索引从零开始,注意Excel的工作表索引从1开始。

6)更新TOC工作表
我们设计一个空回调函数,因此让我们调用在开始时设计的宏:
Sub mynzSheetToolsbtnInsertTOC(control As IRibbonControl)
    UpdateTOC
End Sub

[待续]

Ø本讲内容参考程序文件:高级应用01.xlsm

Ø第三方应用软件:Office RibbonXEditor-NETFramework-Installer.EXE

Ø实现的外接应用程序:mynzSheetTools.xlma

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:
分享成果,随喜正能量】愿意吃亏的人,终究吃不了亏。吃亏多了,总有厚报。爱占便宜的人,定是占不了便宜。赢了微利,却失了大贵。再好的东西,也可能长久拥有,不必计一时回赠,莫如常怀怜悯之情,常施援助之爱,得到人心,他物不缺。莫要以为成败无因,今天的苦果,是昨天所播之种;当下的付出,是明日的善报。。

文章转载自VBA语言専攻,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论