Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 11906|回复: 19

[分享] [ ]和Evaluate()在单元格区域运算中的妙用

[复制链接]
发表于 2014-5-25 09:59 | 显示全部楼层 |阅读模式
本帖最后由 大灰狼1976 于 2014-5-25 23:20 编辑

注:重要提醒,附件sample11字符型变量异常的问题,已由
       某论坛的
冻豆腐
版主解决,原来我最后少加了两个引号,
       已在sample11里追加了说明。

       ※更新后附件请见15楼
以下开始:

可能跟大部分同学一样,[]符号我常用的是作为单元格区域的简写,
比如range("a1:c10")我喜欢写成[a1:c10],除此之外使用得很少
(当然在正则的pattern里还是一直要用到的),前几日看到论坛的
一个回复,简单的一句代码,别人可能并没有注意到,我试过之后,
就对这个东西产生了兴趣。

当然,通过百度之后发现这个东西很不简单,我现在只把我发现的
一些妙用(可能高手们都知道,但论坛上讨论得不多)跟大家展示
一下。

废话不多说,进入正题:
1、对单元格区域与常量的简单运算

  例1:[c1:c10]=[a1:a10].Value
       用于同大小单元格区域的整体赋值,这个应该容易理解
       当然不仅限于1行或1列,以下同

  例2:[c1:c10]=[a1:a10+3]
       这里开始有点意思,单元格区域可以整体加上一个常量赋值
       实际确认下来,数学四则运算及幂运算均可,以下同
  
2、对单元格区域与单元格区域的简单运算

  例3:[c1:c10]=[a1:a10+b1:b10]
       把两个同大小单元格区域的数值相加

3、对单元格区域与单元格区域及常量的混合运算

  例4:[c1:c10] = [a1:a10+b1:b10^2]
       单元格区域之外再加上常量也可,当然运算时会遵守四则运
       算的优先顺序,可以有多个此种组合,但是好象有最大字符
       数不超255的设定(没试,不好意思),一般情况下应该够
       用了

4、直接运行工作表函数

  例5:[c1:c10] = [a1:a10+sum(b1:b10)]
       可以直接使用工作表函数,这样的表达是没有问题的

5、单元格区域的字符串操作,方法与数值计算大致相同,所以就不
   作说明,直接举例了(目前只发现了&连接操作可以用)

  例6:[c1:c10]=[a1:a10&"abc"]

  例7:[c1:c10]=[a1:a10&b1:b10]

  例8:[c1:c10]=[a1:a10&b1:b10&"abc"]

以上方法,可以直接赋值给单元格区域,也可以赋值给数组

  例9:arr=[a1:a10&b1:b10&"abc"]

各位同学看到这里,可能会有一点兴趣了,不一定什么时候就能用到,
比循环简便多了。

但是,实际使用时会发现有点缺点,就是不够灵活,中间不能使用
变量!  实际使用中这真是个问题。

不甘心,继续百度,功夫不负有心人,终于发现[]居然和evaluate()
有密切的关系(抱歉,估计是我孤陋寡闻),简单来说,[]相当于
evaluate()的简写,最重要的一点,evaluate()支持变量!
这于我可是天大的喜讯,马上测试

先不放变量测试
  例10:[c1:c10]=Evaluate("a1:a10&b1:b10&""abc""")
       正常运行

再用变量测试

  例11:s = "abc"
       [c1:c10] = Evaluate("a1:a10&b1:b10&" & s)
       测试失败,原因不明
       注:测试失败仅代表本人操作结果,如有操作不当请高手不吝
       赐教
       追加说明:此问题已解决,原来需要在变量前后加上引号
       例:s = "abc"
              [c1:c10] = Evaluate("a1:a10&b1:b10&""" & s & """")
       由于引号太多不容易记,也可以这样表达:
              [c1:c10] = Evaluate("a1:a10&b1:b10&" & Chr(34) & s & Chr(34))
       完美解决,在此特别感谢某论坛冻豆腐版主。


  例12:s = 3
       [c1:c10] = Evaluate("a1:a10+b1:b10+" & s)
       正常运行

  例13:r = [a65536].End(3).Row
       [c1:c10] = Evaluate("a1:a" & r & "^b1:b" & r & "&""abc""")
       正常运行

从结果来看,字符型变量不可使用,但数值型变量没有问题
通过反复测试,没解决问题,误打误撞,竟然发现数学运算和字符串
运算混用也可以,当然不能用字符型变量,这是另一个收获。

  例14:[c1:c10] = Evaluate("a1:a10^b1:b10&""abc""")
       正常运行

当然,跟[]一样,可以直接赋值数组,就不多作说明了。
再增加一个特殊的功能,可以将单行单元格区域不转置直接赋值为一维数组
试过列区域不行

  例15:arr=[k1:p1&""]
       正常运行,可以用join()进行验证

  例16:arr=Evaluate("k1:p1&""""")
       evaluate()也能正常运行

综上所述,evaluate()兼顾了[]的便利性与自身的高兼容性,可以用
简单的方法进行区域范围内的数据处理,我觉得用好了也是个利器,
当然如上所述,可能会存在一些问题,需要在使用中进行取舍。

以上内容,部分从逛各个论坛时积累,部分是自己尝试的。

相关说明的附件请参考,希望对各位同学有所帮助,以上です。



evaluate()例集.rar

23.46 KB, 下载次数: 141

评分

参与人数 5 +63 金币 +20 收起 理由
zxx1212 + 1 很给力!
ppp710715 + 18 很给力!
1091126096 + 18 赞一个!
FnG + 6 赞一个!
huangcaiguang + 20 赞一个!

查看全部评分

发表于 2014-5-25 10:03 | 显示全部楼层
谢谢楼主分享,学习了

评分

参与人数 1 +2 收起 理由
大灰狼1976 + 2 感谢版主关注!!!

查看全部评分

回复

使用道具 举报

发表于 2014-5-25 10:09 | 显示全部楼层
回复

使用道具 举报

发表于 2014-5-25 10:10 | 显示全部楼层
学习了
回复

使用道具 举报

 楼主| 发表于 2014-5-25 10:17 | 显示全部楼层
感谢各位同学的关心,就是字符型变量不能使用,还是有点不甘心,
尝试了多种方法,包括在字符型变量两端特地又加了引号,结果
还是不行,希望各位同学也能关心一下这个问题,尽量使其达到
相对的完美。
回复

使用道具 举报

发表于 2014-5-25 10:22 | 显示全部楼层
顶,大赞。很好的发现。学习学习再学习。
回复

使用道具 举报

发表于 2014-5-25 10:33 | 显示全部楼层
谢谢楼主分享,学习了~
回复

使用道具 举报

发表于 2014-5-25 10:53 | 显示全部楼层
大灰狼1976 发表于 2014-5-25 10:17
感谢各位同学的关心,就是字符型变量不能使用,还是有点不甘心,
尝试了多种方法,包括在字符型变量两端特 ...
  1. <p>Sub test()</p><p>s = "123"</p><p>       [c1:c10] = Evaluate("a1:a10&b1:b10&" & s)</p><p>End Sub</p><div></div>
复制代码
如果变量是字符型的数字,运行是正常的。

回复

使用道具 举报

 楼主| 发表于 2014-5-25 11:09 | 显示全部楼层
感谢好男人曾小贤
测试字符型数字确实可以,但是实际上的结果貌似仍然是数值型的,
是不是这个方法会把字符型数字转换成数值来进行处理。
s = "123"和s = 123得出的结果好象完全一致,连类型都一致
回复

使用道具 举报

 楼主| 发表于 2014-5-25 11:15 | 显示全部楼层
改成以下形式后(字符型变量两端特意加了引号),结果还是不正常,但是
错误内容从 #NAME? 变成了 #VALUE!,貌似离真相近了一步
  1. s = "a"
  2. [c1:c10] = Evaluate("a1:a10&b1:b10&""" & s & "")
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-24 15:21 , Processed in 0.360051 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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