积硅步,行千里
分类: WINDOWS
2010-12-21 17:15:51
Excel中的
两种单元格引用方式
可能有许多用户并不是特别清楚,在Excel中,有两种单元格引用方式:A1和R1C1。前者称之为相对引用,后者称之为绝对引用。在Excel2003中,我们可以在菜单“工具-选项-常规”中进行单元格引用方式切换,如下图:
在Excel2007中,单击主窗体左上角的Office图标,选择“Excel选项”,在弹出的对话框中选择“公式”选项卡,里面有对单元格引用方式的切换,如下图:
在VBA中,我们可以通过下面的代码进行单元格引用方式的切换:
Application.RefrenceStyle = xlA1 or xlR1C1
举一个简单的例子来说明一下绝对引用和相对引用的区别。
1.在相对引用模式下(即A1模式),在单元格A1中输入公式Sum($B1,$C1),然后复制该单元格,粘贴到单元格F8,你会看到公式也被复制到了单元格F8,并且公式变为Sum($B8,$C8)。
2.在绝对引用模式下(即R1C1模式),在单元格R1C1(即相对引用模式下的A1单元格)中输入公式Sum(R1C2,R1C3),然后将该单元格复制到单元格R8C6(即相对引用模式下的F8单元格),你会看到公式不变。
以上是这两种单元格引用方式最直观的区别,也就是说,当单元格的引用位置发生变化时公式也发生了相应的变化,这种方式被称之为相对引用;相应的,当单元格的引用位置发生变化时公式不会随之发生变化,这种方式被称之为绝对引用。我不知道这样说明读者是否已经清楚了这两种单元格引用方式之间的区别,稍后我会介绍这两种方式在编程方面各自的好处。
事实上,Excel已经标识出了这两种引用方式在单元格地址上的细微区别了。查看Excel的“名称框”,你会看到相对引用模式下的单元格地址类似于A1这种方式,它用字母标识单元格的列,用数字标识单元格的行;绝对引用模式下的单元格地址类似于R1C1这种方式,它用R表示行,C表示列,数字作为行或列的下标,从1开始,如R4C3表示C4。它们在Excel2003和Excel2007中的使用方式和位置都相同,为了以示区别,下图我分别给出了在Excel2007和Excel2003中的截图。
有一点需要说明,那就是在同一时刻只能使用两种单元格引用方式中的一种,通过菜单切换引用方式时你可能不会觉得有什么问题,关键是在通过VBA代码进行单元格引用时,你必须记住当前是在哪种引用方式下操作单元格,否则Excel将抛出异常!当需要进行单元格引用方式切换时,你可以通过上面的那行代码进行切换,然后还可以再切换回来。
在相对引用模式下,你需要通过改变字母和数字来引用不同的单元格;但在绝对引用模式下,你只需要改变数字就可以引用另外的单元格,如你想在第四行第一列处引用第一行第一列的单元格,引用方式为R[-3]C1,通过改变数字来达到模拟单元格的相对引用。感觉有点乱吧?其实一点都不难,这只是两种单元格引用方式而已,没有什么很特别的,只是我们经常都使用A1这种方式来引用单元格,对R1C1这种方式用得少而已,习惯就好了。
单元格的命名
Excel的“名称框”除了显示当前引用模式下单元格的地址外,还允许我们给单元格或单元格区域进行命名。选中一个单元格或单元格区域,在地址栏中直接输入一个名字,就完成了命名操作。在Excel2003中,我们还可以通过“插入-名称-定义”,在弹出的对话框中对单元格或单元格区域进行命名,Excel2007中该功能在“公式”选项卡中可以找到。经过命名后的单元格或单元格区域可以在代码中直接使用,而不必再去记住它们的相对或绝对地址了。这一点非常好,尤其是在表格非常发杂的情况下。
例如在A1单元格中包含了一个公式,用来计算美元和人民币的汇率换算,这个公式有可能在表格的很多地方被使用到,如果直接使用A1的地址来进行引用,你必须记住A1是用来计算汇率的,如果表格的很多地方都存在着公式,那你还需要记住很多的地址来表示各种不同的公式,而且当单元格引用模式发生变化时,你还要使用不同的方式来进行引用,这就很麻烦了。直接给这些包含公式的单元格命名,在要使用它们的地方用名称来引用,就可以省去很多的麻烦。
下表列出了各种不同单元格引用方式之间的区别:
示例 |
引用类型 |
类型 |
说明 |
A1 | Cell | 相对 | A用于标识列,1用于标识行。 |
A1:B3 | Range | 相对 | 从A1到B3的6个单元格。 |
5:5 | Range | 相对 | 第5行。 |
B:B | Range | 相对 | B列。 |
5:7 | Range | 相对 | 5、6、7三行。 |
B:E | Range | 相对 | B、C、D、E四列。 |
A$1$ | Cell | 绝对 | A1单元格。剪切公式到其它的位置将不会改变引用。 |
A$1 | Cell | 混合 | A1单元格。$所标示的列为绝对引用,行为相对引用。 |
R1C1 | Cell | 绝对 | R1表示第一行,C1表示第一列。 |
R1C1:R3C2 | Range | 绝对 | 相当于A1:B3所表示的单元格区域。 |
R | Range | 绝对 | 当前活动单元格所在的行。 |
C | Range | 绝对 | 当前活动单元格所在的列。 |
R[-2]C | Cell | 相对 | 当前活动单元格向上两个单元格的位置。 |
R[-2]C1 | Cell | 混合 | 行为相对引用,列为绝对引用。 |
R[2]C[3] | Cell | 相对 | 相当于C2单元格。 |
R[-1] | Range | 相对 | 当前活动单元格向上一行。 |
Range或Cell | 绝对 | 命名的单元格或区域。 | |
Sheet1! |
任意 | 任意 | Sheet1用于指示工作表,之后为所在工作表的引用位置。 |
='C:[sample.xls]Sheet1'!$A$1 | Cell | 绝对 | 引入一个外部工作表,并使用其中的单元格引用。 |
='C:[sample.xls]Sheet1'!octroi | Cell | 绝对 | 同上。octroi为所引用的工作表中已命名的单元格或区域。 |
Sheet1:Sheet3!A1:B3 | Cell | 相对 | 引用Sheet1到Sheet3工作表中A1到A3的单元格区域。这种类型的引用被称之为3D引用,可跨多个工作表进行数据汇总计算。 |
"rupee price" | Range | 绝对 | 用户定义的标签,即Excel2003中的公式标签,该功能在Excel2007中被移除了。 |
Getpivotdata function | Range | 绝对 | 数据透视图表功能。 |
决定使用哪种单元格引用方式
在早期的Excel或Spreadsheets产品中几乎都使用了R1C1这种绝对单元格地址引用方式,这种引用方式的缺点就是不直观,从最终用户的角度来看必须经过一个转换才能最终确认所要引用的单元格的位置,如果表格过于复杂,用户根本不清楚地址所表示的单元格在什么位置,这是一件很麻烦的事情,然而对于VBA开发人员来说有时候往往会适得其反,他们在程序中使用这种单元格引用方式操作或遍历单元格时更加顺手,这也是为什么Excel在后来更高的版本中仍然保留了这种单元格引用方式的原因。
为每一个单元格设置一个唯一的“名称”(区别于用户自定义的单元格名称)在后来的Excel版本中有所体现,特别是在Excel2007中,用字母表示列,数字表示行,两者组合表示交叉位置的唯一单元格,这样更加直观,然而在编程操作方面却不是那么灵活。
因此,掌握多种单元格引用方式是很有必要的,你需要考虑在不同的场合使用更加合适的单元格引用方式来更加高效地完成任务!