Excel精英培训网

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

[分享] 类,对象和实例的浅显理解

  [复制链接]
发表于 2011-3-25 17:09 | 显示全部楼层 |阅读模式
本帖最后由 wbzxz 于 2011-3-26 16:52 编辑

关于这个问题,我这两天被搅成了浆糊,好在在吕布、兰版等各位老师和童鞋的帮助下,算是搅和的清楚了一些,但限于

知识水平有限,还是理解的不深入,就把我目前的理解与大家分享,其中有错误的和不足的地方,请各位老师和童鞋指点

和补充。

很多书上都告诉我们什么是对象,诸如range,worksheet,workbook,对象有属性、方法、事件,这些我就不乱讲啦,也

远远没有书上讲的好。我举几个简单的代码例子,告诉你哪个是对象,哪个是类,哪个是实例。其实我最担心的是我的某

些理解是错误的,如果您发现了,一定帮我纠正过来。


1)以range对象举个例子

  1. sub test()
  2.   dim myRng as Range
  3.   set myRng=range("a1")
  4. end sub
复制代码

图1.jpg


正如上图所示,range是,myRng是对象变量,range("a1")是对象,也就是range类的实例对象就是类的实例,这个概念很重要)。

range是类不是我说的,是微软说的,这是对象浏览器的截图。

图2.jpg



dim myRng as Range
这句代码是声明一个对象变量,以Range类为模板,记住,对象变量不是一个对象

set myRng=range("a1")
这句代码中,对象出现了,range("a1"),myRng这个对象变量只是对range("a1")对象的引用,记住,是对象的引用,不是对象

为什么我们说对象变量myRng只是对range("a1")对象的引用呢?

因为对象变量不储存数据,它们只是告诉数据在哪儿。正如本例所表示的,myRng对象变量告诉VB数据在当前工作表的单元格"a1",并没有把range("a1")这个对象赋值给myRng。

评分

参与人数 9 +156 收起 理由
xdwy81129 + 10 没有接触过类,收藏学习
mxg825 + 3 写的真好!
雨后彩霞 + 3 很棒!!
lyn666666 + 3
hhzjxss + 16 整理得好,值得学习!

查看全部评分

 楼主| 发表于 2011-3-25 20:20 | 显示全部楼层
本帖最后由 wbzxz 于 2011-3-26 16:34 编辑

2)我们用类模块做个例子
假设我们有个类模块 Class1 ,代码如下
  1. Option Explicit
  2. Public value1 As Integer
复制代码

在标准模块中输入如下代码:
  1. Option Explicit

  2. Sub test()
  3.   Dim myClass As Class1
  4.   Set myClass = New Class1
  5.   myClass.value1 = 1
  6. End Sub
复制代码
如图所示
图1.jpg
和第一个例子一样,先定义对象变量,然后把对象的引用赋值给对象变量;
看到第二个例子,您肯定和我第一看到这条语句一样,产生了疑问,怎么多了个New,起什么作用的?
帮助里是这样描述的:
   如果 New Set 一起使用,则将创建该的一个新实例。
怎么理解这句话呢,我这这样认为的,set语句是为了把对象的引用赋值给对象变量,这里面对象在哪里呢?是Class1吗,不是,那是什么,是新创建的实例(我们已经知道,对象就是类的实例),new Class1,多么形象啊,原来new关键词是创建对象的。

这样我们就看懂了上面的代码
Dim myClass As Class1 定义一个以类Class1为模板的对象变量
Set myClass = New Class1 因为没有现成的Class1类的实例(也就是对象),所以用new关键词立刻创建一个,然后把这个对象的引用复制给对象变量。

这个时候,您可能会思考,第一个代码里面直接用了range("a1")这个现成的对象,能不能也用new关键字呢?下面是错误的代码
  1. set myRng as new range
复制代码
为什么不能用new关键词呢,原因在vbe的帮助里已经写了:

New 关键字不能用来声明任何内部数据类型的变量以及从属对象的实例


因为range对象是从属对象,所以不能用new关键字,直接拿来用就可以啦。
关于从属对象,兰版解释过,请看这个帖子
http://www.excelpx.com/thread-169589-1-1.html

小结一下:这个例子告诉我们什么,是告诉我们,如果有类,没有现成的对象怎么办啊?用关键字new,创建一个就行。

补充一下:定义对象变量语句和赋值语句可以和二为一
  Dim myClass As Class1
  Set myClass = New Class1
可以变成
   Dim myClass As New Class1
帮助里面的描述是这样的:
如果使用 New 来声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用 Set 语句来给该对象引用赋值。
这句我就不解释啦,描述的很清楚。

既然定义对象变量和赋值语句的可以和二为一,那么两条语句和一条语句的区别是什么呢?请详见下面这个帖子:

http://www.excelpx.com/forum.php?mod=viewthread&tid=169192&page=2#pid2547131



回复

使用道具 举报

 楼主| 发表于 2011-3-26 18:17 | 显示全部楼层
本帖最后由 wbzxz 于 2011-4-6 22:04 编辑

3)举一个关于定义字典对象的例子
由于字典对象是外部对象,所以有两种定义方法

方法一:

首先完成引用库的过程:
    先引用微软的脚本运行时库Microsoft Scripting Runtime,可在VBE窗口,从菜单-工具-引用,然后勾选Microsoft Scripting Runtime,或者点击浏览,在添加引用对话框中选择c:\windows\system32\scrrun.dll,并打开,确定。完成引用。


然后按照我们上面说的对象变量的定义和引用方法:
  1. Sub test()
  2.   Dim d As Scripting.Dictionary
  3.   Set d = New Dictionary
  4. End Sub
复制代码
这个代码大家肯定非常清楚,d是对象变量,Scripting.Dictionary是类(实际上Scripting是库,Dictionary是类,我们添加了引用库后,就可以不写库名啦,所以也可以写成Dim d As Dictionary),New dictionary是创建对象(Dictionary类的实例



方法二:
如果我们没有引用库的操作:


那么我们就要这样来写代码

  1. Sub test()
  2.     Dim d as object
  3.     Set d = CreateObject("Scripting.Dictionary")
  4. ENd Sub

复制代码


在上面的代码中,也没有用到new关键字,为什么呢?


是这样的,set语句帮助里有这么一句话:


可以用 New 关键字或 CreateObject 函数,在 Set 语句中赋值对一个新的对象的引用。


实际上,在这个代码中,d还是对象变量,不过这一次类是不可知的,所以就用object代替啦。因为对象不可知,所以不能用new object,这肯定是错误的,于是就用了CreateObject函数,来代替new关键字,创建一个新的dictionary对象,并且将对象引用赋值给对象变量d。





回复

使用道具 举报

 楼主| 发表于 2011-3-26 18:18 | 显示全部楼层
我所知道的关于有关的情况和实例只有这些啦,希望大家为我增加一些。看看还有什么情况。谢谢大家。
回复

使用道具 举报

发表于 2011-3-27 18:25 | 显示全部楼层
写的非常好
回复

使用道具 举报

 楼主| 发表于 2011-3-27 18:59 | 显示全部楼层
谢谢兰版,我会继续努力的。
回复

使用道具 举报

发表于 2011-3-27 22:00 | 显示全部楼层
很不错!!好好学习一下!!
回复

使用道具 举报

发表于 2011-3-28 00:53 | 显示全部楼层
写得真厉害!
理解得很深刻啊~!
回复

使用道具 举报

发表于 2011-3-28 21:31 | 显示全部楼层
很厉害,我也要慢慢学习
回复

使用道具 举报

发表于 2011-3-28 22:54 | 显示全部楼层
{:261:}{:261:}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 16:53 , Processed in 0.474139 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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