OFFSET函数功能十分强大,在数据动态用及后续的多维引用等很多应用实例中都会用到。例如,可以构建动态的引用区域,用于数据验证中的动态下拉来单,以及在用图表中构建动态的数据源等。
OFFSET函数以指定的用为参照,通过给定偏移量得到新的引用,返回的引用可以一个单元格或单元格区域,也可以指定返回的行数和列数。
其语法如下。
OFFSET(reference,rows,cols,[height],[width])
第一参数reference是必需参数。作为偏移量参照的起始引用区域。该参数必须为对单元格或相连单元格区域的引用,否则OFFSET返回错误值#VALUE!或无法完成公式输入
第二参数rows是必需参数。相对于偏移量参照系的左上角单元格,向上或向下偏移行数。行数为正数时,表示在起始引用的下方。行数为负数时,表示在起始引用的上方。如果省略必须用半角逗号占位,默认值为0(即不偏移)。
第三参数cols是必需参数。相对于偏移量参照系的左上角单元格,向左或向右偏移的列数。列数为正数时,表示在起始引用的右边。列数为负数时,表示在起始引用的左边。如省略必须用半角逗号占位,默认值为0(即不偏移 )。
第四参数height是可选参数,为要返回的引用区域的行数
第五参数width是可选参数,为要返回的引用区域的列数。
如果OFFSET函数行数或列数的偏移量超出工作表边缘,将返回错误值#REF!。
OFFSET函数偏移方式
如以下公式将返回对D5单元格的引用。
=OFFSET(A1,4,3)
其含义如下。
A1单元格为OFFSET函数的引用基点。
rows参数为4,表示以A1为基点向下偏移4行,至A5单元格。
cols参数为3,自A5单元格向右偏移3列,至D5单元格。
如以下公式将返回对D5:G8单元格区域的引用。
=OFFSET(A1,4,3,4,4)
其含义如下。
A1单元格为OFFSET函数的引用基点。rows参数为4,表示以A1 为基点向下偏移4行,至A5单元格。
cols参数为3,自A5单元格向右偏移3列,至D5 单元格。
height参数为4,width参数为4,表示以D5单元格为起点向下取4行,向右取4列,最终返回对D5:D8单元格区域的引用。
提示:如果OFFSET函数的最终结果是返回对单元格区域的引用,并且公式在一个单元格中输入时,会显示为错误值#VALUE!。可以在编辑栏中选中公式,按<F9>键查看返回的结果,查看完毕按<Esc>键恢复公式原有状态。OFFSET函数返回的对单元格区域的引用,通常用于其他函数的参数,进行后续的汇总分析。
以下公式将返回对A2:K3单元格区域的引用。
=OFFSET(A1:K1,1,0,2,)
其含义如下。
以A1:K1单元格区域为引用基点,向下偏移1行0列至A2:K2单元格区域。然后以A2:K2单元格区域为基础取2行。最后参数width 用逗号占位简写或省略该参数,表示引用的列数与第一参数引用基点的列数相同。
以下公式将返回对B2、F4和J8单元格的多维引用。
=OFFSET(A1,{1,3,7},{1,5,9})
其含义如下。
以A1单元格为引用基点,向下分别偏移1、3、7行的同时,向右偏移1、5、9列。OFFSET函数第二参数和第三参数{1,3,7}和{1,5,9}都是1行3列的数组,一共生成3组偏移量,即偏移1行1列、偏移3行5列和偏移7行9列。OFFSET函数如果使用数组参数,则会返回多维引用,在数组公式中的使用频率非常高。在图14-39中,以下公式将返回对B2、F2、J2、B4、F4、J4、B8、F8和J8这9个单元格的引用。
=OEESET(A1, {1,3,7},{1;5;9})
其含义如下。
以A1单元格为引用基点,向下分别编移1行时向右偏移1、5、9列,向下分别移3行时向右偏移1、5、9列,向下分别偏移7行时向右偏移1、5、9列。共返回9个单元格引用。
OFFSET函数第二参数{1,3,7}为行数组,第三参数{1;5;9}为列数组,一共生成9组偏移量,即偏移1行1列、偏移1行5列和偏移1行9列: 偏移3行1列、偏移3行5列和偏移3行9列;偏移7行1列、偏移7行5列和偏移7行9列。
OFFSET函数参数规则
在使用OFFSET函数时,如果省略参数 height 或参数 width,则视为其高度或宽度与引基点的高度或宽度相同。
如果引用基点是一个多行多列的单元格区域,当指定了参数height或参数width时,以引用区域的左上角单元格为基点进行偏移,返回的结果区域的宽度和高度仍以width参和height参数的值为准。
如以下公式会返回对C3:D4单元格区域的引用。
=OFESET(A1:C9,2,2,2,2)
其含义为: 以A1:C9单元格区域为引用基点,整体向下偏移两行到第3行,向右偏移两列到C列,新引用的行数为两行,新引用的列数为两列。
OFFSET函数的height参数和width 参数不仅支持正数,实际上还支持负数,负行数表向上偏移,负列数表示向左偏移。
以下公式也会返回 C3:D4 单元格区域的引用。
=OEFSET(E6,-2,-1,-2,-2)
公式中的rows、cols、height和width参数均为负数,表示以E6单元格为引用基点,向上偏移两行到第4行,向左偏移1列到D列,此时偏移后的基点为D4单元格。在此基础高度向上返回两行、宽度向左返回两列的单元格区域的引用,也就是以D4单元格为右下两行两列的单元格区域。
OFFSET函数参数自动取整
如果OFFSET函数的rows、cols、 height和width参数不是整数,OFFSET函数会自动去小数部分,进行截尾取整计算。
例 动态汇总销售额
在下图,A~G列为不同销售人员1~6月的销售金额记录,要求根据A11单元格的销售人员姓名在F11单元格返回该人员指定月份的销售额合计。
在F11单元格中输入以下公式。
=SUM(OFFSET(A1,MATCH(A11,A2:A7,),B11,,D11-B11+1))
“MATCH(A11,A2:A7,)”部分回A11单元格的姓名“胡*元”在A2:A7单元格区域场在的行数,结果为4。OFFSET函数以A1 单元格区城为引用基准,第二参数向下偏移4行,第三参数为B11返回2,第四参数只用逗号占位简写为0,行偏移量为0,第五参数为D11-B11+1返回4,所以 OFFSET(A1,4,2,0,4)为C5:F5单元格区域。
再用SUM函数对返回的引用求和就得到“胡*元” 2-5月销售金额合计。通过调整第11行相关单元格内容可实现动态汇总查询。