ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-1 22:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小花鹿 发表于 2013-4-1 22:21
知音啊.........................

呵呵,小花鹿,你的水平应该已经算是入门了吧。


似乎你编程也是有dim习惯的吧。


TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-1 22:59 | 显示全部楼层
liucqa 发表于 2013-4-1 19:08
如果是针对不求上进的初学者,那自然就不会被喷了

初学者和爱好者可不能就这么堕落了!

你之前在10楼点评说:
【Dim语句最大的作用是方便其他人能看懂程序,这一点无论对初学者还是老鸟来说,都十分重要。你不能指望别人从初学者那乱七八糟的代码中慢慢找变量在哪里(如果你还希望别人愿意看初学者的程序并给予帮助的话)  发表于 2013-1-30 13:06 】

那么参考一下这个新手求助帖:
http://club.excelhome.net/forum. ... p;page=1#pid6825975

4楼回帖代码,有dim语句
Sub mysub1()
Dim arr(), brr(1 To 16, 1 To 33) As Long
Range([l1], [AR16]).ClearContents
lastr = Range("a65535").End(xlUp).Row
arr = Range("A1:G" & lastr)
For i = 1 To lastr - 1
    For j = 1 To 6
        brr(arr(i, 7), arr(i, j)) = brr(arr(i, 7), arr(i, j)) + 1
    Next
Next
Range("l1:AR16") = brr
End Sub

但新手说一下子看不懂……

对比我的回帖
Sub test()
    tms = Timer
    arr = [a1].CurrentRegion '原始数据写入VBA内存数组arr (这样速度快)
    [l1:ar16] = "": brr = [l1:ar16] '清空结果区域,并读入数组brr (这样速度快)
   
    For i = 1 To UBound(arr) 遍历原始数据各行
        n = arr(i, 7) '以第7列值作为输出结果brr的行位置
        For j = 1 To 6 '遍历检查第1-6列
            k = arr(i, j) '获取原始数值作为输出结果brr的列位置
            brr(n, k) = brr(n, k) + 1 '对应结果数组brr的行列交叉位置累计+1
        Next
    Next
    [l1:ar16] = brr '输出结果brr到工作表
    MsgBox Format(Timer - tms, "0.000s")
End Sub

虽然没有dim变量,但是做了比较充分的注释。

或许新手依然不能一下子看懂,
但到底哪一个代码更容易让人明白,应该是一个不争的事实。

点评

至于注释,那属于程序的文档部分,而不属于代码。我们不应该再去讨论Dim和注释之间的话题了  发表于 2013-4-1 23:31
我在10楼说了,Dim+规范的变量命名规范,是迅速看懂他人程序的前提。  发表于 2013-4-1 23:23

TA的精华主题

TA的得分主题

发表于 2013-4-1 23:19 | 显示全部楼层
本帖最后由 liucqa 于 2013-4-1 23:35 编辑
香川群子 发表于 2013-4-1 22:59
你之前在10楼点评说:
【Dim语句最大的作用是方便其他人能看懂程序,这一点无论对初学者还是老鸟来说,都 ...

你应该找个正规的大公司上班去(最好是外企),不是去学编程技术,是去学讨论问题的方法和技巧。

你应该已经注意到,有人已经提醒你在讨论问题的时候,经常有意或者无意的转移讨论的中心论题。这种话题漂移的现象,在职场新人中普遍存在。其实,并不是你有意漂移,而是看问题不能从整体大局着手,经常把眼光聚焦到问题的某个局部上,并随之提炼出了另一个话题,而此话题已非起初的中心话题,这就是话题漂移!

最严重的话题漂移现象又叫做蒙太奇漂移,就是在一个局部的提炼话题没有讨论完,又迅速的从问题的另一个局部提炼出了另一个话题,然后再来第三个局部的话题,让人无所适从


当然,还有传说中的神级漂移。就是从一个话题A漂移到另一个话题B,再从B提炼出C,从C提炼出D,从D提炼出F...,最后的话题Z已经与原先的话题A风马牛不相及了,此乃神人才会的大招!俺一般遇到就直接拜服了!

我的意思,你滴明白?





TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-1 23:40 | 显示全部楼层
liucqa 发表于 2013-4-1 23:19
你应该找个正规的大公司上班去(最好是外企),不是去学编程技术,是去学讨论问题的方法和技巧。

你应 ...

话题确实在漂来漂去……不过我不觉得是我把话题弄漂的。我是认真地、被动地回复别人回帖提出的问题。

至于局部和整体、层次、高度,这些个我就不追求了。 呵呵。

TA的精华主题

TA的得分主题

发表于 2013-4-1 23:52 | 显示全部楼层
香川群子 发表于 2013-4-1 23:40
话题确实在漂来漂去……不过我不觉得是我把话题弄漂的。我是认真地、被动地回复别人回帖提出的问题。

...

所以让你去找个公司上班。

在公司开会讨论话题,主持人最重要的工作就是控制全场的讨论中心应始终围绕在会议的主题上。

你现在不但不围绕主题讨论,还在随着别人的帖子在做布朗运动,实在是难得...

我都不明白,你为什么还在认真的回复这个帖子,其实该谈的都谈了,也该让它沉底了

这个帖子老露头,对你的个人形象影响肯定不是正面的,相信我吧。
你不能因为一群孩子围在你身边叫你救世主,就真的以为自己是上帝了(这是个比喻,千万别看字面的意思,俺不想你又漂移话题)。

... ...

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-1 23:53 | 显示全部楼层
liucqa 发表于 2013-4-1 23:19
你应该找个正规的大公司上班去(最好是外企),不是去学编程技术,是去学讨论问题的方法和技巧。

你应 ...

回到本帖主题:

我提出的问题其实特别简单:
1. option explicit 有用,但可以不用。(本身微软就给你设置的是选项)
2. dim 有用,但也可以避开不用。(其实不是不用,是隐式声明变量,交给微软去判断)

而1,2这两种可以做的做法,我认为,【不是为了给高级水平者提供方便用的】,
而恰恰是为了给予初学者、一般爱好者、不求上进的终生门外汉提供的方便。

不知道你能否想通这一层呢?

如果初学者一定要option explicit  和 dim的话,
那么你认为谁才有资格不用 option explicit 和不用 dim呢?

莫非谁都不应该这么做? 那微软VBA到现在还不改正这个【缺点】又是为什么?
(如果微软VBA一开始就强制要求dim 和 explicit,技术上反而是更简单、更容易)


所以,我坚信,对于初学者和一般爱好者来说,不马上就学习dim 是没有错的。

至于因为这个而会【扼杀】大批潜在的【编程天才】这个假设,我是不相信的。




TA的精华主题

TA的得分主题

发表于 2013-4-2 00:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 joforn 于 2013-4-2 00:13 编辑

手中无剑,心中无剑:看不懂别人的定义,也不知道自己的代码要怎么定义;
手中有剑,心中无剑:看着别人的代码,似懂非懂,真到自己写代码时又总弄不明白为什么出错;
手中有剑,心中有剑:能轻松看懂所有代码,也能自己写出自己想要的代码;
心中有剑,手中无剑:定不定义都能看懂,可不可读也能明白,自己的代码用不用定义或是注释对自己毫无影响;
手中无剑,心中无剑 —— 最终境界:如果代码能只用寄存器而计算,直接不用变量完事(估计没几个人能行,呵呵)。

以上纯属玩笑话,各位随意。

点评

境界原来是个螺旋上升的循环!  发表于 2014-9-18 23:23
注意,俺没写错,真的是计算器,是国外进口的可编程型计算器,只能编200多步。  发表于 2013-4-2 00:13
呵呵,让我想起了用计算器编程的初中时代,那可真的就是针对若干个寄存器做编程呀!  发表于 2013-4-2 00:11

TA的精华主题

TA的得分主题

发表于 2013-4-2 00:02 | 显示全部楼层
香川群子 发表于 2013-4-1 23:53
回到本帖主题:

我提出的问题其实特别简单:

嗯,你的观点总算回到正题上了,这些你说的没错。但这并不能作为你向初学者宣传的依据。

凡是都有两面性,你说宣传Dim会把初学者吓跑,其实你宣传不用Dim又何尝不是坑人呢?

VB到现在已经有几十年历史了,如果宣传不用Dim会让初学者迅速学会VBA的话,我想国内外的先贤们早就这么开培训课了。为什么如此“好事”没人去做?是他们不如你想的透彻吗?还是因为他们比你想的更透彻?

你猜猜是什么原因?


我建议你没事去学习一下C#语言,体会一下强类型语言的优势!  要知道,C#可是在VB之后若干年才推出的编程语言呀,你不能说微软的技术在退步吧!


TA的精华主题

TA的得分主题

发表于 2013-4-2 00:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
从本主题贴发起开始,我就一直冷眼旁观,一直想着不跟贴的,今终于还是回个贴吧:
请看andysky版主的图解定义变量的重要性:

http://club.excelhome.net/forum.php?mod=viewthread&tid=996238

初学者可以不定义变量,但不定义变量终究不是好习惯,不利于较快进步!

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-2 00:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liucqa 发表于 2013-4-2 00:02
嗯,你的观点总算回到正题上了,这些你说的没错。但这并不能作为你向初学者宣传的依据。

凡是都有两面 ...

这个世界上并非谁最强大谁就一定覆盖其它选项的。

甚至于不是正确就一定可以替代错误的……方便也是一个重要的特性。

存在就一定有它的理由。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-12-24 01:14 , Processed in 0.038872 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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