分享

学习 Excel VBA 中的类模块

 lkyhzuma 2011-04-12

这几天,我们 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.CommandButton
Private Sub anniu_Click()
MsgBox "我的名字是:" & anniu.Name & Chr(10) & "我的宽度是:" & anniu.Width
End Sub

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

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多