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 15:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:数据类型和基本语句
hehex 发表于 2014-9-25 14:57
声明变量重要与否,在群子姐姐当初的那个帖子上,我已经发表了意见,也和群子姐姐吵过架了。现在我还是坚持 ...

哈,不曾想引出位路见不平一声吼者。

那修正下本人12楼的用词好了:
1.就楼主之例而言,明明有For Each简便写法的遍历集合的方法却弃而不用!

TA的精华主题

TA的得分主题

发表于 2014-9-25 15:34 | 显示全部楼层
燕雀安知 发表于 2014-9-25 15:07
哈,不曾想引出位路见不平一声吼者。

那修正下本人12楼的用词好了:

如果真要有所讲究,那么楼主代码直接操作单元格是很不可取的。

通常的做法应该是先把单元格区域内容读入数组,然后遍历循环处理、最后输出到工作表区域。

…………
而此时,毫无疑问应该使用For i =  循环。
(已经告诉你,For……Each操作数组元素是不可行的。)

TA的精华主题

TA的得分主题

发表于 2014-9-25 15:41 | 显示全部楼层
本帖最后由 香川群子 于 2014-9-25 15:47 编辑
燕雀安知 发表于 2014-9-25 14:51
不知您发现没,在我所写的代码中,只要目标明确,我必然定义一个相应类型的变量与之对应,譬如:

假 ...

Sub kagawa()
    If IsDate(Cells(1)) Then MsgBox "哇哩哇啦:" & Format(Cells(1), "yyyy年mm月dd日") Else MsgBox "日期非法"
End Sub

咋样?
我确实比你更能化繁为简。

但大型编程呢,只能老老实实地去做……这个是经验教训。
所以作为码农的你,有这样的习惯是很好的。没有问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-9-25 15:58 | 显示全部楼层
我是偶然的情况下发现到这个例子,一想到要是一个大型程序中放了这个代码,要找错不知道有多难,所以有感而发罢了…

但总有人…
在香川的显赫历历的文章中,效率>方便,我想她的字典中没有for each...效率不够高…

我的观点,方便>效率,
我的方便是只好懂,好修改,好写,因为我相信,一个出错的程序价值<正确的程序的价值

TA的精华主题

TA的得分主题

发表于 2014-9-25 19:27 | 显示全部楼层
香川群子 发表于 2014-9-25 15:41
Sub kagawa()
    If IsDate(Cells(1)) Then MsgBox "哇哩哇啦:" & Format(Cells(1), "yyyy年mm月dd日") ...

我不是码农,无聊才玩Excel的,学好它,对我而言可说是一无用处。

回到想说的话题:
如我所料,你果然说用IsDate()去判断下就好了。还记得否,上回有个帖子,其意是按既定的工作表名称序列排序工作表。若不经我提醒,你或许n久后才知道自己的代码有很大的Bug。用Cstr()函数没错,问题是你要等到使用代码后还要不经意间才发现,又或者,严重点,^_^,在有生之年,你始终发现不了这个错误。而按我的做法,不管怎样,先定义个字符型变量theStr紧扣工作表名称的题意,然后theStr=Cells(i,1),最后Sheets(theStr).Move,逻辑严密,绝不会犯类似前述那样的低级错误。你若还坚持不用定义变量的观点,哪天你铁定还犯类似上述那样的Bug。

结论:你经常习惯于专注他人当前所举的某个例子,不愿意作深入分析,有意或无意曲解他人的意思。

我的本意是举个例子再次说明定义变量的好处,并非说本例的解决之道非得定义一个日期型变量不可。

此外,楼主本例只是举个例子说明rg变量不定义造成的惊愕,并非说For Each的问题,你却转移话题说For i=能解决不定义变量的问题,更在后续楼层下结论说使用For Each操作数组元素是不可行的,明显转移话题了。问:若要清除Selection中底纹为黄色的单元格的内容,此时不用For Each,难道用For i= ?显然,此时谈不上用数组了,所以与For Each操作数组可行还是不可行没有任何关系。

TA的精华主题

TA的得分主题

发表于 2014-9-25 20:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
燕雀安知 发表于 2014-9-25 15:07
哈,不曾想引出位路见不平一声吼者。

那修正下本人12楼的用词好了:

要讨论问题就讨论问题,不要意见不统一就携枪带棒的攻击。什么叫路见不平一声吼?
群子那篇新手不声明变量的帖子里,我和她吵的比你这里厉害多了。
for each 未必有你描述的那么高大上,起码当时你举的例子里不是,速度上更不一定行。大型程序,excel vba 写的了大型程序吗?

TA的精华主题

TA的得分主题

发表于 2014-9-25 21:37 | 显示全部楼层
本帖最后由 燕雀安知 于 2014-9-25 21:39 编辑
hehex 发表于 2014-9-25 20:57
要讨论问题就讨论问题,不要意见不统一就携枪带棒的攻击。什么叫路见不平一声吼?
群子那篇新手不声明变 ...


本主题帖的跟帖你看出哪层楼有火药味了?携枪带棒?更不知所言。难不成指21楼?

“路见不平一声吼”的说词你觉得有冒犯之嫌,那就改“不经意间咳一声”好了。

另:本人从来没当Excel 的VBA是回事,始终清醒地认识到仅是Excel这一电子表格软件的自动化命令而已,说难听点,跟传统的编程语言比(尽管本人不会),我始终当它就是个屁!!!所以,年轻人(托大了),不要以为世人皆醉,唯你独醒。

另:关于女侠的那篇声明,她一发帖我就看了,绝对比你看得早,但一直没出声,始终抱着瞧热闹的心态去观帖,直到后来罗刚君发话了,我就跟了个帖,帖子的内容印象不深了,好象是劝罗刚君没必要为该帖较真。

再另:本人这不知是第3个号还是第4个号了,所以别当新手或初级都是傻傻的VBA的“高、大、尚”的崇拜者。

TA的精华主题

TA的得分主题

发表于 2014-9-26 09:57 | 显示全部楼层
燕雀安知 发表于 2014-9-25 21:37
本主题帖的跟帖你看出哪层楼有火药味了?携枪带棒?更不知所言。难不成指21楼?

“路见不平一声吼” ...

倚老卖老,你真觉得你有多大年纪。看你的回帖就幼稚的厉害,扯什么罗刚君啊,说说你自己啊。我就是xxx ,你给我shut up。在EH 某技术大牛版主当面和我说这个,我又不是没见过。就是个屁的论坛,你注册3-4 个号,只能说明你的取向很有问题。

EH 现在完全没有技术讨论的氛围,对不同的技术分歧,除了直接喷的就是装的,最后一贴,本人对这种毫无技术含量的帖子不再回复。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-9-26 10:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lolmuta 发表于 2014-9-25 15:58
我是偶然的情况下发现到这个例子,一想到要是一个大型程序中放了这个代码,要找错不知道有多难,所以有感而 ...

for each 在vba 中有其必然存在的条件,比如Range.SpecialCells 方法返回的单元格区域,由于该区域及可能不是连续区域,因此不便转换成为数组进行遍历。那么for each 就是最方便的最好的方法,用循环嵌套往往不易实现。
另在字典等容器中使用for each 循环,往往采用的是Iterate 迭代对象实现的,这点比如在C# 中就是如此。那么读出遍历的对象是只读的,vba 中我也曾用for each 对字典遍历,但是没有尝试去改变其中的值,这就不敢下结论了。可以实验一下,反正写段测试代码很简单。我以前测试过,用for each 方法循环遍历数组,首先执行效率上不行,其次不能修改数组的值,是只读的。

TA的精华主题

TA的得分主题

发表于 2014-9-26 10:08 | 显示全部楼层
hehex 发表于 2014-9-26 09:57
倚老卖老,你真觉得你有多大年纪。看你的回帖就幼稚的厉害,扯什么罗刚君啊,说说你自己啊。我就是xxx , ...

还是世人皆醉,唯你独醒,没新意!

其他,再幼稚回:吧啦吧啦……(既然不回帖了,那就自行揣摩去)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-6 16:10 , Processed in 0.043448 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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