Excel中的单元格引用
Excel中的工作表(Worksheet)是由一系列行和列组成的二维表,当我们在使用Excel创建应用程序(例如编写VBA代码),或者创建一个复杂的Excel应用(例如公式、数据透视表、统计图表等)时,需要引用独立的Excel单元格(称之为Cell)或单元格区域(称之为Range),详细了解各种不同单元格或单元格区域的引用和设置方式是非常重要的,这将有助于改善我们的操作习惯或编程方式,从而提高工作效率。
两种单元格引用方式
可能有许多用户并不是特别清楚,在Excel中,有两种单元格引用方式:A1和R1C1。前者称之为相对引用,后者称之为绝对引用。在Excel2003中,我们可以在菜单“工具-选项-常规”中进行单元格引用方式切换,如下图:
在Excel2007中,单击主窗体左上角的Office图标,选择“Excel选项”,在弹出的对话框中选择“公式”选项卡,里面有对单元格引用方式的切换,如下图:
在VBA中,我们可以通过下面的代码进行单元格引用方式的切换:
举一个简单的例子来说明一下绝对引用和相对引用的区别。
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 | 相对 | 当前活动单元格向上一行。 |
<defined name> | Range或Cell | 绝对 | 命名的单元格或区域。 |
Sheet1!<reference> | 任意 | 任意 | 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中,用字母表示列,数字表示行,两者组合表示交叉位置的唯一单元格,这样更加直观,然而在编程操作方面却不是那么灵活。
因此,掌握多种单元格引用方式是很有必要的,你需要考虑在不同的场合使用更加合适的单元格引用方式来更加高效地完成任务!
在Excel中使用标签
标签的使用在Excel中已经有一段时间了,然而很多用户对这一功能并不是特别清楚,其实它是对单元格名称定义功能的一个扩展,在很多情况下,我们完全可以通过定义一个名称来达到标签所完成的功能。在Excel中,标签的功能默认是关闭的,我们需要手动打开它。在Excel2003中的“工具-选项-重新计算”选项卡中,选中“接受公式标志”复选框即可打开标签功能,如下图。
遗憾的是我没能在Excel2007中找到此功能,Google了一下,发现很多网友提出最新版本的Excel中已经将此功能移除了。也许微软觉得这个功能是一个鸡肋,为了减少软件中功能的重复性,在重构Excel时去掉了这个功能吧。不过也没有关系,读者可以作为一个了解,但是要想尝试就只能在Excel2003中了。
标签的使用是这样的。我们在公式中引入了一个自定义的名称,但是该名称并没有在工作表的任意一个位置定义,不过存在包含该值的单元格,那么Excel认为这个公式使用了包含该值的单元格,并且从该单元格开始有一个相对连续的区域存在,公式计算的范围就是这个相对连续的区域。这样定义读者肯定不会特别清楚,我这里正好有一篇文章详细介绍了该功能,读者可以去看一下,不过是英文的,但是有截图,也不难,一看就明白。
http://spreadsheets.about.com/od/excelfunctions/ss/labels_function.htm
Excel2007中我们也可以通过定义名称来实现标签的功能,读者可以自己去尝试一下。
Excel中的多用户编辑功能
本文的标题是Excel中的单元格引用,本来没打算说有关Excel权限方面的问题的,但是谈到单元格引用,这里就简单说一下Excel中的多用户编辑功能吧。多用户编辑功能其实就是Excel中的单元格保护,在Excel2007中,允许设置单元格的部分保护,就是说可以允许部分用户对工作表中的部分单元格就行编辑。在“审阅-更改”菜单中可以看到“允许用户编辑区域”,点击后在弹出的对话框中选择允许用户编辑的区域并设置好密码,如下图:
这里有一个有趣的功能。点击“权限”按钮,在弹出的对话框中可以设置哪些用户不需要密码就可以编辑这些受保护的区域,同时,如果我们勾选“将权限信息粘贴到一个新的工作簿中”复选框,Excel会将我们设置的单元格保护信息导出到一个新的Excel文件中。Excel中的用户权限控制与Windows的用户权限、组、域是绑定在一起的,这也意味着用户可以通过VBA来操作Windows的用户权限管理,当然,涉及到安全方面的问题可能会受到Windows的一些限制,早期版本的Excel中如果存在安全漏洞,非法VBA代码就可以通过这个功能来访问用户的本地信息。有关这方面的话题不是本文的重点,这里就不再详细讨论了。
结语
Excel的功能是很强大的,可以毫无夸张地说,掌握Excel的各种功能,结合VBA编程,我们可以通过Excel来完成几乎所有的功能!这也是我在本系列文章的开篇详细介绍Excel的一个主要原因http://www.cnblogs.com/jaxu/archive/2009/03/29/1424298.html。本文其实主要介绍了Excel中的两种不同的单元格引用方式,以及我们在使用中遇到的一些问题,作为我的《VBA在Excel中的应用》系列文章中所遇到问题的一个补充,读者可以了解一下,有问题随时欢迎评论。