VBA高级应用30例应用1:类模块中必要事件的处理

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级

本套教程共三册三十个专题,VBA高级应用30例应用1:类模块中必要事件的处理2887f2f3d3bd8da2049746e1a36237dc.jpeg

分享成果,随喜正能量】 外表简单一点,内涵就丰富一点;需求简单一点,心灵就丰富一点;言语简单一点,沟通就丰富一点;私心简单一点,友情就丰富一点;情绪简单一点,人生就丰富一点;效率简单一点,成果就丰富一点;环境简单一点,空间就丰富一点;爱情简单一点,幸福就丰富一点。。

应用1 在EXCEL中构建加载项

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应用程序。似乎没有发生任何明显的情况,但如果正确执行此操作,则会在代码窗格的左侧下拉列表中添加一项,如下截图:

6f412eb1a5a2356d1f68a7b01cbec5a8.jpeg

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

fc68130dd82badb381356cf566ccb2d4.jpeg

我们写入下面的代码:

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子语句时不会终止该类。

(待续)

262ab371077c104fe9d003b3a2caef2a.jpeg

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:


6d2f0746d94cae2fd6645080ed2ebb02.jpeg

c70008732a17e80316f040b299d4f3e6.jpeg

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值