ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-9-19 16:06 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数据类型和基本语句
本帖最后由 lolmuta 于 2014-9-19 16:11 编辑

目标:将所圈选的储存格,换成只取前5个字
代码如下

  1. sub test()   
  2.     for each rg in selection        
  3.         rg=left(rg,5)   
  4.     next
  5. end sub
复制代码
代码看起来没什么问题,

但你会发现储存格的值是不变的…




去debug就会发现
一开始其实是range型态的,但是过了left之后,就变成字串了…
所以你是将最终运算结果给到一个字串变数rg中,
所以不论怎样,储存格的值都不会变…


所以声明变量在这例子中是非常重要的,至少,物件型态的变数至少宣告一下吧…

  1. sub test()
  2.    dim rg as range  
  3.     for each rg in selection        
  4.         rg=left(rg,5)   
  5.     next
  6. end sub
复制代码
可正常运作…

TA的精华主题

TA的得分主题

发表于 2014-9-19 17:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 燕雀安知 于 2014-9-19 17:38 编辑

是个经典例子。赞一个先!

事后补:
本人以前,以及将来从不犯这样的错误,因为本人写的任何一个小代码,都定义变量,这成了强迫症,有时写着都觉得有点可笑了。

事后再补:

对于不定义变量的代码:
Sub test()
    For Each rg In Selection
        rg = Left(rg, 5)
    Next
End Sub

有人要强词夺理地辩解,不定义变量照样行,即加上.Value:
Sub test()
    For Each rg In Selection
        rg.Value = Left(rg, 5)
    Next
End Sub

故早早地于本楼声明:不定义变量却东补补,西补补,还振振有词,美之名曰:加.Value是个好习惯!

TA的精华主题

TA的得分主题

发表于 2014-9-25 12:49 | 显示全部楼层
燕雀安知 发表于 2014-9-19 17:26
是个经典例子。赞一个先!

事后补:

这是For Each的问题。

如果用For……Next循环就没事。

TA的精华主题

TA的得分主题

发表于 2014-9-25 12:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有时候,一时搞不清该声明为何种变量,所以俺还是习惯保持它的Variant本性.

TA的精华主题

TA的得分主题

发表于 2014-9-25 13:19 | 显示全部楼层
本帖最后由 燕雀安知 于 2014-9-25 13:35 编辑
liu-aguang 发表于 2014-9-25 12:59
有时候,一时搞不清该声明为何种变量,所以俺还是习惯保持它的Variant本性.


口是心非吧。

老手写代码还有搞不清变量应该声明为何种变量?估计是懒得去“搞”清!

有人云:一旦编码者搞不清变量应该定义为何种类型,往往表明编码者对代码的运行结果持不确定态度,应该要警惕了。

譬如:theValue=InputBox(),究竟把thaValue定义为字符型呢,还是布尔型,亦或如你所说搞不清楚就定义为变体型?因为单击“取消”按钮时,帮助说明仅说返回False,这个Fasle是字符串呢?还是逻辑值0?颇伤脑筋。其实仔细想想,应该很快判断出应该定义为字符型,因为帮助中开篇就明确指出Input()函数返回的是一字符型,加之可以用If theValue="False" Then这样的字符串语句去判断,同样可达到目的。

纠正:上述InputBox的举例有误,把InputBox()当成Application.InputBox()来描述了。但也不想修改任何一字了,因为感觉虽然举例有误,但一些说法对后来者应该有点帮助。此外,若用Application.InputBox(),倒真的可以把theValue定义为变体型,因为其返回值的类型原本就有多种结果。

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2014-9-25 13:33 | 显示全部楼层
燕雀安知 发表于 2014-9-19 17:26
是个经典例子。赞一个先!

事后补:

美之名曰:加.Value是个好习惯!
有时候不加Value是不行的。

TA的精华主题

TA的得分主题

发表于 2014-9-25 13:51 | 显示全部楼层
香川群子 发表于 2014-9-25 12:49
这是For Each的问题。

如果用For……Next循环就没事。

老师帮忙看下这个帖子,谢谢!
http://club.excelhome.net/thread-1154244-1-1.html

TA的精华主题

TA的得分主题

发表于 2014-9-25 13:55 | 显示全部楼层
燕雀安知 发表于 2014-9-19 17:26
是个经典例子。赞一个先!

事后补:

下面这个数组中的例子:
  1. Sub test()
  2.     ar = [a1:b5]
  3.    
  4.     For Each a In ar '用For……Each遍历数组元素
  5.         a = Left(a, 5) '试图以这样的方式操作数组元素……结果是不可以的!
  6.     Next
  7.     [a11:b15] = ar '可以观察到,数组ar未发生Left改变
  8.    
  9.     br = [a1:b5]
  10.     For i = 1 To UBound(br)
  11.         For j = 1 To UBound(br, 2)
  12.             br(i, j) = Left(br(i, j), 5) '这样遍历数组处理各个数组元素是正确的。没问题
  13.         Next
  14.     Next
  15.     [a11:b15] = br
  16. End Sub
复制代码
呵呵,可以明确告诉你,根本原因是错误地使用了For……Each循环试图直接改变集合对象属性的问题。

点评

注意一楼的代码是Selection,这个有可能是不连续区域,不能使用数组循环遍历。  发表于 2015-3-14 19:34

TA的精华主题

TA的得分主题

发表于 2014-9-25 14:02 | 显示全部楼层
小花鹿 发表于 2014-9-25 13:33
美之名曰:加.Value是个好习惯!
有时候不加Value是不行的。

“有时候不加Value是不行的”

属于我在5楼所描述的“有人云”的情况。

譬如:
Range("A1:C1")=Range("F1:H1").Value非得写成Range("A1:C1").Value=Range("F1:H1").Value
TextBox1="123456"非得写成TextBox1.Value="123456"
那有没必要这样呢?把Sheet1.Cells(1)写成Sheet1.Cells.Item(1)呢?

上述后者的代码觉得好看吗?(题外话:忘了是谁写的代码了,一大段代码不管三七二十一均加上不必要的.Value,让人看得眼花,所以本人一瞄,赶紧撤,再没心情看那帖)

当然了,我注意到你的用词是“有时候”,但瞧着还是有“一年遭蛇咬,十年怕井绳”的嫌疑。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-24 07:20 , Processed in 0.047703 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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