ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 犯晕的类模块

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-28 16:16 | 显示全部楼层
本帖最后由 yiyiyicz 于 2012-8-29 10:12 编辑

面向对象,是相对于面向流程
面向流程,在初学VBA编码时,自觉不自觉的是按照顺序,大排行下来。如果要跳转,用 if then else end if  或者 selec case  end select
比如:排序,彩票的组合计算(有没有用只有鬼知道),装箱问题,工作表数据的检索和重新生成,等等
面向对象,是在执行比较复杂任务中,遇到一些相同或者相似的任务。于是从偷懒的角度也会想,能不能用一个程序块来完成他们。这样就与面向对象的思想合拍了。显然这时候的代码运行起来已经不是大排行的模式,而是根据需要,让这个程序块运行或者让那个运行。12楼的兄弟所说“使用类来编程,需要改变你的编程思路”,应该就是这个思意吧。
许多的模块,怎么运行呢?思路是这样那个:按照如此这般的先决条件,这个模块运行;如此那般的条件,则那个模块运行;依次类推。而不是事先排好了顺序队列。而如此模样的运行,需要一个指挥棒,或者叫指针。(可以理解为窗体中有若干个文本框,为文本框设定焦点。也就是指定哪个文本框可以输入文字)
为此目的,指针就显得十分重要。也就是说,指针指向哪个程序块,那个程序块开始运行。
不过,用过VBA的都知道,VBA中没有指针。
对于简单的调用,生成新实例的 set XXX=new XXXX 作为引用,去指定所要求的内容
对于复杂的,有聪明人用堆栈和队列,把这功能给做出来了。有时叫做动态数据仿真。
不管怎么说,这些法子能按照程序设计者的意图,在需要的时候,把那要运行的程序块找出来(不能错哦),并让它运行。

类模块,在道理上可以担此重任。当然,到这个时候,我有点明白,为什么专业人士对VBA不屑了。
由于面向对象带来的复杂机制,VBA类模块实现起来是有点吃力;还有那个动态数据仿真(是指定类模块运行中的变量、地址,而不是存储excel表中大量数据)
类模块学习,的确比学VBA简单编程要困难

TA的精华主题

TA的得分主题

发表于 2012-8-30 03:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼上的统统是高手{:soso_e128:}

TA的精华主题

TA的得分主题

发表于 2012-10-15 08:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-2-18 22:18 | 显示全部楼层
真的是非常高深莫测的。。。。 头晕

TA的精华主题

TA的得分主题

发表于 2014-2-24 16:02 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-25 08:44 | 显示全部楼层
本帖最后由 yiyiyicz 于 2014-2-25 09:17 编辑

类,正规要求有三个特征:封装、多态、继承
在学习VB.6\VBA时,类模块是实现类的唯一途径,至于模块结构怎么用代码写出来,这得靠学习和多练
只要功夫够,还是能掌握的。这些努力最后的结果是,可以实现封装和多态,而多态还是简单的多态。

关键在于怎么实现继承
只有解决这个问题,才能在VB.6\VBA中顺畅的使用类,实现我们想要的结果
在VBA中,引用js,是一个解决途径。用这个不仅可以实现继承,而且可以实现多重继承和多根继承。
但是真做起来,还是有很多问题需要灵活处理。特别是需要仔细理解js中的一些概念。于是,至少还要学一门语言,而且使用js时,不能太菜!
用js,是因为js和vba是一类货色,都不支持使用指针的编程语言。这里别抬杠,指针不是绝对不能用,而是微软等开发者认为:不希望你用。自有他们的道理。
如果真是功夫深,直接用C++,JAVA等语言就是了。

还有一个方法,就是用VB中代理方法和建立关系矩阵,这两种方法联合使用,也可以实现继承,实现多根继承和多重继承
基本思路是
先建立关系矩阵(也叫邻接矩阵)。建立这个矩阵的目的在于将各个对象间存在的关系明确表达出来。继承也是一种关系
在继承中,有时只是用到属性,这相对简单;有时需要用父对象的方法、事件,甚至是上上级父对象的方法,也就是多重继承。那么,在关系矩阵中,谁和谁有关系,路径如何,很容易知道。接下来就是需要继承的那个方法怎么办?用代理方法,即把这件事交给能处理的对象、方法去处理(直接过去调用)。因为关系及路径都能知道,所以委托方式可以实现
委托方法编码实现起来,需要VB功夫扎实
关系矩阵,建立起来看似简单。但真要把所有的关系,所有的继承路径以及经过谁,统统在矩阵中表达清楚,需要比较深的矩阵功夫
这好歹不用再学习一门语言。这对于数学基础好的,是个不错的选择
我不知道,是不是各式各样的邪门继承都能实现。但我知道,上面这两种方法做不到“放之四海皆准”



TA的精华主题

TA的得分主题

发表于 2014-6-18 14:53 | 显示全部楼层
看了这个帖子我才知道面向对象是什么东西。
随着编程时间久了,也开始意识到很多代码是可以重复使用的,所以也开始慢慢的将自己的代码往通用的方向考虑,  比如用字典来建立表头就是一个很好的例子。但是这个代码我也仅仅理解为我写了一个Function过程。。
至于类,我现在遇到的最突出的一个问题就是 一个窗体中很多相同控件Click事件需要一个个的添加,这个时候我才想到类的存在。
VBA就是用来简化工作的,如果把它跟正规语言比较,估计完败吧。但是要论对OFFICE的操控性, VBA应该是最快最好的~
所以看了帖子,决定不研究类了

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-18 18:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
453563050 发表于 2014-6-18 14:53
看了这个帖子我才知道面向对象是什么东西。
随着编程时间久了,也开始意识到很多代码是可以重复使用的,所 ...

VBA就是用来简化工作的,如果把它跟正规语言比较,估计完败吧。
所以看了帖子,决定不研究类了

不知道怎么会得出这样的结论,也许这帖子有些偏了
如果还对VBA感兴趣的话,将来会对类、类模块,及其应用有正确的认识

TA的精华主题

TA的得分主题

发表于 2019-1-21 21:39 | 显示全部楼层
  1. Function 模糊位置(查询内容 As String, 数组 As Variant, Optional 第几次出现 As String) As Variant
  2. Dim kw As New 数组
  3. Dim rx, ry, ar, y, n, 次数
  4. Dim c(65536)
  5. ar = 数组
  6. For y = 1 To UBound(ar, 2)
  7. n = Application.Match("*" & 查询内容 & "*", Application.Index(ar, , y), 0)
  8. If IsError(n) Then n = 0
  9. If n > 0 Then 次数 = 次数 + 1: c(次数) = n & "," & y
  10. Next y
  11. If 第几次出现 = "" Then 第几次出现 = 1
  12. If 次数 > 0 Then
  13.     模糊位置 = Split(c(第几次出现), ",")
  14. Else
  15.     模糊位置 = Array(0, 0)
  16. End If
  17. End Function
  18. Function 精确位置(查询内容 As String, 数组 As Variant, Optional 第几次出现 As String) As Variant
  19. Dim kw As New 数组
  20. Dim rx, ry, ar, y, n, 次数
  21. Dim c(65536)
  22. ar = 数组
  23. For y = 1 To UBound(ar, 2)
  24. n = Application.Match(查询内容, Application.Index(ar, , y), 0)
  25. If IsError(n) Then n = 0
  26. If n > 0 Then 次数 = 次数 + 1: c(次数) = n & "," & y
  27. Next y
  28. If 第几次出现 = "" Then 第几次出现 = 1
  29. If 次数 > 0 Then
  30.     精确位置 = Split(c(第几次出现), ",")
  31. Else
  32.     精确位置 = Array(0, 0)
  33. End If
  34. End Function
复制代码


上面是我自己编写的类模块,可以实现在数组中查询内容所在行列。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 00:29 , Processed in 0.038697 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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