Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2708|回复: 15

今天学习类,记个笔记

[复制链接]
发表于 2010-4-15 09:45 | 显示全部楼层 |阅读模式

RT...[em10]

学习链接:

http://www.excelpx.com/forum.php?mod=viewthread&tid=29586

例子中都有注释,我的学习方法是先自己理解,理解不了再看注释.

[此贴子已经被作者于2010-4-15 10:31:16编辑过]
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2010-4-15 09:48 | 显示全部楼层

类名:河南老乡

类模块中代码:
Public 籍贯 As String
Public 方言 As String
Private Sub Class_Initialize() '在类的Initialize事件中可以设置类的属性,它可以在标准模块中作为属性调用
    籍贯 = "河南"     '设置这个类(河南老乡)的籍贯
    方言 = "河南话"   '设置这个类(河南老乡)的方言类型
End Sub

模块中Test:
Sub test()
    Dim 张三 As New 河南老乡       '添加一个新河南老乡,这里的"河南老乡"是类模块的名称
    MsgBox "方言是:" & 张三.方言   '显示他的方言
    MsgBox "籍贯是:" & 张三.籍贯   '显示他的籍贯
End Sub

从Test开始理解,F8单步执行Test过程,运行到MsgBox "方言是:" & 张三.方言,跳到类模块中运行class_Initialize,再执行到MsgBox "籍贯是:" & 张三.籍贯的时侯直接得到籍贯属性,不再需要执行类模块中代码.

个人理解:

Test中定义了"张三"为类"河南老乡",当遇到第一个"张三"的时候,会自动跳到"河南老乡"这个类中.在类模块中也有事件,也就是"河南老乡"的事件(得到了初始化),在初始化的过程中给了"张三"两个属性.属性得到后就不需要第二次赋属性.

理解完.错就错吧,看到的不需要太信任我的理解.

[此贴子已经被作者于2010-4-15 9:55:59编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-4-15 09:57 | 显示全部楼层

类名:梯形

类模块代码:
Public 上底 As Double
Public 下底 As Double
Public 高  As Double
'在左上角下拉框中选class,在右上角选initialize 就可以自动生成开始和结束语句
Private Sub Class_Initialize()
    上底 = 0    '初始化上底的值
    下底 = 0    '初始化下底的值
    高 = 0      '初始化高的值
End Sub
Public Property Get 面积() As Double
    面积 = (上底 + 下底) * 高 / 2
End Property
'************************程序说明********************
'1、property get 方法也可以生成类(对象)的属性,如本例中的面积就是梯形的一个属性
'2、你也许会问:  为什么其他属性都在Class_Initialize事件(类加载)中设置,而这个要
  '使用property get方法来设置?
   '答:因为上底、下底和高都是给定的数值,他们假定不需要由计算得出,而面积需要在
       '模块中引用时根据给定的上底、下底和高计算后来求得。所以要使用property get方法。

模块中代码:
Sub 梯形面积()
    Dim tx As New 梯形   '实例化一个类,即分创建名称叫tx的梯形类对象
    tx.高 = 10           '重新设置它的高度
    tx.上底 = 2          '重新设置它的上底
    tx.下底 = 3          '重新设置它的下底
    MsgBox tx.面积       '计算它的面积
End Sub

新的设置属性的方法:Property Get

仍然F8运行,运行到tx.面积的时候跳到类模块中的Property Get 面积

暂时将Property Get理解为类似自定义函数的意思吧.不同的是这个里面各元素是在初始化中给出的.

[此贴子已经被作者于2010-4-15 10:04:50编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-4-15 10:07 | 显示全部楼层

还是根据我自己的方式,先运行主题部分:


Private Sub UserForm_Initialize()
    For i = 1 To 24
        Set newclass(i) = New che类   '创建一个新的che类对象
        Set newclass(i).che = Controls("checkbox" & i)  '设置新类和checkbox(i)控件创建关键
        Set newclass(i).frm = Me     '类窗体也和当前窗体建立关联
    Next
    Call 复选框随单元格内容更新
End Sub

运行到for循环部分,没有跑到类中运行代码.看了下后面的注释,是创建关联.(很多关联,24个)

转到类中看下为啥...
Public WithEvents che As MSForms.CheckBox
Public WithEvents frm As MSForms.UserForm


Public WithEvents che As MSForms.CheckBox
Public WithEvents frm As MSForms.UserForm

定义了che和frm两个控件.此后代码为che(checkbox)的change事件.

先猜一下,应该是在checkbox被点中,也就是引发change事件的时候会跳到此事件吧.

"复选框随单元格内容更新"这个过程没啥好看的,不研究.

不过这一句引发了事件了,UserForm1.Controls("checkbox" & i) = IIf(arr(m, k) = 0, 0, 1)

喔..看了下worksheet中还有一个change事件,这样的话看起来好麻烦.

还好昨天我蹲厕所的时候已经把这部分理解了一下.

建议不懂的去找一个更简单的例子看吧.

[此贴子已经被作者于2010-4-15 10:29:42编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-4-15 10:12 | 显示全部楼层

类模块中代码:
Public WithEvents myApp As Excel.Application '声明事件

Private Sub myApp_SheetActivate(ByVal Sh As Object)  '设置类的工作表激活事件程序
    MsgBox Sh.Name    '事件程序的内容
End Sub

刚才没提到这个东西,昨天我在厕所的时候理解了这个withevents就是定义后面的变量为带事件的.

这里定义了myApp是Excel,而在下面的事件中有一句:ByVal Sh As Object

这个和正常我们认识的事件里的差不多了,Sh应该理解为工作表.在这里就是在触发了SheetActivate时当前的那个工作表.

在workbook_open的时候用了此代码:
Dim app As New 兰色的事件类   '这步很重要,别忘了创建一个新类
Private Sub Workbook_Open()
    Set app.myApp = Application    '设置新类的程序为excel程序
End Sub

也就是在打开了宏表文件的时候就新添加了一个事件(类中的代码)

在此事件的作用下,每次点击新工作簿的工作表都会触发工作表的SheetActivate事件

[此贴子已经被作者于2010-4-15 10:41:51编辑过]
回复

使用道具 举报

发表于 2010-4-15 10:13 | 显示全部楼层

河南老乡[em04]
回复

使用道具 举报

 楼主| 发表于 2010-4-15 10:34 | 显示全部楼层

学习链接:http://www.excelpx.com/dispbbs.asp?BoardID=5&replyID=156148&id=29560&skin=0

看了一下,这个和第三个应该是一起学的.第三个理解完了,这个就不看了.

记得我昨天蹲马桶的时候看的就是想的类似的问题.

看不懂没关系,也去蹲蹲马桶就好了.

[此贴子已经被作者于2010-4-15 10:46:25编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-4-15 10:43 | 显示全部楼层

喔,看来最后一个例子也是和第三第五个一样的类型..

建议大家看第三个第五个看不懂的时候来看这个例子吧.

例子链接:判断excel工作表中哪张图片被单击(VBA类模块示例)

[此贴子已经被作者于2010-4-15 10:54:14编辑过]
回复

使用道具 举报

 楼主| 发表于 2010-4-15 10:50 | 显示全部楼层

最后一个例子让我想起这个好像在V中的课上讲过.

惭愧死,那时我几乎没怎么听过课..

来个打手把我拖出去打一顿吧.

回复

使用道具 举报

发表于 2010-4-15 10:51 | 显示全部楼层

来了[em05]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-4 12:18 , Processed in 0.222519 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表