ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 35120|回复: 62

[原创] 司徒大侠和你一起学类模块

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-5-6 22:45 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
之前的帖子太乱,重新开贴整理下,看这里原帖地址 作者也是本人。本来注册两个号是赚积分用的。现在只用这个了,重新开始。
序言:
学习VBA快一年了,深感对于初学者很多教程都是模块化讲解,也就是假定这一章讲的是循环,然后假定你看完后,对所有其他章节的循环你都掌握了,事实是,我们还不一定掌握,为什么?从心理学的角度来说,前后几章的例子不连续,知识没有承上启下的联系,导致新的情景产生后影响对循环这个知识点的理解。我一直想写一个教程,换个角度给初学者讲解下VBA,陆续写了两三章了,自己感觉通俗易懂,不过只是自己感觉良好,所以我想先在论坛上发,让大家批评指正。

本人认为学习对概念的理解不一定在开始的时候理解的多么精准,好像不全部理解这个知识点就不能写代码一样。就算这个帖子只是集中精力讲类,VBA不用类也完全可以。
在构建一个概念之前,每个人都会在心里产生一个心智模型去套,去凑,去尽量接近这部分真理,也就是建构主义的方式。本人是心理学专业的,觉得对学习的过程感知更加细腻点。欢迎大家去百度什么叫建构主义。讲了这么多,其实我的意思是:就像初中数学知识和高中数学知识一样,初中的时候一般不会讲到复数,对负数开根号是没有意义的。因为我们初中时候学的知识就是说,数是实数,负数开根号没意义。我为了补充自己的类模块知识,写了以下教程给初学者,当然我还写了很多,希望大家提出意见,我一定写一系列依照这种风格的教程。




评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-5-6 22:52 | 显示全部楼层
有必要占个楼先{:soso_e100:}

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-6 22:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
预备情况,贴上参考资料:
VBA 类:隐者的秘密  作者Qee 用
电子书 :《Excel.2007.VBA.Programmers.Reference》翻译的书名是《Excel.2007.VBA参考大全》
实体书:《Microsoft Excel 2010 Programming by Example: With VBA, XML, and ASP 》暂无中文版
电子书:《Definitive Guide to Excel VBA, Second Edition》
电子书: 《VBA Developer's Handbook, 2nd 》
实体书:《Excel 2010 Power Programming with VBA 》中文版
电子书: 《Microsoft Excel VBA Professional Projects 》
电子书:《Professional Excel development  the definitive guide to developing applications using Microsoft Excel, VBA》第二版
电子书 :《Mastering Excel 2003 Programming With Vba 》
电子书 : 《Mrexcel-Excel 2010- VBA & Macros 》
电子书: 《Programming Excel With VBA And .NET (2006)》

相信我,参考了每一本关于类的章节,我就不信搞不定类

点评

收藏  发表于 2012-6-1 20:41

TA的精华主题

TA的得分主题

发表于 2012-5-6 23:21 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-6 23:30 | 显示全部楼层
zfq2100 发表于 2012-5-6 23:21
那么多电子书到底先看哪个啊

我都看了,放心

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-6 23:59 | 显示全部楼层
本帖最后由 司徒大侠 于 2012-5-7 00:00 编辑

标准模块和类的区别是什么?
《Programming Excel with VBA and .NET》书中有言:

The main difference between the modules and classes is how you use them:
最大的区别是你如何使用模块和类模块
第一,模块中的代码可以在单元格当公式使用
Code contained in modules can be used from formulas entered in cells.
第二,类模块中的代码可以对Excel中的事件作出反应
Code stored in a class can respond to events that occur in Excel.
类模块就是类 + 模块的含义(这不是废话吗?),然而转眼一想,是不是为了区分事物而产生了不同的名字?事实是,我们以前写的代码大部分是叫做标准模块。

类001

类001

如图看到了吗,我们习惯了模块,在模块下面出现了类模块。因为模块包括标准模块和类模块,所以严格意义上讲,模块省略了标准2个字,笔者虽然觉得不是很恰当的,但是省略了也无可厚非。


那么什么是类模块?
凭空出现一个类模块,它必定有它的用处,不然VBA引入类模块做啥?
先来解释下类的含义,类就是物以类聚的类,是不是有点晕?那么让我们从一个问题开始吧,请问:
鱼和泥鳅有什么区别?
(参考http://readthedocs.org/docs/learn-python-the-hard-way-zh_cn-translation/en/latest/ex45.html)

确实鱼是鱼,泥鳅是泥鳅,泥鳅是鱼,鱼不是泥鳅,鱼儿有很多种,泥鳅是鱼儿的一种。
哦,你说,这就是类别与个体的关系!是的,没错,类就是种类。
隐喻虽然好理解,但对与真正代码上的类,和现实中还是有较大差异的,毕竟现实中是真实的生物呢!所以我们只是抽象出一些重要特点,把类看做属性和动作的合体。现实中,鱼儿有颜色,大小等,这就是属性,会游泳会,冒泡泡,这就是动作。对应到VBA中就是我们用变量存储属性,用函数(过程)代表动作。
VBA中的类是具有变量和函数(包括过程)的怪胎。说他是怪胎是因为我们见的少,我们见的最多的是定义一个变量,然后定义一个函数,这个变量和函数是不同,离散的。但是类却好像活生生的“绑定”了变量和函数。从理解的角度定义(不犯罪吧?):类就是有过程(函数)又有变量的一个模板。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-7 00:14 | 显示全部楼层
本帖最后由 司徒大侠 于 2012-5-7 00:18 编辑

讲完概念接下来本该讲好处,不过,从学习的角度讲,还是先来几个例子吧,好处自然会豁然开朗。
我们先来定义一个鱼儿类,第一步当然是插入一个类模块如下图:
类002.png

类003.png
改好名字fish后,如上图。这一步做完后,开始写代码。哦,忘记了一件事,顺便讲一下,注意细节是对VBA的理解大有好处的,所谓细节我的理解就是,标点符号,各种图标,各种稀奇古怪你还不了解的菜单名称,在代码编辑以及实际编程实践中,这种细节很重要,虽然我们不能一下子完全理解,但是先在大脑中有个疑问是比较好的一种学习方法。例如,如果你没有一定的语言基础,比如c语言c++之类的语言,你对调试窗口始终有一个调用堆栈的菜单不解,当然,我一开始也不解,脑子里始终有个疑问,最后在实际的编程实践中,碰到书中正好讲了这个知识点,也就豁然开朗了。
类004.png
讲了这么多,其实想让大家注意这样一个差别: 类005.png
看到模块与类模块的图标有差异吧。一个是乱七八糟像星星,一个是井然有序的三角形,从这一角度再一次理解成,模块是离散的函数与变量,而类是集变量和函数(属性和动作)于一体。


===========================分割线不一定华丽==========================
类模块中的内容:
Public Name As String
Public Color  As String
Public Function Swim(Distance As Integer)
  Swim = Distance
End Function


标准模块中的内容:
Sub Fishforfun()
  Dim goldFish As fish
  Set goldFish = New fish
  goldFish.Color = "Gold Yellow" '哈哈,我不知道金黄色怎么说
  goldFish.Name = "Goldfish"
  MsgBox "定义一条:" & goldFish.Name & vbCrLf & "颜色当然是:" & goldFish.Color & vbCrLf _
      & "它向前游了" & goldFish.Swim(50) & "米"
End Sub


运行结果:

类006.png

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-5-7 00:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
讲的不错,希望楼主继续

TA的精华主题

TA的得分主题

发表于 2012-5-31 22:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-31 22:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
占楼Mark 希望深入点
对于类模块 又爱又恨呐
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 03:08 , Processed in 0.046538 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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