分享

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

 四季平安符 2013-03-14
 

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

 

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

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


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

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

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


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



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

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


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

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

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

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

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

补充结束。

第一个误区:
Option Explicit

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

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



简要介绍 Option Explicit 的作用

【强制声明变量】

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

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


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


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

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


补充解释Option Explicit的真正意图

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

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

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


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

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

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

第2个误区 dim 所有变量

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

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

dim arr
dim txt
dim Num

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

补充解释:

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

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




dim txt
dim Num
下面简要介绍变量数据类型:

常用的有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. VBA编程完全不需要定义变量和定义变量的数据类型就可以顺利运行。
→ 结论: 初学者不需要去定义变量和定义变量类型

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

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


因此,建议初学者忽视任何老师关于学习VBA时应该学习定义变量类型,或者定义变量类型是一个编程好习惯的荒唐说法。
实事求是地说,对于普通VBA宏代码运用来说,
定义变量类型的好处并不重要,基本上可以完全忽略。

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

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

一句话:
定义变量类型可以节省数据占用的内存而提高计算速度,但对于一般计算程序来说影响微小可以不予考虑。
发这个帖子的原因,在于前几天,有一个初学者提出疑问:
【顺便提问:所有的书包括本论坛都说要定义变量,好处n条。这个和您说的似乎不太一致啊?难道是不定义更好?】


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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多