|
本帖最后由 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
查看全部评分
-
|