Excel 2016︱多维引用的工作原理
认识引用的维度和维数
引用的维度是指引用中单元格区域的排列方向。维数是引用中不同维度的个数。单个单元格引用可视作一个无方向的点,没有维度和维数;一行或一列的连续单元格区域引用可视作一条直线,拥有一个维度,称为一维横向引用或一维纵向引用;多行多列的连续单元格区域引用可视作一个平面,拥有纵横两个维度,称为二维引用,如图 22-1 所示。
将多个单元格或多个单元格区域分别放在不同的二维平面上,就构成多维引用。若各平面在单一方向上扩展(横向或纵向),呈线状排列,就是三维引用。若各平面同时在纵横两个方向上扩展,呈面状排列,则是四维引用,如图 22-2 和图 22-3 所示。
三维、四维引用可看作是以单元格“引用”或单元格区域“引用”为元素的一维、二维“数组”。各“引用”作为数组的元素,是以一个整体参与运算的。
引用函数生成的多维引用OFFSET 和 INDIRECT 这两个函数通常用来生成多维引用。当它们对单元格或单元格区域进行引用时,在其部分或全部参数中使用数组(常量数组、内存数组或命名数组),所返回的引用即为多维引用。I 使用一维数组生成三维引用以图 22-1 中左侧的数据表为引用数据源,以下数组公式可以返回纵向三维引用。
结果如22-2左图所示。公式表示在数据源表格中以D1单元格为基点,单元格区域的高度分别为2、3、4 行的三个单元格区域引用。由于其中的 {2;3;4} 为一维纵向数组,因此最终取得对 D1:D2、D1:D3、D1:D4 呈纵向排列的单元格区域引用。该纵向三维引用是由 OFFSET 函数在 height 参数中使用一维纵向数组产生的。同理,在 OFFSET函数的 rows、cols、width 参数中使用一维纵向数组,也将返回纵向三维引用。仍以图 22-1 中左侧的数据表为引用数据源,以下数组公式可以返回横向三维引用。
结果如图22-4所示。公式表示在数据源表格中以A1单元格为基点,分别偏移 0、1、2 列,同时单元格区域高度分别为 2、3、4 行的单元格区域引用。由于其中 {0,1,2} 和 {2,3,4} 是对应的一维横向数组,因此最终取得对 A1:A2、B1:B3、C1:C4 呈横向排列的单元格区域引用。在 OFFSET 函数的 rows、cols、height、width 参数中,一个或多个参数同时使用等尺寸的一维横向数组,将返回横向三维引用。
II 使用不同维度的一维数组生成四维引用在 OFFSET 函数的 rows、cols、height、width 参数中,两个或多个参数分别使用一维横向数组和一维纵向数组,将返回四维引用。以下数组公式将返回四维引用。
公式表示在数据源表格中以 A2 单元格为基点,分别偏移 0 行 2 列、0 行 3 列、1 行 2 列、1 行 3 列、2 行 2 列、2 行 3 列的单元格引用。由于 {0;1;2} 是一维纵向数组,{2,3} 是一维横向数组,因此最终取得对“{C2,D2;C3,D3;C4,D4}”共 6 个单元格的引用,并呈 3 行 2 列二维排列。
III 使用二维数组生成四维引用在 OFFSET 函数的 rows、cols、height、width 参数和 INDIRECT 函数的 ref_text 参数中,如果任意一个参数使用二维数组,都将返回四维引用。以下数组公式也将返回四维引用。
公式表示在数据源表格中以 B1 单元格为基点,按照 B1:C1 单元格区域的尺寸大小,分别偏移“{1行 ,2 行 ,3 行 ;4 行 ,5 行 ,6 行 }”的单元格区域引用。由于其中 {1,2,3;4,5,6} 是二维数组,因此最终取得“{B2:C2,B3:C3,B4:C4;B5:C5,B6:C6,B7:C7}”共 6 个单元格区域的引用,并呈 2 行 3 列二维排列。
IV 跨多表区域的多维引用
示例 跨多表汇总工资
图 22-5 展示了某公司 8~10 月份的部分员工工资明细表,需要在“工资汇总”工作表中汇总各位员工的工资。
在“工资汇总”工作表的 D2 单元格输入以下数组公式,按 <Ctrl+Shift+Enter> 组合键,并将公式复制到 D2:D9 单元格区域。{=SUM(SUMIF(INDIRECT({8,9,10}&'月 !A:A'),A2,INDIRECT({8,9,10}&' 月 !D:D')))}该公式首先利用 INDIRECT 函数返回对 8 月、9 月、10 月工作表的 A 列和 D 列的三维引用,然后利用支持多维引用的 SUMIF 函数分别统计各工作表中对应员工号的工资,最终利用 SUM 函数汇总三个工作表中对应员工的工资,结果如图 22-6 所示。
函数生成的多维引用和“跨多表区域引用”的区别
除了 OFFSET 函数和 INDIRECT 函数产生的多维引用以外,还有一种“跨多表区域引用”。例如,公式“=SUM(1 学期 :4 学期 !A1:A6)”可以对 1 学期、2 学期、3 学期和 4 学期这 4 张工作表的 A1:A6单元格区域进行求和,返回一个结果。
实际上,“跨多表区域引用”并非真正的引用,而是一个连续多表区域的引用组合。函数生成的多维引用与“跨多表区域引用”的主要区别如下。
函数生成的多维引用将不同工作表上的各单元格区域引用作为多个结果返回给 Excel,而“跨多表区域引用”作为一个结果返回给 Excel。
两者支持的参数类型不相同。函数生成的多维引用可以在 reference、range 和 ref 类型的参数中使用,而“跨多表区域引用”由于不是真正的引用,故一般不能在这三类参数中使用。函数生成的多维引用将对每个单元格区域引用分别计算,同时返回多个结果值。“跨多表区域引用”将作为一个整体返回一个结果值。
函数生成的多维引用中每个被引用区域的大小和行列位置可以不同,工作表顺序可以是任意的。“跨多表区域引用”的各工作表必须相邻,且被引用区域的大小和行列位置也必须相同。