一、语法:
INDIRECT(ref_text,[a1]):
ref_text:对单元格的引用,此单元格可以包含A1-样式的引用、R1C1-样式的引用、定义为引用的名称或者对文本字符串单元格的引用。如果ref_text是对另外一个工作部的引用(外部引用),则那个工作簿必须被打开。
[a1]:一逻辑值,指明包含在单元格ref_text中的引用类型。如果[a1]为TRUE或者省略,ref_text被解释为A1-样式的引用;如果[a1]为FALSE,ref_text被解释为R1C1-样式的引用。
注:我们常用的为A1-样式。
A1-样式:
这里的A就是列号,即A列;
这里的1表示行号,即第1行;
所以在A1引用样式下,第1行第1列,用A1来表示,就是我们通常说的A1单元格。
R1C1-样式:
这里的R就是Row的第一个字母,R1就是表示第1行;
这里的C就是Column的第一个字母,C1就是表示第1列;
所以在R1C1引用样式下,第1行第1列就是用R1C1来表示。
二、用法
1、indirect函数对单元格引用的两种方式。
看下图,使用indirect函数在C2、C3引用A1单元格的内容。
1——=INDIRECT("A1"),结果为C3。这种使用,简单的讲,就是将这些引用地址套上双引号,然后再传递给INDIRECT函数。
2——=INDIRECT(C1),结果为C2。解释:因为C1的值就是"A1",在公式编辑栏,选中“C1”,然后按下F9键,计算值,可以看到变为“"A1"”,本质没变,都是对单元格引用。
上面两者的区别在于:前者是A1单元格内文本的引用,后者是引用的C1单元格内的地址引用的单元格的内容。
2、indirect函数工作表名称的引用
如下图所示:
如果需要在“二班”工作表,计算“一班”工作表B2:B5的成绩总和。可以使用这样的 公式:=SUM(INDIRECT("一班!B2:B5"))。【解释:indirect("工作表名!单元格区域")】
注:另外一种情况是当工作表名称直接是数字的,在工作表名称两边必须添加上一对单引号。
如果需要在“2”工作表,计算“1”工作表B2:B5的成绩总和。可以使用这样的 公式:=SUM(INDIRECT("'1'!B2:B5"))。解释:indirect(" '工作表名'!单元格区域")
总结:如果工作表名为汉字,工作表名前后可以加上一对单引号,也可以不加。但是数字和一些特殊字符时,必须加单引号,否则不能得到正确结果。
我们在工作表命名时形成习惯尽量不要有空格和符号,这样可以不怕indirect引用忘记加单引号括起来。要么形成习惯所有indirect带工作表名引用时都用单引号将代表工作表名的字符串括起来。
3、INDIRECT函数对工作簿引用的书写方式和细节正确写法
=INDIRECT("[工作簿名.xls]工作表表名!单元格地址")
INDIRECT函数,如果是对另一个工作簿的引用(外部引用),则那个工作簿必须被打开。如果源工作簿没有打开,函数 INDIRECT 返回错误值 #REF!。
4、Indirect函数应用实例一:制作多级下拉菜单
数据有效性课程提到过,可查看课程回顾。
5、Indirect函数应用实例二:简单多表合并
公式:=INDIRECT(B$1&"!B"&ROW())
公式说明:
B$1&"!B"&ROW(),根据ROW函数产生的行号,生成单元格地址。例公式在第2行时,ROW()结果是2,B$1&"!B"&ROW()的结果就是:1号!B2
当往下拖动时是1号!B3、1号!B4、1号!B5…………
当往右拖动时是2号!B2、3号!B2、4号!B2、5号!B2…………
6、Indirect函数应用实例三:多表查找
工资表模板中,每个部门一个表。在查询表中,要求根据提供的姓名,从财务部、人事部、销售部3个工作表中查询该员工的基本工资。
你可以去用vlookup函数结合if函数一个表一个表查找,但是你可以想象会繁琐。这才三张表,更不用去想假如有30张了…………
==IFERROR(VLOOKUP(查询!A2,财务部!A:B,2,0),IFERROR(VLOOKUP(查询!A2,人事部!A:B,2,0),IFERROR(VLOOKUP(查询!A2,销售部!A:B,2,0),"查无此人")))
分析:
如果,我们知道A3是财务部的,那么公式可以写为:
=VLOOKUP(查询!A2,财务部!A:B,2,0)
如果,我们知道A3可能在财务部或人事部这2个表中,公式可以写为:
=IFERROR(VLOOKUP(查询!A2,财务部!A:B,2,0), VLOOKUP(查询!A2,人事部!A:B,2,0))
意思是,如果在财务部表中查找不到(用iferror函数判断),查询不到则去人事部表中再查找。
如果,我们知道A3只能能在财务部、人事部或销售部中,否则“查无此人”,公式可以再次改为:
=IFERROR(VLOOKUP(查询!A2,财务部!A:B,2,0),IFERROR(VLOOKUP(查询!A2,人事部!A:B,2,0),IFERROR(VLOOKUP(查询!A2,销售部!A:B,2,0),"查无此人")))
意思是,如果在财务部表中查找不到(用iferror函数判断),查询不到则依次去人事部、销售部表中再查找,三张表都没有那就是“查无此人”。
如果,有更多的表,本例中仅有3个表,那就一层层的套用下去。假设有20-30张表你能想想么?【实际上如果看不明白建议直接通过方方格子、哈德门工具箱等外部插件直接合并工作表到一起,缺陷就是数据更新时都需要重新合并查找一次】
我们结合indirect函数和vlookup配合其他来一步实现,简化公式,以适合在更多的表中查询【学会修改公式嵌套使用】:
=VLOOKUP(A2,INDIRECT(LOOKUP(1,0/COUNTIF(INDIRECT({"财务部","人事部","销售部"}&"!a:a"),A2),{"财务部","人事部","销售部"})&"!A:B"),2,0)
注:
COUNTIF(INDIRECT({"财务部","人事部","销售部"}&"!a:a"),A2)
1——确定员工是在哪个表中。这里利用countif函数可以多表统计计算各个表中该员工存在的个数;
2——利用lookup(1,0/(数组),数组) 结构取得工作表的名称;
3——利用indirec函数把字符串转换成单元格引用;
4——利用vlookup查找即可。
关键部分:
A2:查找的内容
{""}:大括号内是要查找的多个工作表名称,用英文状态下逗号分隔;
a:a :本例是姓名在各个表中的A列,如果在B列则为b:b;
A:B :vlookup查找的区域
2:是vlookup第3个参数,相对应的列数。你懂的!【找什么;在哪儿找;查找区域第几列;精确还是模糊查找】
7、Indirect函数应用实例四:多表求和
如下图所示,有1日~5日这5个列相同、行数不同的明细表,要求汇总出每个产品的销量之和。
汇总求和公式:
=SUMPRODUCT(SUMIF(INDIRECT(ROW($1:$5)&"日!b:b"),A2,INDIRECT(ROW($1:$5)&"日!c:c")))
注:
如果只有一个表,我们只需要用sumif函数直接求和:
=SUMIF('1日'!B:B,合计!A2,'1日'!C:C)
对于多个表,除了用sumif()+sumif+sumif()...外【和上例iferror和vlookup结合一个个查找相似】,Sumif函数支持多表同时求和,但必须用indirect函数生成对多个表的引用,即:
INDIRECT(ROW($1:$5)&"日!B:B")和INDIRECT(ROW($1:$5)&"日!C:C")
用sumif组合起来,即:
=SUMIF(INDIRECT(ROW($1:$5)&"日!b:b"),A2,INDIRECT(ROW($1:$5)&"日!c:c"))
但是上述的公式返回的每个表的求和结果,是一组数,我们需要把他们汇总起来,最后还需要用sumrpoduct函数进行求和,即:
=SUMPRODUCT(SUMIF(INDIRECT(ROW($1:$5)&"日!b:b"),A2,INDIRECT(ROW($1:$5)&"日!c:c")))
或者最后用sum函数进行求和,注意这时候需要使用数组公式哦,按ctrl+shift+enter运行【{}】,即:
{=SUM(SUMIF(INDIRECT(ROW($1:$5)&"日!b:b"),A2,INDIRECT(ROW($1:$5)&"日!c:c")))}
by:wehfouh
2018-10-7 18:06