Table of contents
在本教程中,我们将对Excel宇宙中最神秘的居民之一--OFFSET函数做一些说明。
那么,什么是Excel中的OFFSET呢? 简而言之,OFFSET公式返回对一个区域的引用,该区域与起始单元格或一个单元格区域相差指定的行数和列数。
OFFSET函数可能有点棘手,所以我们先进行简短的技术解释(我会尽力保持简单),然后我们将介绍一些在Excel中使用OFFSET的最有效方法。
Excel OFFSET函数--语法和基本用途
Excel中的OFFSET函数返回一个单元格或单元格区域,它与给定的单元格或区域有一定数量的行和列。
OFFSET函数的语法如下。
OFFSET(reference, rows, cols, [height], [width])前3个参数是必须的,后2个参数是可选的。 所有的参数都可以是对其他单元格的引用或由其他公式返回的结果。
看起来微软在为参数名称赋予一些意义方面做了很好的努力,而且它们确实提示了你应该在每个参数中指定什么。
所需的论据。
- 参考资料 - 你可以把它看成是一个起点。
- 行数 - 从起点开始向上或向下移动的行数。 如果行数是正数,公式会移动到起点参考值以下,如果是负数,则会移动到起点参考值以上。
- Cols - 你希望公式从起点开始移动的列数。 和行一样,cols也可以是正数(在起点参考的右边)或负数(在起点参考的左边)。
可选参数。
- 高度 - 要返回的行数。
- 宽度 - 要返回的列的数量。
高度和宽度参数必须始终是正数。 如果省略其中一个,它默认为高度或宽度的 参考 .
注意:OFFSET是一个不稳定的函数,可能会降低工作表的速度,其速度与重新计算的单元格数量成正比。
现在,让我们用一个最简单的OFFSET公式的例子来说明这个理论。
Excel OFFSET公式示例
下面是一个简单的OFFSET公式的例子,它根据你指定的起点、行和列,返回一个单元格引用。
=offset(a1,3,1)
该公式告诉Excel以A1单元格为起点(参考),然后向下移动3行(行参数),向左移动1列(列参数)。 结果,这个OFFSET公式返回B4单元格的值。
左边的图片显示了函数的路线,右边的截图演示了如何在现实生活中的数据上使用OFFSET公式。 两个公式之间唯一的区别是,第二个公式(右边)在行参数中包括一个单元格引用(E1)。 但由于单元格E1包含数字3,而第一个公式的行参数中出现的数字完全相同。两者都会返回一个相同的结果--B4中的值。
Excel OFFSET公式--需要记住的事情
- OFFSET函数在Excel中实际上并不移动任何单元格或区域,它只是返回一个引用。
- 当OFFSET公式返回一个单元格区域时,rows和cols参数总是指返回范围内的左上角单元格。
- 引用参数必须包括一个单元格或相邻单元格的范围,否则你的公式将返回#VALUE!错误。
- 如果指定的行和/或列在电子表格的边缘上移动参考,你的Excel OFFSET公式将返回#REF!错误。
- OFFSET函数可以在任何其他Excel函数中使用,这些函数在其参数中接受一个单元格/区域参考。
例如,如果你试图使用公式 =offset(a1,3,1,1,3)
单独使用,会产生#VALUE!错误,因为要返回的范围(1行,3列)不适合在一个单元格中使用。 但是,如果你把它嵌入SUM函数中,像这样。
=sum(offset(a1,3,1,1,3))
该公式将返回1行3列范围内的数值之和,该范围在A1单元格下面3行,右边1列,即B4:D4单元格中数值的总和。
为什么要在Excel中使用OFFSET?
现在你知道了OFFSET函数的作用,你可能会问自己 "为什么要用它?"为什么不简单地写一个像B4:D4这样的直接引用?
Excel的OFFSET公式非常好用。
创建动态范围 : 像B1:C4这样的引用是静态的,意味着它们总是指代一个给定的范围。 但有些任务用动态范围更容易执行。 当你处理不断变化的数据时尤其如此,例如,你有一个工作表,每周增加一个新的行或列。
从起始单元格获取范围 在这种情况下,在Excel中使用OFFSET是正确的做法。
如何在Excel中使用OFFSET函数--公式实例
我希望你没有对这么多的理论感到厌烦。 无论如何,现在我们进入了最令人兴奋的部分--OFFSET函数的实际应用。
Excel的OFFSET和SUM函数
我们刚才讨论的例子演示了OFFSET&SUM的最简单用法。 现在,让我们从另一个角度来看这些函数,看看它们还能做什么。
例1.一个动态的SUM/OFFSET公式
在处理连续更新的工作表时,你可能希望有一个SUM公式,自动挑选所有新添加的行。
假设你有类似下面截图中的源数据,每个月都会在SUM公式上方添加新行,你自然希望将其包含在总数中。 总的来说,有两个选择--要么每次手动更新SUM公式中的范围,要么让OFFSET公式为你做这个。
由于要求和的区域的第一个单元格将直接在SUM公式中指定,你只需决定Excel OFFSET函数的参数,它将获得该区域的最后一个单元格。
参考资料
- 含有总数的单元格,在我们的例子中是B9。行数
- 总数上方的单元格,这需要负数-1。Cols
- 它是0,因为你不想改变这一栏。
因此,这里有一个SUM / OFFSET公式模式。
=SUM( 第一单元 :(OFFSET( 细胞与总 , -1,0)对上述例子进行了调整,公式如下。
=sum(b2:(offset(b9, -1, 0))
正如下面的截图所显示的那样,它的工作是完美无缺的。
例2.Excel OFFSET公式对最后N行求和
在上面的例子中,假设你想知道过去N个月的奖金数额,而不是总数。 你还想让这个公式自动包括你添加到工作表中的任何新行。
对于这项任务,我们要将Excel的OFFSET与SUM和COUNT/COUNTA函数结合使用。
=sum(offset(b1,count(b:b)-e1+1,0,e1,1))
或
=sum(offset(b1,counta(b:b)-e1,0,e1,1))
下面的细节可以帮助你更好地理解这些公式。
参考资料
- 你想求和的那一列的标题,本例中的B1单元格。行数
- 来计算要抵消的行数,你可以使用COUNT或COUNTA函数。COUNT返回B列中包含数字的单元格数量,从中减去过去的N个月(数字是单元格E1),然后加1。
如果COUNTA是你选择的函数,你不需要加1,因为这个函数计算所有非空的单元格,而带有文本值的标题行会增加一个额外的单元格,这是我们的公式所需要的。 请注意,这个公式只在类似的表格结构上能正常工作--一个标题行,然后是带有数字的行。 对于不同的表格布局,你可能需要在下面做一些调整OFFSET/COUNTA公式。
Cols
- 的偏移列数为零(0)。高度
- 要求和的行数在E1中指定。宽度
- 1列。
使用OFFSET函数与AVERAGE、MAX、MIN搭配使用
与我们计算过去N个月的奖金的方式相同,你可以得到过去N天、周或年的平均数,也可以找到它们的最大值或最小值。 公式之间的唯一区别是第一个函数的名称。
=average(offset(b1,count(b:b)-e1+1,0,e1,1))
=max(offset(b1,count(b:b)-e1+1,0,e1,1))
=min(offset(b1,count(b:b)-e1+1,0,e1,1))
与通常的AVERAGE(B5:B8)或MAX(B5:B8)相比,这些公式的主要好处是,你不必在每次源表被更新时更新公式。 无论你的工作表中增加或删除多少新行,OFFSET公式将始终参考该列中最后(最下)单元格的指定数量。
用Excel OFFSET公式创建动态范围
与COUNTA结合使用,OFFSET函数可以帮助你建立一个动态范围,这在许多情况下可能被证明是有用的,例如,创建可自动更新的下拉列表。
动态范围的OFFSET公式如下。
=OFFSET(Sheet_Name! $A$1, 0, 0, COUNTA(Sheet_Name! $A:$A), 1)
在这个公式的核心部分,你使用COUNTA函数来获得目标列中的非空白单元格的数量。 这个数字会进入OFFSET的高度参数,指示它要返回多少行。
除此以外,它是一个常规的偏移公式,其中。
- 参考资料 是偏移量的起点,例如,Sheet1!$A$1。
- 行数 和
Cols
都是0,因为没有要抵消的列或行。 - 宽度 是1列。
注意:如果你是在当前工作表中建立一个动态范围,就不需要在引用中包括工作表的名称,Excel会在创建命名范围时自动为你做这件事。 否则,一定要包括工作表的名称,后面是感叹号,就像这个公式的例子。
一旦你用上述OFFSET公式创建了一个动态命名的范围,你就可以使用数据验证来制作一个动态下拉列表,一旦你从源列表中添加或删除项目,该列表就会自动更新。
关于在Excel中创建下拉列表的详细步骤指导,请查看以下教程。
- 在Excel中创建下拉列表--静态、动态、来自其他工作簿的下拉列表
- 制作一个依赖性的下拉列表
Excel OFFSET & VLOOKUP
众所周知,简单的垂直和水平查找分别用VLOOKUP或HLOOKUP函数进行。 然而,这些函数有太多的局限性,在更强大和复杂的查找公式中往往会出现障碍。 因此,为了在你的Excel表中执行更复杂的查找,你必须寻找替代品,如INDEX、MATCH和OFFSET。
例1.Excel中左侧Vlookup的OFFSET公式
VLOOKUP函数最臭名昭著的限制之一是无法在其左侧查找,这意味着VLOOKUP只能返回查找列右侧的值。
在我们的示例查找表中,有两列--月份名称(A列)和奖金(B列)。如果你想获得某月的奖金,这个简单的VLOOKUP公式将顺利工作。
=vlookup(b1, a5:b11, 2, false)
然而,只要你交换查找表中的列,就会立即导致#N/A错误。
为了处理左侧查找,你需要一个更通用的函数,它并不真正关心返回列的位置。 可能的解决方案之一是使用INDEX和MATCH函数的组合。 另一种方法是使用OFFSET、MATCH和ROWS。
OFFSET( 查询表 , MATCH( 查找_值 , OFFSET( 查询表 , 0, lookup_col_offset , ROWS( 查询表 ), 1) ,0) -1, return_col_offset , 1, 1)在哪里?
- 查找_col_offset - 是指从起点移动到查找列的列数。
- 返回col_offset - 是指从起点到返回列的移动列数。
在我们的例子中,查找表是A5:B9,查找值在B1单元格,查找列的偏移量是1(因为我们要在第二列(B)中查找查找值,我们需要从表的开头向右移动1列),返回列的偏移量是0,因为我们要从第一列(A)返回值。
=offset(a5:b9, match(b1, offset(a5:b9, 0, 1, rows(a5:b9), 1) ,0) -1, 0, 1, 1)
我知道这个公式看起来有点笨拙,但它确实有效 :)
例2.如何在Excel中进行上位查询
如同VLOOKUP不能向左看一样,它的水平对应函数--HLOOKUP也不能向上看,以返回一个值。
如果你需要扫描上面一行的匹配,OFFSET MATCH公式可以再次帮助你,但这次你必须用COLUMNS功能来加强它,像这样。
OFFSET( 查询表 , return_row_offset , MATCH( 查找_值 , OFFSET( 查询表 , LOOKUP_ROW_OFFSET , 0, 1, 列( 查询表 )), 0) -1, 1, 1)在哪里?
- 查找_行_偏移量 - 从起点移动到查找行的行数。
- 返回的行数(Return_row_offset - 从起点到返回行的移动行数。
假设查询表是B4:F5,查询值在B1单元格,公式如下。
=offset(b4:f5, 0, match(b1, offset(b4:f5, 1, 0, 1, columns(b4:f5)), 0) -1, 1, 1)
在我们的例子中,查找行偏移量为1,因为我们的查找范围是从起点向下的1行,返回行偏移量为0,因为我们从表中的第一行返回匹配。
例3.双向查询(通过列和行的值)。
双向查找根据行和列的匹配情况返回一个值。 而你可以使用下面的双查找数组公式来查找某一行和某一列的交叉点的值。
=OFFSET( 查询表 , MATCH( 行查询值 , OFFSET( 查询表 , 0, 0, ROWS( 查询表 ), 1), 0) -1, match( 列查找值 , OFFSET( 查询表 ,0,0,1,列( 查询表 )), 0) -1)鉴于此。
- 查询表是A5:G9
- 要在行上匹配的值在B2中
- 列上要匹配的值是在B1
你得到以下二维查找公式。
=offset(a5:g9, match(b2, offset(a5:g9, 0, 0, rows(a5:g9), 1), 0)-1, match(b1, offset(a5:g9, 0, 0, 1, columns(a5:g9)) , 0) -1)
这不是最容易记住的东西,不是吗? 此外,这是一个数组公式,所以别忘了按Ctrl + Shift + Enter键来正确输入。
当然,这个冗长的OFFSET公式并不是在Excel中进行双重查找的唯一可能方式。 你可以通过使用VLOOKUP & MATCH函数、SUMPRODUCT或INDEX & MATCH得到同样的结果。 甚至还有一种无公式的方式--使用命名的范围和交叉运算符(空格)。 下面的教程详细解释了所有替代的解决方案:如何进行双向的在Excel中查询。
OFFSET功能 - 限制和替代方案
希望本页的公式实例能对如何在Excel中使用OFFSET有所启发。 然而,为了在自己的工作簿中有效地利用该函数,你不仅要了解它的优点,也要警惕它的缺点。
Excel OFFSET函数最关键的限制如下。
- 与其他易失性函数一样,OFFSET是一个 占用资源的功能 每当源数据有任何变化,你的OFFSET公式就会被重新计算,让Excel忙上一阵子。 这对小型电子表格中的单个公式来说不是问题。 但如果一个工作簿中有几十个或几百个公式,Microsoft Excel可能需要相当长时间来重新计算。
- Excel的OFFSET公式是 难以审查 由于OFFSET函数返回的引用是动态的,大的公式(特别是有嵌套的OFFSET)在调试时可能相当棘手。
在Excel中使用OFFSET的替代方案
正如在Excel中经常出现的情况一样,同样的结果可以通过许多不同的方式实现。 因此,这里有三个优雅的OFFSET替代方案。
- Excel表格
从Excel 2002开始,我们有了一个真正美妙的功能--完全成熟的Excel表格,而不是通常的范围。 要从结构化数据中制作一个表格,你只需点击 插入> 表 关于 首页 标签或按Ctrl + T 。
通过在Excel表格的一个单元格中输入公式,你可以创建一个所谓的 "计算列",自动将公式复制到该列的所有其他单元格中,并为表格的每一行调整公式。
此外,任何引用表格数据的公式都会自动调整,以包括你添加到表格的任何新行或排除你删除的行。 从技术上讲,这种公式是对表格的列或行进行操作的,它们是 动态范围 工作簿中的每个表都有一个唯一的名字(默认的是Table1、Table2等),你可以通过以下方式自由地重命名你的表 设计 标签> 财产 组>。 表名 文本框。
下面的截图展示了SUM公式,它指的是 奖金 请注意,该公式包括表的 列名 而不是一个单元格的范围。
- Excel的INDEX函数
虽然与OFFSET的方式不完全相同,但Excel INDEX也可以用来创建动态范围引用。 与OFFSET不同,INDEX函数不是易失性的,所以它不会拖慢你的Excel。
- Excel的INDIRECT函数
使用INDIRECT函数,你可以从许多来源创建动态范围引用,如单元格值、单元格值和文本、命名范围。 它还可以动态引用另一个Excel工作表或工作簿。 你可以在我们的Excel INDIRECT函数教程中找到所有这些公式的例子。
你还记得本教程开始时提出的问题吗? 什么是Excel中的OFFSET? 我希望你现在知道了答案:)如果你想获得更多的实践经验,请随时下载我们的实践工作手册(请见下文),其中包含本页讨论的所有公式,并对它们进行逆向工程以加深理解。 谢谢你的阅读!
供下载的实践工作手册
OFFSET公式实例(.xlsx文件)。