加载项中对事件的处理

分享成果,随喜正能量】一個人的個性(脾氣)很重要,個性好,到哪裏都跟人家和合,能隨順人家 。但隨順有輕重之分,若是壞事,我們當堅持自己的原則,不要隨順壞事 。。
《VBA高级应用30例》,是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用 。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级 。本套教程共三册三十个专题,今日内容是第一个专题“在EXCEL中构建加载项”,今日讲解:加载项中对事件的处理 。

加载项中对事件的处理



应用1 在EXCEL中构建加载项

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

8 必要事件的处理

在外接程序的当前状态下 , 功能区将加载并填充活动工作簿中的工作表 。但仅此而已;如果切换到不同的工作簿,我们最终会得到错误的工作表集 。代码中没有处理更新功能区的内容 。那么我们需要什么呢?我们希望功能区在以下情况下尽快更新:转换到另一张时;隐藏或解除隐藏工作表时;切换到另一个工作簿时 。
通常,我们在普通工作簿中的ThisWorkbook模块添加代码 。您将使用以下事件:
Private Sub Workbook_Activate()
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
End Sub
这些事件仅在工作簿中响应,任何工作簿都需要这些事件 。这样的事件称为应用程序事件 。
1)类模块 在本专题中我将插入一个类模块,并将其命名为clsApp , 在类模块的顶部,我使用特殊关键字“WithEvents”声明了一个对象变量:
Public WithEvents App As Application
以上代码会告诉编译器变量“App”将包含指向向我们公开事件的对象的指针 。在本例中,将使用Excel应用程序 。似乎没有发生任何明显的情况,但如果正确执行此操作,则会在代码窗格的左侧下拉列表中添加一项 , 如下截图:
加载项中对事件的处理

一般情况下,如果选择“App”,VBA编辑器将自动在模块中插入默认应用程序事件:
加载项中对事件的处理

我们写入下面的代码:
Private Sub App_SheetActivate(ByVal Sh As Object)
InvalidateRibbon
End Sub
Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
InvalidateRibbon
End Sub
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
InvalidateRibbon
End Sub
Private Sub Class_Terminate()
Set App = Nothing
End Sub
请注意,我添加了对InvalidateRibbon的调用,modRibbonX中的一个过程如下所示:
Sub InvalidateRibbon()
On Error Resume Next
【加载项中对事件的处理】GetRibbonObjectReference.Invalidate
End Sub
上述过程中我们还利用到了GetRibbonObjectReference过程:
'This is called from the InvalidateRibbon sub
Public Function GetRibbonObjectReference() As Object
If moRibbon Is Nothing Then
Set moRibbon = GetRibbon(ThisWorkbook.Worksheets("Sheet1").Range("RibbonPointer").Value)
End If
Set GetRibbonObjectReference = moRibbon
End Function
这个简单的“Invalidate”方法告诉Excel完全重做回调以填充功能区控件 。就这么简单 。我还添加了Class Terminate事件,以确保在类终止时将App变量巧妙地设置为nothing 。内务管理对于VBA开发人员也很重要 。
Private Sub Class_Terminate()
Set App = Nothing
End Sub
2)类模块的工作
在我的第五套教程《VBA中类的解读及应用》中,我在反复强调类之虚无 。类模块是一个代码蓝图 。与普通模块不同,它不是开箱即用的 。只有将类的副本加载到内存中,正是副本(开发人员称之为“实例”化)才能完成我们的预设工作 。这个实例化是我从一个普通模块中做的,我插入了这个模块并称之为myInit 。
'声明一个用于保存类clsApp实例的变量
Dim mcApp As clsApp
Public Sub Init()
'释放变量mcApp,以防已加载
Set mcApp = Nothing
'创建clsApp的新实例
Set mcApp = New clsApp
'将Excel对象传递给它
Set mcApp.App = Application
End Sub
在该模块的顶部 , 有一个名为mcApp的模块级对象变量,它将保留一个指向clsApp类实例的指针 。这是为了确保创建该类的过程到达其End子语句时不会终止该类 。
[待续]


  • 本讲内容参考程序文件:高级应用01.xlsm
  • 第三方应用软件:Office RibbonXEditor-NETFramework-Installer.EXE
  • 实现的外接应用程序:mynzSheetTools.xlma

加载项中对事件的处理

我20多年的VBA实践经验 , 全部浓缩在下面的各个教程中:
加载项中对事件的处理

加载项中对事件的处理

分享成果,随喜正能量】宽恕就是不再希望过去可能会有所不同 。如果我们总是抱着过去的痛苦不放 , 我们就无法前行 。。

相关经验推荐