ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 声明变量的重要性的一个例子…

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:07 | 显示全部楼层
本帖已被收录到知识树中,索引项:数据类型和基本语句
Sub test()
    Dim rg as Range  
    For Each rg In Selection        
        rg = Left(rg, 5)   
    Next
End Sub

这个代码可以操作,当然确实是因为采用了Dim rg as range 的纠正方法。

但这个并非Dim的正确用法,而是因为有了以下的错误处理:
For Each rg In Selection        
    rg = Left(rg, 5)   

本来rg是Selection中的元素,只能读取rg属性。
当发生 = 命令强制给予赋值时,
微软工程师经过检查发现rg已被定义为Range类型,
于是试用Range属性中的 Range.Value,即:
rg.Value = Left(rg, 5)  …… 结果成功,于是代码继续。

…………
因此,在本例中使用了Dim,然后 rg = Left(rg, 5)

这个和不使用Dim ,然后  rg.Value = Left(rg, 5) 根本就是一回事。

只不过是显式命令和 后台微软默认选项之间的差异。

…………
从这个角度上看,
不Dim rg而直接使用rg.Value = Left(rg, 5)
反而要比 先Dim rg as Range 然后使用 rg = Left(rg, 5) 更为正确。


呵呵。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:10 | 显示全部楼层
香川群子 发表于 2014-9-25 13:55
下面这个数组中的例子:呵呵,可以明确告诉你,根本原因是错误地使用了For……Each循环试图直接改变集合对 ...

你这跟帖有转移话题嫌疑。

评:
1.就楼主之例而言,明明有For Each高效率的遍历集合的方法却弃而不用!
2.因为一个不定义变量类型的“方便”而不得以采用For i=……,且不说效率,就代码量来说,究竟是“便”还是“不便”?

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:21 | 显示全部楼层
燕雀安知 发表于 2014-9-25 14:10
你这跟帖有转移话题嫌疑。

评:

For……Each 不是万能的。

而且,我早已强调,For……Each的目的,
是用来取得集合中的属性,循环结束以后,集合本身一般没有变化。

For……Each的目的,不是用来逐一改变集合元素中的属性。这个大多数情况下是办不到的。
少数情况(像楼主例子)也是一种误解。



TA的精华主题

TA的得分主题

发表于 2014-9-25 14:25 | 显示全部楼层
香川群子 发表于 2014-9-25 14:07
Sub test()
    Dim rg as Range  
    For Each rg In Selection        

你呀,总有话说。

似是而非,真能忽悠。没一定基础的VBA初学者(本人也是,免得被人呛)非被你“悠”晕了不可。

评:不是“试用Range属性中的 Range.Value”,而是肯定rg必然是集合中一员,因为rg已定义为Range对象,在For Each结构中,必然是Selection集合对象(不要扯Selection说不定是一图形对象)中的对象,没必要在赋值时才(或再)去检查,该检查在For Each时就已经被检查过了。

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:26 | 显示全部楼层
小花鹿 发表于 2014-9-25 13:19
声明变量只是一个习惯问题,不是程序运行的必要。

声明变量是专业编程的基本要求,也是必然的习惯。

身为码农而不声明变量的、从未有之。

…………
然而,微软VBA是可以选择不声明变量的
(实际为按照微软工程师制定的规则进行默认隐式声明)
而在绝大多数情况下、这么不仅是可以的,而且往往比VBA初学者自己定义的还要好。





TA的精华主题

TA的得分主题

发表于 2014-9-25 14:32 | 显示全部楼层
本帖最后由 香川群子 于 2014-9-25 14:33 编辑
燕雀安知 发表于 2014-9-25 14:25
你呀,总有话说。

似是而非,真能忽悠。没一定基础的VBA初学者(本人也是,免得被人呛)非被你“悠”晕 ...

不管怎么说,

在楼主这个例子中,Dim rg As Range 的作用/目的,就是为了能够使得代码运行时,
能够把 rg = Left(rg, 5) 自动纠正为: rg.Value = Left(rg, 5)


因此,先Dim  rg As Range  然后使用  rg = Left(rg, 5) 与直接在循环中使用  rg.Value = Left(rg, 5)  就是一回事。

至于优劣评判,个人因素较多。谁也轻易说服不了谁。呵呵。


TA的精华主题

TA的得分主题

发表于 2014-9-25 14:47 | 显示全部楼层
当使用for each语句时,通用的做法应该是保持遍历变量为Varinat类型.如果出现楼主例的情况,使用属性来纠偏.试想如果遍历集合中有多种变量类型元素,难道能设置它的其它类型吗?

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:51 | 显示全部楼层
香川群子 发表于 2014-9-25 14:32
不管怎么说,

在楼主这个例子中,Dim rg As Range 的作用/目的,就是为了能够使得代码运行时,


不知您发现没,在我所写的代码中,只要目标明确,我必然定义一个相应类型的变量与之对应,譬如:

假设有人这样描述求助:请把A1单元格的日期用MsgBox以“××××年××月××日”的形式显示出来。
我必然:
sub kkk
dim theDate as Date
theDate=Cells(1)
msgbox("哇啦哇啦:" & Format(theDate,"yyyy年mm月dd日")
end sub
这样做的好处是可以检测Cells(1)值的合法性,即代码纠错一逮就着:
sub kkk()
dim theDate as Date
on error resum next
theDate=Cells(1)
if err=0 then
msgbox "哇啦哇啦:" & Format(theDate,"yyyy年mm月dd日")
else
msgbox "奶奶的,日期值非法啦!"
end if
on error goto 0
end sub

题外话:本人代码又是“以简变繁”了。

您的代码可能是:
sub kakawa()
msgbox "哇啦哇啦:" & Format(Cells(1),"yyyy年mm月dd日")
end sub

题外话:您的代码是“视繁为简”,连变量都不需要。

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:57 | 显示全部楼层
声明变量重要与否,在群子姐姐当初的那个帖子上,我已经发表了意见,也和群子姐姐吵过架了。现在我还是坚持自己的观点。

这里提一点,for each For Each高效率的遍历集合的方法? 谁说的?MSDN 上有提过? for each 循环是采用一种迭代器(literate)的东西,表面上for each
比for i ,for j 少一重循环,但是其内部封装的代码要付出多少执行效率,谁知道?通常情况下这两种循环的效率哪个更高,是没有定论。
很多从事专业IT 教学的,我见过的两个教Java 的一个教.net 的,我当面向其请教这个问题,他们回答,没有定论。但是从个人感觉来说,到内存层面,下标循环
即 for i 那种是要更快的。

点评

曾在一本专业书籍上看到过,for each 的优点是可不用顾及集合大小,速度嘛不理想.  发表于 2014-9-25 15:28

TA的精华主题

TA的得分主题

发表于 2014-9-25 15:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liu-aguang 发表于 2014-9-25 14:47
当使用for each语句时,通用的做法应该是保持遍历变量为Varinat类型.如果出现楼主例的情况,使用属性来纠偏.试 ...

您说的是特例。

我孤陋寡闻,还没见过含多种数据类型的集合且要遍历其中的成员。

就多数情况来说,若一编码者连自个儿写的代码其变量类型究竟该如何定义而不明确,该代码多少有问题。Excel场合下,即便因变量问题而出漏子,也危害不到哪去,没听说谁因变量问题造成代码运行结果不正确而痛不欲生的。但就编码来说,不定义变量而盲目让VBA自行“晓意”执行代码,我终究不愿意。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-2 17:01 , Processed in 0.032047 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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