ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 面向VBA初学者→ VBA代码中有关【变量】的误区

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-29 08:55 | 显示全部楼层 |阅读模式
本帖最后由 香川群子 于 2013-3-4 17:06 编辑

经常有VBA初学者,发帖求助定义变量时产生的疑问。

甚至有些初学者被搞得很困惑……


但我要说,这些都是完全可以避免的。

对于初学者来说,没有任何必要去学习定义变量以及变量类型的完整知识。
太奢侈了! 太浪费时间了! 太损伤脑细胞了!

完全剥脱了初学者的乐趣。


本帖的宗旨,就是希望所有VBA爱好者,起来革命,
彻底打倒学术权霸的形成的错误概念 → 【定义变量和定义变量类型是个好习惯】



…………华丽的分割线…………以上为 2013.01.29 发帖内容(未修改一字)…………

本帖发出后已经有一个月了,因为引起了很大的争议,
所以在一个月之后的3月4日,追加几句话,作为内容的补充和态度的修正:


本帖主旨其实还是这个意思:

1、 初学者不必马上去学习定义变量的各种知识,直接写代码照样可以入门。

2、 入门以后再学习定义变量的方法,并根据自己的认识取舍即可。

没必要上纲上线地把不定义变量说成是十恶不赦的坏习惯。

3.  作为职业编程者,或者虽然不是职业编程者,但你的编程工作代码会有其他相关人员参与时,
     定义变量并作必要的注释是个好习惯。
   → 【其实我认为这一点根本不用说,难道真有每天为公司和团队工作写代码但从不定义变量的人存在么?】

补充结束。
2013.03.04
………………



点评

知识树索引:此贴不宜入知识树,保留处理。  发表于 2013-9-25 01:01
值得肯定,我就是那种不爱定义变量的人  发表于 2013-1-31 17:57
有探讨价值的新观点,值得鼓励,加精。  发表于 2013-1-31 15:39

评分

19

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:05 | 显示全部楼层
第一个误区:
Option Explicit

如果任何模块最顶端出现这一句代码,请立即给予删除。

它不能带来任何好处,反而给初学者带来伤害。



简要介绍 Option Explicit 的作用

【强制声明变量】

带来的后果,如果代码编写过程中需要使用一个新的变量,那么对不起,编译程序会拒绝你这样做。

因此,它给初学者带来的坏处就是失去了自由……你必须先定义变量,然后才能使用它。


而删除这一句代码的好处就是,你可以在任意阶段,自由地使用任何变量。


差别:
使用和不使用Option Explicit,对程序的实际使用没有任何影响。

既然实际使用没有差别,为什么还要用这句Option Explicit代码呢? 除非脑袋被驴踢了!





点评

原来尚有此等激烈的交锋,好好好,碰撞的都是智慧的火花!  发表于 2014-9-17 20:11
你懂了可以说不管,不懂的怎么可能不管,你让他如何继续?编程不是写文章,可以有错别字。  发表于 2013-10-23 01:13
http://club.excelhome.net/thread-979704-1-1.html 南宫飘雪关于变量的说明,值得新手看看  发表于 2013-2-2 18:04
我要说的都在91楼了,不想被耽误的童鞋们,去看看吧。  发表于 2013-1-31 13:36
Option Explicit +Dim 是防止手误的唯一办法  发表于 2013-1-31 13:09
Option Explicit 建议保留,这是防止手误的唯一办法。  发表于 2013-1-30 12:55

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-1-29 09:10 | 显示全部楼层
香川群子 发表于 2013-1-29 09:05
第一个误区:
Option Explicit

先前的学习一般来说不要求学员定义变量类型,但也不可否认,定义变量的类型有很多好处

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:12 | 显示全部楼层
补充解释Option Explicit的真正意图

在电脑286、386时代,在DOS程序代码时代,在内存仅16M,32M时代,
你必须定义好每一个变量的数据类型,以便最高效地进行内存使用。

即,一个口袋里只有10元钱的人,要生活一周 → 于是你必须精打细算好每一分钱,否则就会饿死。

…………
Option Explicit 的作用,就在于:
如果你的程序没有做到精确定义每一个变量的数据类型,
编译程序就会拒绝执行→它认为你太奢侈了,不懂的节约使用每一分钱。


…………
那么,现在我为什么提倡完全、彻底删除Option Explicit这一句,永远不要理会它呢?

因为现在的电脑硬件环境,已经是过去的几千倍了。

每一个人口袋里都有几百万的钱,还有必要去考虑一分钱、一元钱的用法么?


点评

看来现在可以土豪一下了……呵呵  发表于 2014-9-17 20:13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:15 | 显示全部楼层
第2个误区 dim 所有变量

前面已经解释过了,实际上,不对任何变量进行dim 定义而直接使用,对代码的运行没有任何影响。

既然如此,还有必要去dim 每一个变量么?

dim arr
dim txt
dim Num

这样的一些语句,完全是多余的,没有任何实际意义。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:19 | 显示全部楼层
补充解释:

dim arr  等价于 dim arr As Variant
dim txt  等价于 dim txt As Variant
dim Num  等价于 dim Num As Variant

而变量类型,默认就是任意变量Variant类型,
因此这样的代码写上去完全就是多余的,是脱裤子放屁多此一举。




dim txt
dim Num



TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:31 | 显示全部楼层
下面简要介绍变量数据类型:

常用的有Variant 即任意变量,因此完全不需要dim

其次,对于数值有
'byte            1 byte(0-255) 2^8
'%=integer   2 byte (-2^15 to 32,767) 2^16/2
'&=long        4 byte (-2^31 to 2,147,483,647) 2^32/2 ⇒2.147E9
'@=currency 8 byte(-922,337,203,685,477.5808 to 922,337,203,685,477.5807. ) 2^64/2=9.22E18/10^4
'!=single       4 byte(-3.402823E38 to -1.401298E-45 ) (1.401298E-45 to 3.402823E38)
'#=double    8 byte(-1.79769313486231E308 to -4.94065645841247E-324)(4.94065645841247E-324 to 1.79769313486232E308 )

以及字符串变量
'$=string      (2^31) variable-length characters or 64K (2^16) fixed length characters


初学者可以一带而过,不需要去看具体的内容。

总而言之,言而总之,
不同的数据类型,占用大小不同的字节,因此计算时对内存的占用和运算效率有所不同。


因此,定义变量数据类型以后,可能的好处是少占用一些内存以及大量重复运算是提高计算速度。

但是,相应的缺点是,由于各种类型占用字节的限制,它所能代表的数值范围受到了限制!

因此,如果初学者试图去使用定义变量类型的方法时,往往尚未得到实际好处,
即【运算速度提高】的好处(但实际运算量小时速度的差别很小、很小可以完全忽略不计
却首先受到了因为不能恰如其份地定义好变量类型,而造成了变量溢出或冲突导致代码无法运行的严重后果!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:38 | 显示全部楼层
以上简单地介绍,希望大家明白以下道理:

1. VBA编程完全不需要定义变量和定义变量的数据类型就可以顺利运行。
  → 结论: 初学者不需要去定义变量和定义变量类型

2. 仅在大型程序、超大量数据运算、巨量次数反复循环计算等场合,定义变量类型有提高计算效率的好处。
  → 结论: 初学者尚不需要,可以暂时不学习

3. 随着VBA编程经历的增长,任何人都可以慢慢地、自然地学会自由地、随心所欲地定义变量以及定义变量类型
  → 结论: 初学者今后也能学习到定义变量和变量类型的技巧,完全不需要在初学阶段去死记硬背


因此,建议初学者忽视任何老师关于学习VBA时应该学习定义变量类型,或者定义变量类型是一个编程好习惯的荒唐说法。




点评

看来阅读一段陌生的代码确实很是伤脑筋的……尤其是没有注释,且没有遵守通常的约定的习惯时……  发表于 2014-9-17 21:15
同意liucqa,变量的命名、程序的结构一定要养成好的习惯和风格。除非是故意的。  发表于 2013-10-23 01:19
第三点严重错误:变量名不能随心所欲!正确的定义变量名可以让其他人迅速看懂你的程序。而这一点在团队合作中甚至比编程无bug还重要!!!!!  发表于 2013-1-30 13:02
我也是从不定义的,反正都是小程序  发表于 2013-1-30 11:42

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
xiaofx11 发表于 2013-1-29 09:10
先前的学习一般来说不要求学员定义变量类型,但也不可否认,定义变量的类型有很多好处

实事求是地说,对于普通VBA宏代码运用来说,
定义变量类型的好处并不重要,基本上可以完全忽略。

我并不反对中级以上能力的在编写代码时定义变量以及变量类型。

但是,我的观点,对于初学者来说,完全不必要去讲述变量类型的相关知识。
只要像我做的这样,做一个简单描述就可以了。

一句话:
定义变量类型可以节省数据占用的内存而提高计算速度,但对于一般计算程序来说影响微小可以不予考虑。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-29 09:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
发这个帖子的原因,在于前几天,有一个初学者提出疑问:
【顺便提问:所有的书包括本论坛都说要定义变量,好处n条。这个和您说的似乎不太一致啊?难道是不定义更好?】


…………
显然,还有很多已经入门,甚至正在做VBA老师的人,根本就不懂的dim 语句的作用,
在那里误导初学者。

必须让所有人都醒悟过来:
dim 语句可以有,但并非必要。

点评

Dim+规范的变量命名规范,是迅速看懂他人程序的前提。  发表于 2013-1-31 13:11
Dim语句最大的作用是方便其他人能看懂程序,这一点无论对初学者还是老鸟来说,都十分重要。你不能指望别人从初学者那乱七八糟的代码中慢慢找变量在哪里(如果你还希望别人愿意看初学者的程序并给予帮助的话)  发表于 2013-1-30 13:06
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-14 09:44 , Processed in 0.043995 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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