ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 图解:定义变量的重要性

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-2 08:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:数据类型和基本语句
本帖最后由 andysky 于 2013-4-2 08:32 编辑
香川群子 发表于 2013-4-2 01:21
如果你已经意识到dim有作用,就学习并使用dim吧。

在学习过程中如果有出现问题,那就痛并快乐着吧。


你的观点一直就是大错特错的
总以为定义变量要投入太多的精力,甚至也以此去误导所有VBA初学者。
事实上,要定义好变量,是极度简单的事,哪需要花什么精力???

把数据类型表打印出来放在桌上,一个字都不记,
要定义变量时核对一下数据类型的范围就行了,不可能比较大小也有压力吧?小学二年级的学生足以完成这项工作。

例如表达式是600+30000,需要用一个变量来存放这个表达式的结果,看一眼数据类型表,几乎2秒钟就明白不以用Integer、Byte、Range之类,因为太明显了。宜用Long型。

永远不需要记一个字,看一下类数据类型表,两三秒钟就完成的事,这也算“太多的时间精力”?甚至比写一个简单的SUM求和公式简单。
连这点事都有压力的话,尽早改行吧
___________________________________
打一个比方,定义变量就好比升学时根据自己的考分定义学校一样。
例如C类学校录取分是500分以上,B类学校的录取分是550分以上,A列学校的录取分是600分以上
如果你考了580分,你应该选上什么学校?
请问对以上问题做出正确的选择,算不算很难?算不算要花“太多的时间精力”?

点评

这个比方有问题,这个升学问题应当是学有一定基础了,不管是小升初还是高考;但初学者是上小学一年级的,这个时候不知道是不是应当考虑6年级完成后考多少分和报那个学校?这个例子倒是和你的意见相反了。  发表于 2013-4-3 09:22

TA的精华主题

TA的得分主题

发表于 2013-4-2 09:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub Test2()
  2. '    Dim a#, b#, c#, d#, e#, f#
  3.     '使用上面dim语句定义变量类型,或者注释掉dim语句直接采用默认Variant变体类型时的差异
  4.     a = 100.00001
  5.     MsgBox "a=" & VTp(a)
  6.    
  7.     b = 12345.1
  8.     MsgBox "b=" & VTp(b)
  9.    
  10.     c = a + b
  11.     MsgBox "c=a+b=" & VTp(c)
  12.    
  13.     d = c - b
  14.     MsgBox "d=a+b-b=" & VTp(d)
  15.     dd = (d - 100) * 10 ^ 14
  16.     MsgBox "(d-100)*10^14=" & VTp(dd)
  17.    
  18.     MsgBox "d=a+b-b=" & d & vbCr & "a=" & a & vbCr & "d=a  → " & (d = a)
  19.     MsgBox "d=a+b-b=" & d & vbCr & "a=" & a & vbCr & "d-a= " & d - a
  20.   
  21.   
  22.     e = a + b - b - a
  23.     MsgBox "e=a+b-b-a= " & VTp(e)
  24.    
  25.     f = a - a + b - b
  26.     MsgBox "f=a-a+b-b= " & VTp(f)
  27.    
  28.     MsgBox "e=a+b-b-a=" & e & vbCr & "f=a-a+b-b=" & f & vbCr & "e=f → " & (e = f)
  29.    
  30. End Sub
  31. Function VTp(t)
  32.     VTp = t & vbCr & Choose(VarType(t) + 1, " Empty 0", " Null 1", " Integer 2", " Long 3", " Single 4", " Double 5", " Currency 6", " Date 7", " String 8", " Object 9", " Error 10", " Boolean 11", " Variant 12", " DataObject 13", " Decimal 14", 15, 16, " Byte 17", " UserDefinedType 36", " Array 8192")
  33. End Function
复制代码

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2013-4-2 12:40 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-3 10:15 | 显示全部楼层
andysky 发表于 2013-4-2 08:22
你的观点一直就是大错特错的
总以为定义变量要投入太多的精力,甚至也以此去误导所有VBA初学者。
事实 ...

回复chenzyyysl :
“C类学校录取分是500分以上,B类学校的录取分是550分以上,A列学校的录取分是600分以上
如果你考了580分,你应该选上什么学校?”

这个问题小学一年级的学生就会,何况,初学VBA的人呢?
初学VBA的人都至少初中学历了吧?
一个初中生连这个都不会,有可能吗?
而定义变量和数据类型和这个问题的难度一模一样。仅仅比较大小罢了。

TA的精华主题

TA的得分主题

发表于 2013-4-3 11:22 | 显示全部楼层
andysky 发表于 2013-4-3 10:15
回复chenzyyysl :
“C类学校录取分是500分以上,B类学校的录取分是550分以上,A列学校的录取分是600分以 ...

本来象这样的主题贴我怕跟贴,因为一旦跟了贴,日后一登录,在“我参与的主题”下往往这样的贴总是置顶,去观注吧,一看,跟贴的内容往往是“顶一个”、“赞一个”、“同感”、“感谢”、“很有收获”等等这样的没有什么新意的回贴内容,不观注吧,它却在置顶着,所以感觉很不爽。

言归正传:
1.本主题贴的内容图文并茂,已经生动说明了定义变量的极大好处,一般情况下不用再去回复什么跟贴了
2.(承上)你若回贴,反倒描述不清,况且还有描述重复的嫌疑
3.就你35楼发言来说,你的本意是想再次表明记变量类型或看变量类型没那么“累人”或“难人”,但话多失语,难免有疏漏。举个例子吧,有一个变量theDate,接受日期型数据,该日期由用户从键盘输入,故在代码进入下一处理前,应该检测该输入日期值的合法性,若是VBA初学者,此时你若问他(她)该变量应该定义为什么类型,假设他(她)在经你前面所叙中,已经对变量多加留意了,且有了一定的基础,极有可能脱口而出:定义为日期型呗,那还有啥好说的!所以,你在35楼的要求使他(她)还不能达到对变量使用自如的层次(事实上,不论什么方法都没办法让初学者达到这个层次,唯有时间和编码经验)。回到前面话题,上述变量显然应该定义为变体型(不要在此拍砖,说既然是待检测的不确定数据,当然是变体型啊。评:你晓得,俺晓得,可他或她却不晓得或并未意识到这一点),这样下文就可用IsDate()函数来检测了。顺便说下,后来的观注者(初学者)若看到此,可能认为定义为日期型为什么就不行,我说,行,但theDate接受该值时代码立马中断而报错,也有说,那就用On Error Resume Next 呗,我说,你不嫌累,不嫌代码为此而大费周章,那就定义为日期型好了。

最后:说的有些乱,而且也犯了言多必失的毛病了。总之,我这贴的意思是劝本主题贴的版主尽量不要去跟贴了,否则越跟越乱,反倒冲淡了前面楼层旗帜鲜明的图文说明。

点评

说的有理! 尤其是:【不论什么方法都没办法让初学者达到这个层次,唯有时间和编码经验】  发表于 2013-4-3 13:35

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-4-3 11:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2013-4-2 00:31
2楼演示是混淆了变量中的一个错误类型: 公共变量的使用,在不需要传递变量时需要初始化。

你演示的错 ...

你的解释有点钻牛角了,重点并不是什么公共变量的初始化问题,而是:
当局部变量与全局变量重名时,不定义的话,很难发现

TA的精华主题

TA的得分主题

发表于 2013-4-3 13:32 | 显示全部楼层
lsdongjh 发表于 2013-4-3 11:51
你的解释有点钻牛角了,重点并不是什么公共变量的初始化问题,而是:
当局部变量与全局变量重名时,不定 ...

首先,我很明确地说明了,楼主演示的第2个问题和dim无关。

其次,即使按你的说法,当局部变量和全局变量发生【重名】时,dim本身也不会发现任何问题。

呵呵。


TA的精华主题

TA的得分主题

发表于 2013-4-3 13:40 | 显示全部楼层
ngnndkkk 发表于 2013-4-3 11:22
本来象这样的主题贴我怕跟贴,因为一旦跟了贴,日后一登录,在“我参与的主题”下往往这样的贴总是置顶, ...

我知道绝大多数有编程经验的人都会赞同需要使用dim语句。

这个应该是没问题的。

但是否可以让初学者不要一上来就产生纠结呢?

尽管楼主说使用dim没啥难度,初学者随便看看就能明白……
我却发现事实是,很多低水平阶段的初学者因为照样画葫芦使用了dim并不恰当地定义了变量类型而导致【莫名其妙】的错误……

因此,我认为不应该在初学阶段就过分强调dim的好处而【强迫】初学者必须要使用dim语句。

正确使用dim语句,还是需要一定的经验积累的。

TA的精华主题

TA的得分主题

发表于 2013-4-3 13:50 | 显示全部楼层
为了有【夺人眼球】的效果,所以我也做了些夸张,
但确实是很客观地证明了,几乎80%以上的小型VBA代码(100行左右)完全可以不用dim语句而正常运行。

那么这个对于很多初学者来说就是一个很好的、得以让心情放松的利好消息。


…………
非常重要的是让初学者敢于去写代码,做自己想做的事。
在学习过程中自己就会进步,直至充分理解dim的作用。

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

本版积分规则

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

GMT+8, 2024-12-24 21:52 , Processed in 0.051586 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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