ExcelHome学院

 找回密码
 入学
白话Excel函数公式 Office易学宝微视频教程合集(Excel+Word+PPT)
笨办法学VBA(从入门到精通) 高效办公必会的Office实战技巧
财务总监的Excel私房课 Excel数据透视表实战秘技
Excel图表神技
查看: 37181|回复: 38

[讨论]Range&Cells的区别及应用

  [复制链接]
发表于 2011-3-3 22:50:12 | 显示全部楼层 |阅读模式
本帖最后由 acecrazy 于 2013-6-3 21:30 编辑

首先,很高兴我们都已经进入学习的状态,通过第一课时视频,我们对VBA、VBE有了初步的了解,而通过第一课时的作业,我们对事件响应、乃至代码,也都有一定的认识。
相信,大家或多或少有接触到帖子标题所说的两个Applicaion属性,也就是Range和Cells。而这两个属性,将会跟我们的初级课程甚至是VBA内容息息相关……

希望这里的思考题或者讨论题,可以让大家对他们俩认识更深刻……当然,最需要的是大家的积极参与、投入。

言归正传,不管对RangeCells是有接触过还是没有,但其重要性是不容置疑的,所以希望大家先认真查阅并理解这两个属性的相关帮助说明
然后独立思考、测试、证明下面思考题的内容,并跟帖说明你的结论。

P.S:
   借用今天在阿强助教那看到的警句名言,再啰嗦两句,:loveliness:
  『帮助文件或相关的资料,自己想办法找,因为不会主动学习的不是好学生,而且寻找的过程也是学习的过程。     
---------------------------------------------------
思考讨论题:[视回复结果奖励10~50登攀不等]
开帖时间:   2011-3-10    20:00

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
   


[ 本帖最后由 zzmxy 于 2011-5-24 09:18 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2011-3-4 09:08:44 | 显示全部楼层
占楼编辑~~~:victory:
------------------------------------------

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()的偏移量是按增量,容易计算。

2011-3-8 13-55-55.jpg

   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

4. 『附加题』什么时候可以省略.Value,什么时候不可以呢?
     很多人都说,其实.Value是Range的默认属性,所以可以省略,但当我们有时候省略时,又会出错,这是怎么一回事呢?

      可以这么说,即使Range的默认属性是.Value,当我们没有明确指定时,编译时就需要进行“自动类型适应”的过程,如果过程进行不下去,
      就会有错误发生,
如:  i = Range("A1")    或   Range("A1") = 256,因为有一种“默认”及“适应”性,所以不会把A1的 Address属性 ($A$1) 赋给 i ,
      也不会把256 赋给A1的Height属性,而是赋给了.Value。

      
      下面说说无法适应的问题,比如说,我们A1单元格存储了另外一个工作表的名称,假设为“工作表2”,也就是说Range("A1") = "工作表2",
      我们现在想删除A1单元格所指定的工作表,用 Sheets(Range("A1")).Delete 会怎么样呢?
      答案是:会报错——“运行错误'13',类型不匹配”但稍作修改,比如说将A1单元格的内容修改为2,那么仍然是用Sheets(Range("A1")).Delete这代码,
      运行后会怎么样呢?答案是:不会出错。
      那么,A1仍然是“工作表2”,而是将代码改为Sheets(CStr(Range("A1"))).Delete,结果又怎么样呢?答案是:正常运行!
      这说明什么问题呢?
      首先,Sheets()指的是某个对象,括号里可以用数字、也可以用文本作为参数来表示某个工作表,从上面不难看出来,其默认处理方式是数值格式,也就是
      表示工作表的序号,当我们使用“工作表2”这个文本想进入其默认处理方式时,就会存在无法匹配的问题,因此报错,而当我们用Cstr()函数,将A1的值,
      强制转换为文本类型然后再提供给Sheets(),这时候就是让其接受文本值,也理所当然会按工作表名来接收,所以顺利进行。

     终上所述:
     当我们不知道赋值号(=)左右两边对象默认的数据处理类型时,我们就必须明确指定,不然会出现类型无法匹配的错误。
     最较常见也最容易犯错的,就是我们区域向区域传值时,如Range("A1:A10") = Range("B1:B10").Value,后面的这个Value是必须使用的。
     大家可以测试一下左右加上与不加的各种结果……【待續...】


回复 支持 1 反对 0

使用道具 举报

发表于 2011-3-4 19:23:43 | 显示全部楼层
Z班主任是我见过的最负责,最大公无私,最具有侠义情怀的人:victory:
1.  For i = 1 to  10
        range("b" & i)=i   ' 或者cells[i,2]=i
      Next
Range()的表达正确!Cells()的思路是对的,但括号用错了……:DDD     +5  
                                        ------------------By 小Z


2. Range和Cells都能表达单元格的位置,那么,为什么要设置两个不同的属性及表达方式呢?对二者你有什么看法?
Range("B" & j )循环后,是B1、B2、B3、B4,如果想变成B2、C2、D2、E2~~(即第二行的值),就要用到cells了。也就是说,range只能行循环,cells可以行循环也可以列循环
嗯,说得好!在列标为变量时,Range()对此支持不够(灵活),希望会有更多的认识……+3
                                 ------------------By 小Z


3. 请测试下面代码所指的单元格分别是哪个,你有发现其中的规律吗?或者,你知道当中的取向规则吗?有的话,请简要阐述一下。
Range("C4")(2,3)  ):从C4单元格开始,第二行第三列所指的单元格
Range("C5")(-2,1) ):从C5单元格开始上面二行,第一列所指的单元格
Cells(2,3)(2.5):从C2单元格开始第3行所指的单元格,即C4  
Cells(2,3)(3.5)  :从C2单元格开始第4行所指的单元格,即C5  
Range("A1:A5").Item(2):A1:A5区域第二个单元格,即A2
Range("B2:B5").Range("A2"):B2:B5区域第二行单元格,即B3
后面()内数字为前面单元格/区域相对位置值,如果()有数字,表示从前面单元格开始第几行第几列所指单元格,如果后半部分是range(“单元格”),此处的单元格是相对前面区域而言的。
具体单元格位置只有后面三个是正确的,前面三个均错误……(详细偏移规则请参考二楼讲解)。 Range().Range()的理解正确!!  +3+2
                                             ------------------By 小Z

4.    Range("A1") = 3.14159    [A1]= 3.14159  CELLS(1,1) = 3.14159都可以省略value
如果父变量里面有usedrange,后面的属性必须使用value,否则不会报错,但是结果会不正确
对这个的理解比较片面,但也算是一个实例……+3
                                             ------------------By 小Z


[ 本帖最后由 zzmxy 于 2011-3-10 20:23 编辑 ]

评分

参与人数 1登攀 +16 收起 理由
zzmxy + 16 不错,继续努力……

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-5 17:05:17 | 显示全部楼层
1. 解答
方法1
For i=1 to 10
  Range("B" & i)=i
Next i

方法2
For i=1 to 10
  Cells(i,2)=i
Next i
两种方法均正确!!…………  +6
                                             ------------------By 小Z

2.解答
range 和 cells 都可以返回一个区域。二者还可以结合,比如range(cells(1,3), cells(2,5))
我比较习惯用cells,如(1)中,cells(i,2)可以很方便地写出循环,写程序比较容易。我一般写程序时,先将行列改为R1C1显示,以方便写cells(i,j)
Cells在单独使用时可以表示一个区域(≥2个单元格)吗?对循环(即行、列为变量时)的理解很恰当……  +3
                                             ------------------By 小Z

3.
Range("C4")(2,3)  返回 E5; 相当于是Range("C4").cells(2,3)  经测试,返回结果也是E5. Cells(2,3)是相对于C4的坐标,即平移坐标,将C4视作A1,从而得出cells(2,3)在原坐标系即为E5。
Range("C5")(-2,1) 返回 C2,道理同上。C5为A1,行号是1, 1到-2(差3),即同一列上移3格
Cells(2,3)(2.5) 返回 C3
Cells(2,3)(3.5) 返回 C5
Range("A1:A5").item(2) 返回 A2; 返回A1:A5区间的第二项单元格即A2
Range("B2:B5").range(“A2”) 返回 B3, “A2”是相对于B2单元格的相对地址,即为B3
单元格位置均正确!!!!………………  +6
将Range("C4")(2,3)等化为Range("C4").Cells(2,3),这想法很新颖……:handshake        +5
对Range.Range相对位置的理解正确!           +2
                                             ------------------By 小Z

4. 我猜二者区别在于.value的表达限制了"3.1415”这个是数值。而省略的表达,没有说明“3.1415”的类型。:loveliness:
这里的.Value不能理解为Val()函数的那个Value,这里仅仅指的就是“值”,包括数值、文本、货币、日期etc.     +1
                                             ------------------By 小Z


[ 本帖最后由 zzmxy 于 2011-3-10 20:35 编辑 ]

评分

参与人数 1登攀 +23 收起 理由
zzmxy + 23 有经过测试……学习态度相当好!

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-6 15:41:56 | 显示全部楼层
一.Range("B" & i) = i
Range("B1").Offset(i - 1, 0) = i
Range("B1")(i) = i
Range("B1").Item(i) = i
Range(“B1”).range(“A”&i)=i
Cells(i, 2) = I       Cells(i, "b") = i
Cells(1, 2).Offset(i - 1) = I  Cells(1, “b”).Offset(i - 1) = I
Cells((i - 1) * 256 + 2) = i
Cells(1, 2)(i) = I                        Cells(1, “b”)(i) = I
Cells(1, 2).Item(i) = I                Cells(1, “b”).Item(i) = i
Cells.Item(i, "B") = i                Cells.Item(i, 2) = i
[b1].Offset(i - 1) = i
[b1].Item(i) = i
Intersect(Rows(i), Columns(2)) = I        Intersect(Rows(i), Columns(B)) = I

你这题的答案相当壮观啊……出乎我的意料,呵呵!!不过,确实常用的也就那几种,其它的表示方式虽然正确,但基本上不用……  +10
                                             ------------------By 小Z


二.CELLS(y,x)是单个单元格对像,两个参数分别为行和列;它在变量表示上比较方便
Range()则是指一个区域,区域中可以是一个单元格,也可以是多个单元格
二者的本质特点说得相当正确!!……+8
                                             ------------------By 小Z


三.Range(“C4”)(x,y)表示C4单元格的行向下(x-1>0时)移动x-1行、向上(x-1<0时)移动x-1行、不动(x-1=0时), C4单元格的列向右(y-1>0时)移动y-1列、向左(y-1<0时)移动y-1列、不动(y-1=0时)
Range(”A1:A5”).item(X)表示在选中区域的的排在第X的单元格
        提问:Range("A2")(6).Select 和Range("A2:A10")(6).Select 都是选中A7单元格,这两种写法有区别吗?
偏移量的计算公式,(x-1)总结得相当好……把原点是(1,1)的特征基本上掌握到了!……+10

回答:二者没有区别,都是用了Range()的Item属性……可参考二楼的见解,Item返回的值=Cells()返回的值……
                                             ------------------By 小Z


四.示例在 Sheet1 上的单元格区域 A1:D10 中进行循环。如果这些单元格中的某个值小于 0.001,则将其值替换为 0(零)。
For Each c in Worksheets("Sheet1").Range("A1:D10")
    If c.Value < 0.001 Then
        c.Value = 0
    End If
Next c
第二个.Value就不能省略,省略的话,不会报错,但是结果不正确。
不是很理解,网上查到的,充数一下,望老师充分解释,谢谢
相当好的例子…………+8
由于c是Range对象,当这种对象是变量时,就必须加上.Value,不然必然会出现“类型匹配错误”!来不及写在二楼,想不到你这有!:handshake
                                             ------------------By 小Z


[ 本帖最后由 zzmxy 于 2011-3-10 22:41 编辑 ]

评分

参与人数 1登攀 +41 收起 理由
zzmxy + 41 完成得相当好……优秀+5

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-6 21:51:30 | 显示全部楼层

不是答案,是以前写的小结。

Range引用来选取单元格
1、Range引用单元格方式1:Range("单元格地址")
例如:Range("A1"):表示单元格A1,注意:单元格地址要加双引号
值得注意的是:双引号的输入必须是在半角状态下输入的,否则会出现错误。
2、Range引用单元格方式2:Range("单元格区域")
例如:Range("A1:D10").Select
Range()还有一种Range(Cells(),Cells())的对角线表达方式,也有交叉的表达法,反正多种多样……:DDD

                                                  -------------------By 小Z

以下的这些通过索引号作为参数的引用,都是比较陌生的。
比如以下这个小例子:
例子1:Range("B2:E6")(1).Select
注释:该例子代表了选取B2:E6区域中的第一个单元格的,即选取B2
例子2: Range("B2:E6")(3).Select
注:该例子代表选取B2:E6区域中的第三个单元格,即D2,而单元格的区域的读取一般是从左到右,然后再从上到下进行读取 的,故该区域的前3个单元格分别是B2、C2、D2,而第3个单元格就是为D2
例子3:  Range("B2:E6")(3.5).Select
注:当里面的索引号为小数时,excel会对其进行四舍五入,比如例子3中的3.5,excel会把它转换为4,故例子3 中的代表是B2:E6区域的第4个单元格选取,即选取E2
例子4:Range("B2:E6")(1, 4).Select
注:在例子4中,Range("单元格区域")(行号,列号),所代表的是选取该单元格区域中第几行与第几列交叉的那个单元 格,而例子5中代表是选取B2:E6区域中的第1行第4列的单元格,在该区域中,所符合条件的单元格为E2。
值得关注的是,(行号,列号)里面的参数可以使用0或者负数。
当行号的参数为0的时候,则向该区域的左上角单元格向上偏移一个单位,当列号为0时候,则向该区域左上角单元格向左偏移一个单位;如果参数是负数的时候, 在原来的基础上追加偏移量。
具体请看例子5、6:
例5  :  Range("B2:E6")(0, 0).Select
例子5中是选取了A1单元格,即B2:E6区域左上角单元格B2分别向上偏移一行,向左偏移一列,所得到的单元格为A1
例子6:   Range("C3:E6")(-1, -1).Select
例子6中代表了C3:E6区域的左上角单元格C3分别向上偏移两行,向左偏移两列,所得到的单元格为A1
Range("列标" & 行数)的单元格引用方式:
例子7:  Range("B" & 10).Select
从这个最简单的例子,一个最常见的单元格引用方式。注意:列标需要加上双引号,并且要用到"&"把列标和行号连接 起来。
经常用到的一个例子:往A1:A100里面分别填充1到100等这100个数字
1.                              Sub a()
2.                                 Dim i As Integer
3.                                 For i = 1 To 100
4.                                      Range("A" & i) = i
5.                                 Next i
6.                              End Sub
从中可以看到这种单元格方式引用的作用
Cells引用单元格
1、Cells(行数,列数)
请看下面例子: Cells(1, 2).Select
该例子表明选取B1单元格
2、Cellls(行数,列标)
请看例子:Cells(2, "B").Select
该例子中表明选取B2 单元格,但该方法引用单元格永远只能引用一个,并且不能引用区
3、Range.cells(横坐标,纵坐标)
这种方式引用单元格是以其父对象Range左上角单元格作为参照系,向下累加的坐标系数来指定单元格。
请看下例:Range("B2:F10").Cells(2, 2).Select
该代码表示B2:F10单元格中横坐标为2、纵坐标为2的单元格C3,该参照是以B2为基准的。
另外,cells里面可以使用小数,不过VBA会对其进行四舍五入再计算,
具体看下例: Range("B2:F10").Cells(3.8, 3.4).Select
该代码表示B2:F10单元格中横坐标为4、纵坐标为3的单元格D5。
4、Range.cells(索引号)
当使用单个索引号作为参数时,它表示父对象中的一个索引子集。其编号方式是先行后列、先左后右。
请看下例: Range("B2:F10").Cells(3).Select
该例子表示B2:F10区域中第3个单元格D2。
这种方式比较少见,也比较少用。
Vaue属性和Text属性。
TEXT返回的的是单元格中显示的内容,也就是你看到的是什么就显示什么,比如,A1=2002.111,你使用了单元格格式,只显示一位小数,那么显示的就是2002.1,而单元格的值并不会因此而改变,仍是2002.111,所以Value、Value2都会是2002.111。而TEXT是你所看到的2002.1
至于Value2,一般只对日期格式有用。如果你在单元格A2中,输入37257,然后将A2单元格设置为日期格式,则显示的将是2002-1-1,为了区别,这时Value 也会是2002-1-1,而Value2将是375257,TEXT也是你所看到的2002-1-1。(如果你输的数字是60以前的数,)Value和Text出来的日期会差一天。Value的结果比显示出来的要小一天。)
非常感谢么尤的客串讲解,相当详细&详尽……:handshake
Value2属性与 Value 属性的唯一区别是:Value2 属性不使用(不支持) Currency 和 Date 数据类型

也就是说,单元格内如果存储的是这两种类型的数据,那么都将只取用内部表示的数值,而不会有$、¥或年/月/日格式!


                                                  -------------------By 小Z


[ 本帖最后由 zzmxy 于 2011-3-10 22:58 编辑 ]

评分

参与人数 1登攀 +30 收起 理由
zzmxy + 30 感谢支持……

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-7 16:31:27 | 显示全部楼层
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

答:1。Range("B" & i)
2。Cells(i,2)         
3。ActivCell.Offset(0,i)  
前两种表达方式均正确,第三种使用ActiveCell时,必须要有特定的前提,希望你明白…………+6

                                          
   --------------------By 小Z



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


答:range译成中文是“集合”的意思,其最基本用途是可以选择一个矩形区域,如

range("a1:C5")表示a1单元格至C5单元格的区域,有时也采用range("C1")选取一个单元格而非区域,range标识单元格的格式是C(列)1(行);


cells是cell的复数(cell译成中文是“单个”的意思),用途是选择一个单元格,如

cells(2,3)表示第二行第三列这个单元格,其参数中用半角逗号来分割行号和列号,比range多了个逗号,并且行、列的先后顺序相反了。

我觉得两者各有长处,如果有变量需要循环判断,用Cells相对比较简单,但是有时候固定区域的,命名后用Range更灵活。

从灵活性来讲, RANGE 要强多了, 而且使用时可以通过提取符快速读取它的属性和方法。另外,对于可变更的工作表, 用 RANGE 来操作命名区域将增加程序的弹性。比如工作中插入一行/列,VBA 中用 CELL 就可能导致运行操作错误, 而 RANGE(srArea) 作为指定区域,可适应单元格的这类变更。
Range翻译成“集合”不太妥当,但对二者的根本区别,有足够的认识!!…………+8
Range只能说适用性更广,不能说灵活性比Cells强,尤其是在处理行、列变量时!……+2

                                          
   --------------------By 小Z


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")

答:经过测试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

综上:
range标识单元格的格式是(列,行);
CELLS标识单元格的格式是(行,列);
后面跟着的是偏移量如:
Range("C4")(2,3)=E5       'C4为基点,本身为1,向下2行得到C5,向右3列得到E5;
Range("C5")(-2,1)=C2     'C5为基点,本身为1,向上4行(1>0>-1>-2)得到C2,向右1列(不偏移)得到C2;
列为正向下,负向上,行为正向右负向左;

其它的都是将后面的转化为偏移量,如A2等于2,然后在区域内产生偏移;
-
第一个讲解里,“C4为基点,本身为1,向下2行得到C5”,这里讲述不太准确,只是向下一行而已!:lol
但坐标的基本方式掌握是正确的………………+10

                                          
   --------------------By 小Z

---------
附加题:
4. 在对单元格赋值(输入)时,如我们要在A1单元格输入3.14159,下面两种代码的写法都可以达到同样的结果,
    那么,你了解什么情况下可以省略.Value,什么时候却一定不可以呢,有的话试举例子?
   代码1:Range("A1") = 3.14159
   代码2:Range("A1").Value = 3.14159


答:Value是代表单元格的值,一般可以省略,但省略后计算速度没有加上快,而且也并不是一定可以省略
例如:第一个是赋给单元格显示的文本,.Value为单元格真正的值,如A1=3.14159,自定义数字格式:0.00,单元格显示3.14,则Range("A1")=3.14,Range("A1").Value=3.14159

速度方面理论上是快了,但下面的例子不知道有没有论证过,这二者并非“文本”或“数值”的关系,所以你的结论是错误的!…………+1

                                          
   --------------------By 小Z


[ 本帖最后由 zzmxy 于 2011-3-10 23:39 编辑 ]

评分

参与人数 1登攀 +27 收起 理由
zzmxy + 27 完成得很好……

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-8 10:40:30 | 显示全部楼层
第一问,只会两种写法:
一是:Range("b" & i)     二是:Cells(i, 2)
表达方式正确!!……………….     +6
                                             ------------------By 小Z

第二问,不会
第三问,后面()里的数值-1,之后的数字分别为前一个单元格向下,向右的偏移数,相当于OFFSET.如果为小数,则取整数。
规律寻找正确!!以指定单元格为(1,1)原点进行偏移!……………….     +5
                                             ------------------By 小Z

第四问,不会,期待老师释疑!

另外两题请参考二楼讲解…………………….     
                                             ------------------By 小Z


[ 本帖最后由 zzmxy 于 2011-3-10 22:47 编辑 ]

评分

参与人数 1登攀 +11 收起 理由
zzmxy + 11 再接再励哦……

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-9 15:47:37 | 显示全部楼层
1、  Sub tttt1()
     Dim i As Integer
     For i = 1 To 10
              Cells(i, 2) = i
          Next
    End Sub
   
    Sub tttt2()
     Dim i As Integer
     For i = 1 To 10
              Range("b" & i) = i
          Next
    End Sub
   
    Sub tttt3()
     Dim i As Integer
     For i = 1 To 10
              Cells(i, "a").Offset(, 1) = i
          Next
    End Sub
第一、第二种表达方式都非常正确!…………………………+6
第三种表达方式有点牵强,因为Offset()在这里没有起到任何作用,像鸡肋……纯粹是方法一的绕弯路写法……:DDD

如果要使用Offset(),那么可以这样写:Cells(1,2).Offset(i-1,),把i 赋给Offset()才有意义……呵呵!      


                                                --------------------By 小Z

2、用途不同:
range可以同时在不同范围内使用,cells则不行;
cells在列循环时比range方便!

比如:range(cells(1,2),cells(1,"c"), ...)
CELLS(i,j)运行比RANGE(J & I)方便
不太明白“Range可以同时在不同范围内使用”的意思,是指区域吗?呵呵……
有体会到Cells()在变量中的灵活性……………………+3

                                                --------------------By 小Z


3. 请测试下面代码所指的单元格分别是哪个,你有发现其中的规律吗?或者,你知道当中的取向规则吗?有的话,请简要阐述一下。
   ① Range("C4")(2,3)  :F6          ② Range("C5")(-2,1)  :D3                   ③   Cells(2,3)(2,5)  : H4         ④   Cells(2,3)(3,5)   :H5  
   ⑤ Range("A1:A5").Item(2) :A2       ⑥ Range("B2:B5").Range("A2")  :B3(B2:B5的第二项)
前面四种表达方式均偏移错误,后面两种情况正确!…… +2
Range().Range()的相对位置理解正确!…………………………+2
                                                --------------------By 小Z


4、这种情况见到过,不过不记得了,如果没有VALUE值的时候会出错

[ 本帖最后由 zzmxy 于 2011-3-10 23:15 编辑 ]

评分

参与人数 1登攀 +13 收起 理由
zzmxy + 13 再接再励……

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2011-3-10 18:28:42 | 显示全部楼层
第一题:
1、Sub demo1()
           For i = 1 To 10
               Range("B" & i) = i
           Next
      End Sub
2、Sub demo2()
           For i = 1 To 10
               Cells(i, 2) = i
           Next
       End Sub
3、Sub demo3()
            For i = 1 To 10
                 Cells(i, "B") = i
            Next
       End Sub
表达方式均正确…………+6

                                             --------------------By 小Z


第二题:
range代表某一单元格、某一行、某一列、某一选定单元格区域(该选定区域可包含一个或多个连续单元格块),cells仅代表某一个单元格。从使用上来说,range的使用范围比cells大,比如插入列/行,使用cells可能会导致运行错误。
Range与Cells的本质区别认识很到位……+8
                                          
   --------------------By 小Z


第三题:
通过代码:
         Sub   cs()


                   Msgbox *.adress(*
代表需要测试的内容)

         Enb sub
进行测试,测试结果如下:
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

规律:
第①②是对第一个括号内的单元格进行偏移,有点类似于offset函数;
第③④是按照0.5的规律进行行的偏移,未进行列的偏移;
第⑤⑥是对第一个括号内的区域中选择单元格。

测试方法相当科学,结果正确!……用Debug.Print会更好,方便查看运行的Print结果。………+8
规律基本上正确……可以细剖就更好!………………+2
                                             --------------------By 小Z

第四题:
当3.14159作为文本赋值的时候可能要加上value,如果作为数值赋值的时候,加与不加效果是一样的。猜测的,:lol
这个跟3.14159到底是“文本”或“数值”没有关系……请参考二楼讲解!
                                             --------------------By 小Z



[ 本帖最后由 zzmxy 于 2011-3-10 23:27 编辑 ]

评分

参与人数 1登攀 +24 收起 理由
zzmxy + 24 完成得很好……

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 入学

本版积分规则

小黑屋|手机版|ExcelHome ( 沪ICP备11019229号-2 )

GMT+8, 2024-3-19 10:01 , Processed in 0.055442 second(s), 23 queries .

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

   

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

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

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