ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 关于变量声明的讨论

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-2-2 17:46 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:数据类型和基本语句
本帖最后由 joforn 于 2013-3-20 11:33 编辑

        一般来说,如果模块中没有声明Option Explicit,那么在这个模块中可以不事先声明而直接使用一个变量。所以有人说:变量声明是不必要的,除非是编写的程序比较复杂时才需要使用变量声明。支持这一论点的用户列举一系列的好处,以证明声明变量基本是属于“没事找抽型”之类的人才会用的。
       第一个论点:如果程序中过多出现DIM会让程序看起更长更复杂。其实如果一段代码在50行以下时,不声明变量的确可以少打许多个字符,至少可以为你节省几分钟的打字时间。这个节省的时间是必然,但是,是否是真正的节省时间,还得视程序是否是一次性运行成功。否则,在后面花费的调试时间会让这几分钟的优势丢去。一般来说程序编写代码的时间占用程序编译时间总合的20%~50%,其它的大部分时间花在了调试上(就算是一个程序天才,估计也不敢保证自己的程序100%不需要调试而直接运行)。
       第二个论点:变量声明增加了程序的复杂度,一般初学者很难学会变量,会在上面浪费很多时间,这是不值得的。其实变量就那么几种大的类型:字符串、数值类型、逻辑值类型、对象。其中数值类型中包含整型、浮点两种类型。当然,还有三种类型的变量是以前面的几种类型单一或是多种组合而成,这三种变量就是数组、变体及自定义,但这三种最终的类型实际上仅是前面几种类型的扩展用法。数组:可以看成是某个类型数据的连续块;变体(Variant):直观上来看,这个类型的变量就是在某个类型的数值外面包了一个包装盒,包装盒的作用仅仅是增加了美观,但增加了数据的访问时间和数据的空间;自定义类型(Type):这个类型也就是一种或是几种的类型的数据组合,其目的是为了减少程序编写过程中访问数据的安全性(防止输入错误的变量名)及加快输入速度。综合对比可以看出,其实声明变量根本不可能增加程序的复杂度,反而在很多的时候会为我们带来方便。
     第三个论点:专门为了学习变量而花费时间,完全是无用功。对于这一观点,我只能说如果看书的人一定要一页一页背下去看书的话,那还不如不要去看书。一般的书都会把所有的变量放在一章中,但是那只是为了好归类,并不是要读者去背下那一章。个人认为,变量的学习只要有上面第二段中的那个基本概念就行(估计半小时就能明白StringLongDoubleBooleanObject),知道大致有哪些类型的变量变OK了,并不需背什么Long、Byte……在写程序时多使用几次Dim,慢慢就自然而然的记住了。也就是说平时只要有声明变量的这个习惯,过了一段时间,自然就能信手拈来。这其实是一个很简单的事件,不知道为什么这么多人一再强调说这很难?如果一个Dim的确是很难的话,那么IF……Else……、For……Next、Do……相比较Dim就容易了?还是说冒泡、二叉树、红黑树……之类的比Dim要简单的多?
      
      综合上面所述,养成变量在使用前先声明的习惯并不会带来什么实际上的损失。
      那么,变量声明是必须么?我的回答是否定的,但如果你认为声明一个变量对你没什么损失的话,我仍旧建议你使用变量声明,这个并不是为让你的程序更好,而仅仅是为是在你的程序出问题时更快的找到问题所在(实际提升的速度还得看个人的经验,便一般来说,对于5000行以上的代码可能会快很多,如果说你所有代码都能保证在100行以内,用不用都差不多)。
      变量声明使用一定的规则有什么用?有很多人用如匈牙利命名法则之类的,这样用对于个人来说,说实话这样做对作者本人没有什么很大的意义。但是如果多人合作编写代码时就会体现出这类命名规则的优势。说白了,就是为了让别人能更快的看懂你的代码,对于作者本人用处并不大。如果说你想让你的代码变得“神鬼莫测”,那么你只要反其道而行即可,这样,就是别人得到你的代码,可能也会看着头晕眼花。这也是很多时候我回帖时直接重写代码,而不在发帖人的程序的代码上做修改的原因。因为很多代码直接重新写出来可能比去修改一段代码花费更少的时间。
      下面有几段比较简单的代码(基本都不超过5行),可以从侧面提醒一下大家在使用变量时要注意的一些问题:

  1. Sub Test0A()
  2.   A = 123
  3.   B = "A123"
  4.   C = 123
  5.   Debug.Print A + B
  6.   Debug.Print A + C
  7. End Sub

  8. Sub Test0B()
  9.   Dim A As String, B As String, C As String
  10.   A = 123
  11.   B = "A123"
  12.   C = 123
  13.   Debug.Print A + B
  14.   Debug.Print A + C
  15. End Sub

  16. Sub Test1A()
  17.   A = "+1"
  18.   B = "-1"
  19.   Debug.Print A & " > " & B & " = " & (A > B)
  20.   A = 1
  21.   B = -1
  22.   Debug.Print A & " > " & B & " = " & (A > B)
  23. End Sub

  24. Sub Test1B()
  25.   Dim A As Long, B As Long
  26.   A = "+1"
  27.   B = "-1"
  28.   Debug.Print A & " > " & B & " = " & (A > B)
  29.   A = 1
  30.   B = -1
  31.   Debug.Print A & " > " & B & " = " & (A > B)
  32. End Sub

  33. Sub Test2A()
  34.   ReDim Arr1(0 To 12)
  35.   Open "C:\Boot.ini" For Binary As #1
  36.   Get #1, , Arr1
  37.   Close #1
  38.   Debug.Print StrConv(Arr1, vbUnicode)
  39. End Sub

  40. Sub Test2B()
  41.   Dim Arr1() As Byte
  42.   ReDim Arr1(0 To 12)
  43.   Open "C:\Boot.ini" For Binary As #1
  44.   Get #1, , Arr1
  45.   Close #1
  46.   Debug.Print StrConv(Arr1, vbUnicode)
  47. End Sub
复制代码

注意:上面的代码所出现的问题并非不使用变量声明就会出错的证明,而是为了说明一下,在不使用变量声明后如果不注意数据的来源,则可能会发生的一此意想不到的问题——有可能是语法上的,也可能是逻辑上的错误。
再次声明一下:不是说建议初学者一定要先完全弄明白所有的数据类型的特性之后再开始写代码,而是说只要有个基本的概念,然后在写代码的每次稍稍多一点时间去稍稍关注一下就行了。就像是String,如果说一定要初学都先明白了BSTR结构后再去用String类型是不可能的,要让初学者先明白SafeArray结构再来学数组更是不可能的。
学习数据类型是一个慢慢积累的过程,而不是说先花了十几二十天就能完全看明白的东西。



还有半个小时就坐车回家过年去了。借着此帖在这里先给所有的人拜年了——蛇年
首先要谢谢原来给我加精华的版主。不过个人认为,虽然本帖有些经验可以供新学者学习,但自认为尚不足以加精华,故自己解除精华。
但此举并不代表本人认为自己的观点是错误的,而仅仅是本人自己认为精华帖应该能更“精华”一些。

该贴已经同步到 joforn的微博

点评

有理有据,完全同意。  发表于 2013-2-5 20:47

评分

12

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-2-2 17:48 | 显示全部楼层
本帖最后由 liucqa 于 2013-2-2 17:59 编辑

嗯,大神果然讲的深刻

在vb里面,由于变量之间存在隐含的转换(字符串---数值是最典型的),如果不定义变量的话,你就慢慢调试吧,够你折腾的。

所以,微软的C#语言从一开始,就要求强制变量定义,就是为了避免开发项目中由于变量的混乱导致隐含的bug问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-2 17:51 | 显示全部楼层
liucqa 发表于 2013-2-2 17:48
嗯,大神果然讲的深刻

我,只是初学+爱好者。

点评

见楼下灰袍大师的点评,我笑逗了。  发表于 2013-2-5 20:48

TA的精华主题

TA的得分主题

发表于 2013-2-2 17:58 | 显示全部楼层
joforn 发表于 2013-2-2 17:51
我,只是初学+爱好者。

嗯,大神果然谦虚!

点评

我想起一个笑话:医生:你是精神病!病人:我不是!医生:精神病的典型症状就是否认!  发表于 2013-2-2 20:44

TA的精华主题

TA的得分主题

发表于 2013-2-2 18:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-2 19:44 | 显示全部楼层
还是支持 想穿裙子的观点,对于初学者来说还是越简单越好,从简单到难

点评

你这句话是最接近了解我的意图的发言。谢谢! 实际上我并没有也不可能要求别人写代码时彻底不用dim语句来定义变量类型。 但是对于初学者来说不用定义变量也能写宏代码,这个过程的存在并没有那么可怕值得精英们反对   发表于 2013-2-3 00:33

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-2 19:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dajiahaoxinku12 发表于 2013-2-2 19:44
还是支持 想穿裙子的观点,对于初学者来说还是越简单越好,从简单到难

嗯。学东西当然是越简单越好。不过四个种类都记不清么?
如果记四个都那么难,那当我什么都没说。
在我上面的例子中,你觉得打个DIM更简单还是查清楚上面的程序中所存在的问题更简单?
简单当然是最好的,不过要相对来说。少打两个字母是简单了,不过单步跟踪、数据类型分析、数据计算分析是不是更难?为了少打几个字而做后面的分析,你觉得这个简单是否值得?

TA的精华主题

TA的得分主题

发表于 2013-2-2 20:00 | 显示全部楼层
任何事物都有两面性的, 就像一个有胃病的人,再没有确定这个胃病的程度是轻还是重,有的人说是多吃辣椒好,越刺激对胃越好,而还有人说有胃病的人不能吃刺激性的东西,吃了的话更伤胃。      
都是有个前提的,楼主说的都是后期的事情, 裙子说的是前期的事情,所以观点当然不同

点评

你也是能看懂我一直在说什么的人,非常感谢!  发表于 2013-2-3 00:41

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-2-2 20:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dajiahaoxinku12 发表于 2013-2-2 20:00
任何事物都有两面性的, 就像一个有胃病的人,再没有确定这个胃病的程度是轻还是重,有的人说是多吃辣椒好, ...

我倒是觉得,要看想学成啥样吧
万丈高楼平地起,如果想堆这么高的人,还是要好好打基础的
当然,只是想堆个土堆,怎么堆都可以的

TA的精华主题

TA的得分主题

发表于 2013-2-2 20:25 | 显示全部楼层
养成了不定义变量的习惯,后患无穷

点评

喊口号么?  发表于 2013-2-2 22:00

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-22 17:27 , Processed in 0.041821 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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