跳转满足条件的数据
问题:根据总表中指定条件,跳转到分表中的指定数据。
子表只有一个“数据表1”:
=IF(COUNTIFS(数据表1!A:A,A2),HYPERLINK("#数据表1!a"&MIN(IF(A2=数据表1!A$2:A$7,ROW($2:$7)))&":d"&MAX(IF(A2=数据表1!A$2:A$7,ROW($2:$7))),A2),"")
借助Let函数公式可以简化如下:
=LET(a,IF(A2=数据表1!A$2:A$7,ROW($2:$7)),IF(COUNTIFS(数据表1!A:A,A2),HYPERLINK("#数据表1!a"&MIN(a)&":d"&MAX(a),A2),""))
IF(A2=数据表1!A$2:A$7,ROW($2:$7)):如果数据表1中A列数据等于A2时,返回对应行号。
"#数据表1!a"&MIN(a)&":d"&MAX(a):生成需要引用数据的单元格地址,如a的结果为2、3、4、False、False,单元格地址为“#数据表1A2:D4”
使用Hyperlink实现超链接
如果A2在数据表1的A列中不存在,返回空文本。
子表有若干个,如数据表1、数据表2:
=IF(SUM(COUNTIF(INDIRECT({"数据表1","数据表2"}&"!a:a"),A2)),HYPERLINK("#"&CONCAT(UNIQUE(IF(VSTACK(数据表1:数据表2!A$2:A$6)=A2,CHOOSE(INT(ROW($5:$14)/5),"数据表1","数据表2"),"")))&"!a"&MIN(IF(VSTACK(数据表1:数据表2!A$2:A$6)=A2,MOD(ROW($5:$14),5)+2))&":d"&MAX(IF(VSTACK(数据表1:数据表2!A$2:A$6)=A2,MOD(ROW($5:$14),5)+2)),A2),"")
借助Let函数公式可以简化如下:
=LET(a,VSTACK(数据表1:数据表2!A$2:A$6)=A5,b,IF(a,MOD(ROW($5:$14),5)+2),IF(SUM(COUNTIF(INDIRECT({"数据表1","数据表2"}&"!a:a"),A5)),HYPERLINK("#"&CONCAT(UNIQUE(IF(a,CHOOSE(INT(ROW($5:$14)/5),"数据表1","数据表2"),"")))&"!a"&MIN(IF(a,MOD(ROW($5:$14),5)+2))&":d"&MAX(IF(a,MOD(ROW($5:$14),5)+2)),A5),""))
CountIf部分需要引用所有工作簿的A列,计算出A2在各子表中的个数
Vstack用于将所有子表的A列堆叠成一列
Vstack的结果中如果存在A2,所返回的行号是一个循环序列数,本示例中Vstack每个工作表引用5行,此循环值就是5,这一结果作为Hyperlink需要跳转的单元格地址的行数
Vstack的结果中如果存在A2,则返回一个重复序列数,本示例中Vstack每个工作表引用5行,此重复次数为5,这一结果作为Choose函数的第一参数,用以提取工作表名
Choose函数第二个参数起,需要列出所有工作表名
其他思路同上
所以,为什么不在一开始就把所有相同结构的表合并在一个工作表内?