ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-7-17 17:45 | 显示全部楼层
本帖已被收录到知识树中,索引项:类和类模块
论坛上关于类的东西很少,希望hiyou兄多多发表自己的一些精辟见解供大家学习。

TA的精华主题

TA的得分主题

发表于 2014-9-11 12:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习学习。

TA的精华主题

TA的得分主题

发表于 2014-9-11 14:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
努力学习,天天上EH!

TA的精华主题

TA的得分主题

发表于 2014-9-12 14:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
记下来学习了。

TA的精华主题

TA的得分主题

发表于 2014-9-12 15:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如前面所述,标准模块的函数/程序是比较简单的,你给了一个参数列表,就照样传进去了,另外,标准模块的数据跟类不一样,不会重复(比如你不能在两个标准模块中定义同样的HELLO子程序)。
这是说同样的公共过程或函数在不同的模块内不能同名?楼主自己没试过吗?

我出的几道VBA题的总结贴大量在用啊~

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-17 11:40 | 显示全部楼层
本帖最后由 hiyou 于 2014-9-17 11:41 编辑
lee1892 发表于 2014-9-12 15:32
这是说同样的公共过程或函数在不同的模块内不能同名?楼主自己没试过吗?

我出的几道VBA题的总结贴大量在 ...

你可以自已试试,在两个公共模块里定义同名的SUB(或FUNCTION),比如说两个SUB TEST
然后在第三个模块里 CALL TEST,会出现二义性问题,因为在第三个模块里试图将所有其它公有模块的函数视为一个整体
用C++、JAVA等术语来说,某种程度上,同一个WORKBOOK里,所有VBA公共模块在同一个NAMESPACE(名称空间)

但还有一种情况,就是上述两个定义了同名TEST模块的公共模块中,通过本模块的其它SUB过程CALL TEST,不会出现二义问题,也就是相当于 CALL ME.TEST,说明公共模块在这种情况下不是严格的同一空间,而是象类实例一样有“类模块”式的空间。


TA的精华主题

TA的得分主题

发表于 2014-9-17 11:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lee1892 于 2014-9-17 11:50 编辑
hiyou 发表于 2014-9-17 11:40
你可以自已试试,在两个公共模块里定义同名的SUB(或FUNCTION),比如说两个SUB TEST
然后在第三个模块里 ...

哦,第二段是对的。

第一段正确的做法是 Call 模块名.过程名。

你显然没有自己试试...另外,那不叫空间,应该理解为对象。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-17 12:04 | 显示全部楼层
lee1892 发表于 2014-9-17 11:48
哦,第二段是对的。

第一段正确的做法是 Call 模块名.过程名。

我想你对我第一段的理解有些分歧。

类模块中的 TEST——比如自定义类,WORKBOOK实例,SHEET实例,如果里面有TEST同名模块,你不能用CALL TEST 调用(注:不带前缀实例名)
在代码的本质上,它就相当于“每个实例指向这个实例类的方法”

但标准模块的公共性不同,比如MOD1这个模块有TEST,正常情况下,在同一个WORKBOOK空间的类、模块都可以忽略标准模块前缀调用
就是 CALL MOD1.TEST 与CALL TEST ,一般情况下是等同的,前者与类实例差不多,后者是"默认公共空间”
所以我要举这个例子说明它们的差别,标准模块在没有前缀时,公共同名函数会产生二义性。

另一方面,为了从你在前面加上了模块前缀,它的表现调用形式就和单独的名域或类差不多,所以当年讨论这个问题的时候,我们认为标准模块在本质上更象是一种类实例空间,只不过对VBA的初学者这么理解不方便,非常容易与VBA中“VBA的类”概念混淆,大部分同学只要认为“标准模块函数是一体的可以PUBLIC方式调用”即可,刻意在不同模块加入同名,就要面对这种二义性还是名域不同的理解。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-17 12:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 hiyou 于 2014-9-17 12:15 编辑


其实更早的时候,曾经有位网友认为VBA的模块本身不可能是类实例,争辩这个问题,他的起点是“VBA不算完全的面向类的语言”

当然在同一个WORKBOOK里,但在更高一层OFFICE VBA的架构里,VBE类库下,分出代码模块的类实例,运行过程中对代码进行编程修改,就会建立起这种的概念(不严格的列表,严格的要查VB类库)

APPLICATION-WORKBOOK实例
WORKBOOK实例-下属VB模块代码实例
WORKBOOK实例-类模块代码实例(包括FORM\WORKBOOK\THISWORKBOOK)

总之,在代码层次上把标准模块当成非常特殊的类实例对象,普通用户没有必要了解这些东东

TA的精华主题

TA的得分主题

发表于 2014-9-17 12:19 | 显示全部楼层
hiyou 发表于 2014-9-17 12:04
其实更早的时候,曾经有位网友认为VBA的模块本身不可能是类实例,争辩这个问题,他的起点是“VBA不算完全 ...

我想说的很简单:“比如你不能在两个标准模块中定义同样的HELLO子程序”,这句错了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-5 03:01 , Processed in 0.051571 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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