ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: hiyou

工作表、工作簿和模块的区别;类与模块

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-6-21 17:20 | 显示全部楼层
本帖已被收录到知识树中,索引项:类和类模块

 一直都在用,但一直都不是很明白,看了才知道有這么多差別

謝謝

TA的精华主题

TA的得分主题

发表于 2006-6-23 11:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

谢谢楼主。

TA的精华主题

TA的得分主题

发表于 2006-6-25 16:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一直都不是清楚,学习中,谢谢了,继续[em24][em23][em26]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-26 10:50 | 显示全部楼层

加了一点内容,演示窗体对象(这部分内容已经加到主贴相关部分了,第一次看的朋友只要看主贴,不必COPY下来)

因为有朋友问过我FORM对象和类到底怎么回事,就补了这部分,也让大家看看FORM1类是怎么糊涂到底的(主贴已经说过,一个FORM1类,一个同名的对象,VB太能糊了)

但是,象SHEET1这样的工作表类更特殊,它不可以NEW生成一个新对象,我也没办法做演示

——分割线————————————————————————————————————————————————分割线——————

那怎么说明这是一个类呢?很简单,当你定义了FORM1这个窗体,试着做下面的工作(可以在立即窗口做,也可以在某程序段里试)

(可下载这个附件EXCEL的FORM1对象演示)图片点击可在新窗口打开查看点击浏览该文件

'——————————————

Set X = New Form1 '创建一个新的窗体

X.Show 0    '<===后面的0为了让代码能继续执行,两个窗体可以同时显示

X.Left = 0

Set x1 = New Form1

x1.Show 0

x1.Left = X.Width

X.Caption = "第一个窗口"
x1.Caption = "第二个窗口"


Form1.Show 0
Form1.Left = x1.Width + x1.Left
Form1.Caption = "FORM1原始对象"

'———————————————

 

你会看到三个窗体,前两个都是FORM1类产生的实例对象,而不是原来的FORM1对象,请细细品味FORM1类FORM1对象之间的区别

TA的精华主题

TA的得分主题

发表于 2006-6-26 23:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

看懂了。

理解是这样的:在VBA中,窗体、工作表、工作簿既是类模块,又是对象,而我们通常考虑的是它们的对象使用方式。

另外,我们可以自己建立一些类模块来完成一些功能。

那么,在VBA中,有没有不使用类就无法实现的功能?或者说有没有使用了类后实现起来会容易很多的问题?

是否常用于在OFFICE外来操纵OFFICE的情况?例如:http://club.excelhome.net/dispbbs.asp?boardid=2&replyid=401852&id=168676&page=1&skin=0&Star=2 这里的例子,他是在VB中写代码,在工作簿还没打开时就增加工作表,那么用你的app_NewWorkbook的代码可以实现。而如果打开工作簿再增加工作表,就不需要类模块了,简单地 Worksheets.Add 就可以了。

坛里有关类讲解的文章只找到这一篇:http://club.excelhome.net/viewthread.php?tid=36365 。因为很欣赏hiyou楼主老师你的讲解方式,所以希望您能继续讲解一些类实例,或者直接讲解 VB 中的类使用也好,这样我们进步一定会更快些的[em24]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-28 08:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

类是不是“不可少”的东西,这个问题不太好回答

初学VBA接触到的多是子程序和函数,但这个世界实际上却已经是充斥着对象,VBA和OFFICE本身就是COM组件对象模型,它只是努力在表现出一个简洁的观念罢了。

OOP面向对象的编程技术是在结构化编程的基础上发展起来的观念,VBA学习者不一定要学,仅从EXCEL这一项来说,很多朋友因为公式应用有兴趣才入门VBA,学到函数,我觉得也够了(我个人的观感,并不是什么都要学到精通到大师几颗星什么的,因为叫口号很容易,最早的目的是兴趣就好,小时候我喜欢画画,到现在还喜欢,从没想过要当画家的,学过书法,但不可能成为书法家而且我最讨厌隔壁的某书法家,写的字都我一个都认不出来TNND...),不过,如果真的很想进阶,熟悉VB语法之后,就是对象化编程,因为除了挖“有什么VB函数”之外,VBA中看的大部分秘密,其实都系于对象结构上:数据库ADO是来自ADODB这个对象引用,整个工作表、工作簿、窗体、甚至EXCEL应用程序(APPLICATION)本身都是对象,在VBA群中的讨论,大部分不离事件、属性和调用,这都是类和对象的特征。

因此,VBA学习过程对程序员(指熟悉了VB这些语言的一群)来说,主要是了解某个OFFICE程序对象层次结构的过程,具体到EXCEL,就是了解从APPLICATION顶层到WORKBOOKS到WORKBOOK直到下面RANGE的方法、属性、事件,对在WORD就是从APPLICATION到DOCUMENTS、THISDOCUMENT等等
除了OFFICE,在其它的WINDOWS应用程序中,也有类似的对象结构,例如IE浏览器、ADO、XML等等,在WINDOWS中掌握这种应用(自动化对象),你可以突破OFFICE和VBA自由飞翔,比如在ASP中这样做:
SET X=SERVER.CREATEOBJECT(”EXCEL.APPLICATION”)  ‘在ASP里创建使用EXCEL
或在FOXPRO中这样做
X=CREATEOBJECT(”ADODB.RECORDSET”)  *创建一个记录集
上面两个分别是在ASP和FOXPRO中创建EXCEL对象,以及在FOXPRO中创建ADO对象的语法,我想这里的朋友看起来很眼熟,没错,这是CREATEOBJECT对象语法,除了FOXPRO中没有SET语句,其它的都差不多,之后的用法也差不多,在这个时候,VBA语法不一定重要,因为在其它的语言环境里有些语法要素你可能要重学,但类和对象是一样的,重要的是对它们的了解。

然后?然后,你就要考验自已了,这么说吧,做入屋小偷,偷东西得开锁,你首先得了解锁的性能,拆好几百把锁——咳,我不是提倡做小偷,我还希望天下无贼呢——我是说,你想深入了解对象,就得了解对象,最好做几个类和对象,多编多写——就这回事,跟小偷开锁的原理还是不一样的,人家没那么方便,他要学我们,就得自已做出几百把锁......

最后说说VBA类做不到的事。其实OOP本来只是一个概念,只要有心做,编译了都是机器码,不应该有做不到的东西,象JAVA就是完全的OOP,它的世界里都是类,什么都面向对象化编程了,这本来可以说明问题(就是OOP无所不能)。但VBA里的类,不太很完整,不能脱离全局的函数存在。
OFFICE中VBA的类模块,到目前为止,还没有STATIC静态函数和变量(注:VBA有一个STATIC的语句可以对SUB和FUNCTION使用,但不是我所说的类静态函数),而普通的类变量和类函数/方法,必须在出现一个类的实例以后才能使用,所以,在理论上,只有类而没有其它标准模块的一组程序是不可以启动运行的,在VBA里的类,一般是从其它的标准模块启动程序里NEW实例化以后再运行,所以不能作为启动程序,或许可以看成是它“做不到的事”吧。
(有的朋友可能会说,EXCEL中本身就有实例对象application、thisworkbook,它们在VBA之前已经运行了,可以用它们的事件autoopen、workopen之类启动运行类模块,但在启动的过程上,我认为应该把它们当成VB的MAIN一类的标准启动程序来看)
与VBA的类不同,在面向对象化的语言里,象JAVA(甚至不是完全OOP的C++里),类都可以有静态成员,其中静态函数可以在类的任何对象出现之前调用,就不会有上面提到的问题了。

[此贴子已经被作者于2006-6-28 8:12:03编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-6-28 08:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

是否常用于在OFFICE外来操纵OFFICE的情况?例如:http://club.excelhome.net/dispbbs.asp?boardid=2&replyid=401852&id=168676&page=1&skin=0&Star=2 这里的例子,他是在VB中写代码,在工作簿还没打开时就增加工作表,那么用你的app_NewWorkbook的代码可以实现。而如果打开工作簿再增加工作表,就不需要类模块了,简单地 Worksheets.Add 就可以了。

那个例子中,他想监视每个工作簿的动作,不管有没有工作簿打开,都始终存在于EXCEL中,又跟工作簿打开的事件有关联,找这个对象的话,APPLICATION对象就最合适了,并不是“工作簿没打开时就增加工作表”的问题,他想对每一个工作簿都适用,但不对每一个工作簿编程,这样就是WORKBOOKS或APPLICATION这一级来管理,但WORKBOOKS没有关联的事件,所以要用APPLICATION。

举例来说,你想在EXECL不管哪张工作表上发生变化时都横插一腿处理(这是很猛的,很少人做这种事),就可以用APPLICATION的SHEETSELECTCHANGE,但如果只是想在本工作表发生变化才处理,只要用这张表的SELECTCHANG事件,很多人使用工作簿级的SHEETSELECTCHANGE,则是本工作簿任一张工作表出现改变,他的代码都能处理,这是不同级别对象事件的响应管辖范围

其实,在这种情况下,当时那个要求,最适合的不一定是用VB写一个EXE外插控件,不考虑速度,他直接写一个XLA加载宏最好,不过我记得那位朋友似乎在练习VB的ACTIVEX程序...

[此贴子已经被作者于2006-6-28 11:41:23编辑过]

TA的精华主题

TA的得分主题

发表于 2006-6-28 23:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

星期慢慢看。

TA的精华主题

TA的得分主题

发表于 2006-7-27 10:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-11-23 00:02 | 显示全部楼层

看了两次,对照文件,好象有点懂了.

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

本版积分规则

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

GMT+8, 2024-12-5 02:51 , Processed in 0.053996 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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