诛仙飞升后转阵营主线:学习 Excel VBA 中的类模块

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 11:37:14

这几天,我们 Team 又有一个新的流程上线,所以制作一个新版工作 Report 的 Excel 文档的任务又落到了我头上,以前利用 Excel VBA 写过很多类似的文档,所以这个任务的完成还算是轻车熟路,基本上把以前写的 Daily Report 文档拿过来修改一下就 OK 啦。

在代码的编写中,我想到了新的问题,因为我编写的文档需要大量的按钮控件,点击按钮Excel完成的动作大致相同,以前我只是把相同的问题,归类到一个 Sub 中去,然后再不同的按钮的Click函数中调用,其实这样做只是提高了代码的可修改性和重用性,学过设计模式的朋友应该了解,这样做的目的无非是如果按钮的响应动作发生变化,我只需要修改 Sub 中的代码即可,但是即便是这样,我还需要在制作新的 Excel 文档时手动生成大量的按钮Click事件响应函数,使用“海量”的”CTRL+V” 操作,于是懒惰的我开始思考有没有更简单的方法,最开始的时候我还比较享受使用“海量”的”CTRL+V” 操作,因为毕竟100个按钮,如果0.5秒操作一次的话,一分钟就搞定了,看来懒人的劳动是必须要量化的,呵呵。不过,实际问题是,在我的代码中每个 Click 事件的响应函数中需要动态获取按钮本身的Cell位置,也就是所以我需要修改100个的函数,这样的工作量太大了,所以我开始思考: Excel VBA中是否具有 Java 中的反射机制?

我在 ExcelHome 论坛中询问了相关问题,多亏 HHAAMM 大哥的帮助,他告诉我 Excel VBA 虽然没有反射机制,但是我所希望的功能完全可以通过 Excel VBA 中的类模块来实现并给出了一个很好的实例。于是,我通过 Google 了一些类模块的学习资料,认真的学习了一下。类模块机制给开发者提供了自定义控件动作的功能。

下面的例子实现了自定义 Excel 文档中的 CommandButton 的 Click 动作:

首先创建一个类模块,

Public WithEvents anniu As MSForms.CommandButtonPrivate Sub anniu_Click()MsgBox "我的名字是:" & anniu.Name & Chr(10) & "我的宽度是:" & anniu.WidthEnd Sub

其次,在 Workbook 模块中编写以下代码:

Dim 按钮() As 类1Private Sub Workbook_Open()Dim a As Object, j%For Each a In Sheet1.OLEObjectsIf InStr(a.Name, "CommandButton") = 1 Thenj = j + 1ReDim Preserve 按钮(j)Set 按钮(j) = New 类1Set 按钮(j).anniu = Sheet1.OLEObjects(a.Name).ObjectEnd IfNextEnd Sub

以上就完成了自定义 CommandButton  动作。感兴趣的朋友们,可以自己找找 Excel 类模块的相关知识系统的学习一下。