分享成果,随喜正能量】人生苦短,糊涂一点不较真,大度一点不生气,凡事看淡,一切随缘,人生本过客,何必千千结。生活,从来不会故意刁难任何人,让你烦恼的,一直都是你自己的拿得起、放不下。。
在实际工作中分发VBA程序,写好的程序可以升级

应用1 在EXCEL中构建加载项
Excel是一个功能非常强大的应用程序,具有数千个选项和功能,可帮助我们构建模型、报告和数据分析。但是,在我们日常工作中往往也会需要一些额外的功能,这就需要我们使用VBA来扩充。本文将给大家展示如何创建一个小型实用程序,我将概述来创建外接程序的所有步骤。这些步骤的使用可以帮助大家构建自己的自定义应用。
7 代码功能实现
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实践经验,全部浓缩在下面的各个教程中:

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