ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-30 13:46 | 显示全部楼层
本帖最后由 hehex 于 2013-1-30 13:47 编辑

很同意楼上几位老大的观点。
还是那句话,当一个新人菜鸟才入门的时候如果不养成定义变量的良好习惯(包括如何命名变量),除非他今后永远是菜鸟,否则对他的水平提高后写程序是有很大影响的。
VBA 不是专业的程序开发语言,使用者也大都不是专业从事计算机软件开发的程序人员,但是目前很多企业应用在office 上的自动化应用绝大部分还都是基于vba 的程序。这些系统就存在很多包括不定义变量之类的问题,造成后人难以维护扩充软件的功能。
我们学语言就像小孩子学说话,如果小时候养成的口音,长大之后是很难去扳的。除非他永远不长大。

点评

类比得好!  发表于 2014-9-17 22:20

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-1-30 14:13 | 显示全部楼层
没想到这么热闹
个人觉得此贴的特色是 ------- 先污染,后治理
所有的工业化国家,都走过的路。快速发展,结果像北京闹出“北京咳”,……
发达的工业化国家,于是回过头教训后发国家,污染,要绿色,……
学VBA,也是一个道理

TA的精华主题

TA的得分主题

发表于 2013-1-30 15:13 | 显示全部楼层
香川群子 发表于 2013-1-30 09:34
VBA简单代码时,使用a、b、c、d单字母变量是一个很好的习惯。

非常简明。

刚好有人发了求助贴了,楼主帮忙给人改改代码吧  http://club.excelhome.net/thread-978527-1-1.html

{:soso_e120:}

Worksheets(2).[A1].CurrentRegion.ClearContents
Ca = WorksheetFunction.CountA(Range("A2:A12"))
Cb = WorksheetFunction.CountA(Range("B2:B12"))
Cc = WorksheetFunction.CountA(Range("C2:C12"))
Cd = WorksheetFunction.CountA(Range("D2:D12"))
Ce = WorksheetFunction.CountA(Range("E2:E12"))
Cf = WorksheetFunction.CountA(Range("F2:F12"))
Cg = WorksheetFunction.CountA(Range("G2:G12"))
If Ca = 0 Then Ca = 1
If Cb = 0 Then Cb = 1
If Cc = 0 Then Cc = 1
If Cd = 0 Then Cd = 1
If Ce = 0 Then Ce = 1
If Cf = 0 Then Cf = 1
If Cg = 0 Then Cg = 1
R = 1
Col = 1
For Ra = 2 To Ca + 1
If Cells(Ra, 1) = "" Then
a = ""
Pa = ""
Na = 0
Else
a = Cells(Ra, 1)
Pa = a Mod 2
Na = Val(a)
End If
For Rb = 2 To Cb + 1
If Cells(Rb, 2) = "" Then
b = ""
Pb = ""
Nb = 0
Else
b = Cells(Rb, 2)
Pb = b Mod 2
Nb = Val(b)
End If
For Rc = 2 To Cc + 1
If Cells(Rc, 3) = "" Then
c = ""
Pc = ""
Nc = 0
c = Cells(Rc, 3)
Pc = c Mod 2
Nc = Val(c)
End If
For Rd = 2 To Cd + 1
If Cells(Rd, 4) = "" Then
d = ""
Pd = ""
Nd = 0
Else
d = Cells(Rd, 4)
Pd = d Mod 2
Nd = Val(d)
End If
For Re = 2 To Ce + 1
If Cells(Re, 5) = "" Then
e = ""
Pe = ""
Ne = 0
Else
e = Cells(Re, 5)
Pe = e Mod 2
Ne = Val(e)
End If
For Rf = 2 To Cf + 1
If Cells(Rf, 6) = "" Then
f = ""
Pf = ""
Else
f = Cells(Rf, 6)
Pf = f Mod 2
Nf = Val(f)
End If
For Rg = 2 To Cg + 1
If Cells(Rg, 7) = "" Then
g = ""
Pg = ""
Ng = 0
Else
g = Cells(Rg, 7)
Pg = g Mod 2
Ng = Val(g)
End If
Do While Worksheets(2).Cells(R, Col) <> ""
Col = Col + 1
If Col = 101 Then
R = R + 1
Col = 1
End If
Loop
Worksheets(2).Cells(R, Col) = a & b & c & d & e & f & g
Next Rg
Next Rf
Next Re
Next Rd
Next Rc
Next Rb
Next Ra

TA的精华主题

TA的得分主题

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

对于初学者来说,仅仅Dim一下是不足以让人理解代码的。

因为他们往往对于最简单的一句代码都不知其意义和作用。

那么,最热心的做法是【每一句都加上中文注释。】


dim 变量本身对理解代码起不到你所说的作用。

真正有点用处的是:给变量取一个容易理解的名称。
甚至于可以【直接用中文汉字作变量名。】

dim 是没有帮助理解代码的作用的。





点评

小鸡是没法理解天鹅为什么要在天空飞的... 你看看变量命名的国际规范,就知道Dim语句对于理解程序的重要性了。至少从这个帖子里我发现你对项目编程规范是外行!  发表于 2013-1-31 13:02

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 15:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
【liucqa  Option Explicit 建议保留,这是防止手误的唯一办法。  发表于 2013-1-30 12:55 】

防止手误的办法是认真、用心。

Option Explicit 仅能提醒未定义过的变量被使用,但不能防止手误写成了其它类似变量名。

比如,Dim myRng1 as Range, myRng2 as Range

然后你在该使用myRng1时误用了myRng2,
那么dim 和Option Explicit 都帮不到你的。


所以,你的说法是片面的。或者说是错误的。


实际生活中,以这样的思维去管理,也是要出错的。



点评

唉,你看来从没理解Option Explicit 的作用。我只好说得清楚些:Option Explicit +Dim是避免手误的唯一办法  发表于 2013-1-31 13:07

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 15:41 | 显示全部楼层
【liucqa  第三点严重错误:变量名不能随心所欲!正确的定义变量名可以让其他人迅速看懂你的程序。而这一点在团队合作中甚至比编程无bug还重要!!!!!  发表于 2013-1-30 13:02 】


呵呵,这个应该是题外话了吧?

我说的初学者应该可以随心所欲地使用变量,而不必要被“好习惯”所禁锢。

至于高级程序编写者需要好习惯,是另外一回事。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 15:46 | 显示全部楼层
【liucqa  + 1 用儿戏的言论给一个深奥的课题匆匆下了结论. 】


呵呵,忘了我说的前提了吧。面向初学者。

或许非常有必要再强调一下【仅仅针对初学者在初学阶段编写简单代码时的变量使用问题】

点评

联系上下文很重要!!!  发表于 2014-9-17 22:26

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 15:52 | 显示全部楼层
【liucqa  关于变量的命名是一个严肃的话题,不能儿戏对待,看68楼。建议先看看国内外对变量命名的论述,再来看看你的这个帖子问题。  发表于 2013-1-30 12:56 】


一共只有十几、二十几行的简单代码,使用单字母变量没有任何问题。
我想没必要上升到一个规则的高度去指责这种做法。

事实上这样写并不影响代码的运行甚至阅读。【再次补充条件,几十行,几个变量的简单代码】



点评

你把你的这些先决条件在一楼说清楚吧,至少你在一楼里面说的是所有、权霸、概念、打到之类的绝对词汇,我压根就没看到什么先决条件,所以在我看来你的帖子内容就是儿戏!!!  发表于 2013-1-31 13:06

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 16:00 | 显示全部楼层
chentx 发表于 2013-1-30 13:18
一个对编程感兴趣的人都会去学习编程语言的一些基础知识:语法、变量类型,这是很必然的。对于这类型的人, ...

【而另外一些人他们知道可以通过编程来解决一些数据处理问题,但是他们没有兴趣去学习,只想如何解决当前的问题,或者是叫人做或者是抄别人类似的代码,楼主所提出的不需要定义变量的理论恰恰是面向这群类型的人,反过来说,对一些没有编程兴趣的人说一些你认为是经验之谈的话是不是有点无的放矢?】


呵呵,事实上我就是对编程并没有兴趣,仅仅是利用VBA作为工具解决一些实用问题的这一类人。

而VBA甚至不应该被认为是一种编程语言,只是面向Excel用户的一种二次开发工具。




TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 16:08 | 显示全部楼层
lee1892 发表于 2013-1-30 15:13
刚好有人发了求助贴了,楼主帮忙给人改改代码吧  http://club.excelhome.net/thread-978527-1-1.html

...

呵呵,他写的代码都Dim了哦。

不过大量使用单字母和双字母变量,仍然不符合“好习惯”的要求吧?!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 12:07 , Processed in 0.033406 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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