ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] Cells与Range用法上的区别?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-8-19 17:33 | 显示全部楼层 |阅读模式
如图1,cells可以用;可是range就不行。

这是为什么呢?如果想用range应该怎么写呢?

1.png
2.png

TA的精华主题

TA的得分主题

发表于 2016-8-19 17:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
range("A"& i )

TA的精华主题

TA的得分主题

发表于 2016-8-19 21:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-8-19 21:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-8-19 21:47 | 显示全部楼层
本帖最后由 lsc900707 于 2016-8-19 21:48 编辑

1. 如下面代码,假设 i 是一个可以从1~10循环变化的值(变量),而我需要定义“Bi”单元格,然后给“Bi”单元格分别输入1~ 10,
    也就是让循环的时候,Bi 相当于B1、B2、B3、B4.....B9、B10单元格,这个“Bi”单元格,在VBA代码中,都有哪些写法呢?
     For i = 1 to  10
          Bi = i
      Next

2. Range和Cells都能表达单元格的位置,那么,为什么要设置两个不同的属性及表达方式呢?对二者你有什么看法?

3. 请测试下面代码所指的单元格分别是哪个,你有发现其中的规律吗?或者,你知道当中的取向规则吗?有的话,请简要阐述一下。
   ① Range("C4")(2,3)                  ② Range("C5")(-2,1)                     ③   Cells(2,3)(2.5)            ④   Cells(2,3)(3.5)      
   ⑤ Range("A1:A5").Item(2)       ⑥ Range("B2:B5").Range("A2")

----------
附加题:
4. 在对单元格赋值(输入)时,如我们要在A1单元格输入3.14159,下面两种代码的写法都可以达到同样的结果,
    那么,你了解什么情况下可以省略.Value,什么时候却一定不可以呢,有的话试举例子?
   代码1:Range("A1") = 3.14159
   代码2:Range("A1").Value = 3.14159
   
1. Bi 的写法,主要有以下几种:
   Range("B" & i )               Cells( i , 2 )              Cells( i , "B") (当列号较大、不易计算时,如“H"、”AD",我们可以直接用双引号加列标作为第二参数)

     使用Range、Cells是比较常用的写法,方便,易记,规律性较好!
     另外,如5楼chunlin1wang同学,找到更多等效的写法,简单的如: [B1]( i ) 大家可以借鉴学习!

P.S:
    对单元格访问,速度最快的的是 Cells(1,1) ,其次是 Range("A1"), 最慢是 [A1]
    Cells() 快于 Range()  快于 []
    因此多循环中建议使用 Cells()。  〖权威出处有待考证〗

2. Range、Cells都可以表达单元格/区域,但二者也有很明显的区别:
    Range 中文意思是“区域”,Cells 中文意思是“单元(格)”,所以,大家可以试想一下,你用Cells()可以表达一个单元格区域吗?
    比如说,我们想表示A2:D3这个区域,用Cells()可以实现吗?那么,用Range()呢?
    因此,单独用Cells()只能表示某个单元格,而不能表示一个区域。

    显然,Range是可以兼容Cells的表达方式,但Range更倾向于区域有“固定”因素时使用,当代码里要使用行、列参数都是变量的单元格时,
    直接用Range来表达的话,就显得有心有力了……   而Cells()在这时候,就是最好的选择。

    所以我们要适时选择其一,或者用Range(Cells(),Cells())的联合方式,总之让自己方便,让代码高效……

3. 各个代码所表示的单元格:
    ① Range("C4")(2,3)  = E5                   ② Range("C5")(-2,1)    =C2
    ③   Cells(2,3)(2.5)     = C3                   ④   Cells(2,3)(3.5)         =C5
    ⑤ Range("A1:A5").Item(2)  =A2        ⑥ Range("B2:B5").Range("A2")     = B3

P.S:
    如果不知道规则,那可以用VBA代码测试,比如说我们可以用Range("C4")(2,3).Select 根据运行后选择的单元格来判断结果,
    也可以用Debug.Print Range("C4").Item(2, 3).Address(0, 0)来获得地址,Address后面的参数省略的话可以得到绝对地址,是一样的。

   3.1 为什么会有像Range("C4")(2,3)这种表达方式呢,表示的又是什么意思呢?
        上面的代码,其实就是Range("C4").Item(2, 3)简化掉中间的“Item”得到的,指的就是以C4单元格为中心,按一定偏移量所得到的单元格,
          我们看一下帮助文件的说法:表达式.Item(RowIndex, ColumnIndex)  而表达式 就是指一个代表 Range 对象的变量。
          如果 RowIndex 指定为 1,则返回区域内第一行中的单元格,而非工作表的第一行。
        例如,如果选定区域为单元格 C3,则 Selection.Cells(2, 2) 返回单元格 D4(使用 Item 属性可在原始区域之外进行索引)。

        即:表达式前面指定的单元格,将作为偏移原点,而原点的坐标是(1,1),跟我们日常接触的(0,0)有所差别,具体坐标如下图所示,
         因为坐标原点不是0,所以计算时比较容易搞混,因此这种方法较少用,通常都会使用OFFSET(),因为OFFSET()的偏移量是按增量,容易计算。


    3.2 为什么Cells(2,3)(2.5) 跟 Cells(2,3)(3.5) 一个是C3、一个是C5相差2个单元格之多?
          首先,2.5与3.5,会由内部先取整,然后再如上面的偏移方式进行计算,但VBA内部,默认的取整方式,跟我们通常意义的四舍五入有点差别,
          跟VB一样,这里是遵循“四舍六入、五取偶”的方式,也称为“四舍六入,逢五奇进偶舍”,即当进位的下一位为5时,则统一向偶数靠拢。
          比如说2.5,取整则为2(舍),3.5取整为4(进),所以上面的两个Cells会相差两个单元格,VBA里的Round()函数也是遵循这一规则,跟Excel
         函数Round()也是有区别的……大家注意。

   3.3  Range.Range、Range.Cells等的理解。
          上面的第一个Range指的是一块区域,我们可以称为“母对象”,第二个Range指的是一块区域里的第几个单元格,可以理解为“子对象”;
         我们日常用的Range、Cells其实也有一个母对象,那就是“全部单元格”,如果这个理解了,那上面的也就比较容易掌握。
         如Range("B2:B5").Range("A2"),就是指B2:B5单元格区域里第1列,第2行的那个单元格,即(B3);

P.S:
    这种单元格表达方式比较不常用,因为计算方法也比较复杂,所以较少用得上,即使是区域循环,也会用For Each in ... Next 来解决,
    因此,大家理解及了解有这种表达方式即可。:DDD

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-2-21 16:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如果行跟列都是变量的话,range 是不是就应该这样写了啊?
range( i & j )

TA的精华主题

TA的得分主题

发表于 2018-2-21 17:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wyft5t5 发表于 2018-2-21 16:56
如果行跟列都是变量的话,range 是不是就应该这样写了啊?
range( i & j )

错。Range通常用于区域 ,如Range("A1:B2").一个单元格是一和特殊区域。区域的表示法中间有一个冒号。因此用变量的话就要写成Range("A" & H & ":" & "B: & i")。变量不可用引号引起来,其它字符要用引号引起来,中间用连接符。

TA的精华主题

TA的得分主题

发表于 2018-2-21 21:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
range("A"& i )

TA的精华主题

TA的得分主题

发表于 2018-2-21 21:01 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-27 22:24 , Processed in 0.034985 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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