通过索引查找值,但不会被删除
Find values through index, but safe from deletion
我有一个输入 sheet,其中包含几个不同的变量,其中包括名称、位置和工作。我想在不同的 sheet 上显示这些值,其中我按组汇总数据。所以输入如下
A B C
1 NAME CIYY WORK
2 Bart NY Plumber
3 Emily NY Firefighter
4 Daniel LA Firefighter
5 Cohen NY Firefighter
6 Sasha LA Plumber
7 Dirk LA Plumber
8 Molly LA Plumber
现在我想查找洛杉矶水管工的姓名,这意味着它需要看起来像这样:(没有 #NA
并且中间没有空单元格)
A
1 NAME
2 Sasha
3 Dirk
4 Molly
使用索引、匹配等应该很容易。但是,只需删除行和添加行即可更改输入。 如何在不冒 #REF
错误 的风险的情况下实现这一目标。例如,当 Dirk 被删除时,输出应如下所示:
A
1 NAME
2 Sasha
4 Molly
The solution on this page 非常接近,但在不满足条件时给我留下 #NA
。
虽然这些值是唯一的,但我觉得 this solution for extracting unique values 会有帮助,但无法将它们组合起来。
尝试这样的操作,给出整个范围、单元格和列:
=INDEX(1:1048576,MATCH("Bart",A:A,0),MATCH("NY",2:2,0))
因此,您可以从 A:A
和 2:2
中删除,范围将保持不变。
您需要使用 INDEX 和 AGGREGATE 进行两列匹配。
=INDEX(A:A, AGGREGATE(15, 6, ROW(A:INDEX(A:A, MATCH("zzz", A:A)))/((B:INDEX(B:B, MATCH("zzz", A:A))=G)*(C:INDEX(C:C, MATCH("zzz", A:A))=H)), ROW(1:1)))
填写连续的比赛。如果您不想在 运行 匹配项中出现错误代码,请使用 IFERROR 包装器。
我找到了使用 INDRECT 解决此问题的方法。但是我不喜欢这个功能,仍然建议使用 Jeeped 提出的解决方案。
解决方案需要三个步骤。
- 添加一个包含两个字符串组合的额外列:即
D2 = B2&C2
,并用 =MATCH($M;D:D;0)
存储第一次出现 LAPlumber 的行
- 现在,迭代地找到下一次出现 LAPlumber 的行:
=IFERROR(MATCH($M;INDIRECT("$D$"&SUM($N:$N17;1)&":$D";TRUE);0);"")
。这个函数使用前面的row-numbers,用INDIRECT重新定义数组。 请注意,这些值的结果是相对于上一行的结果。
- 对于每一行,找到对应的名称:
=INDEX($A:$C;SUM($N:N18);O)
。 sum函数用于合并相对row-numbers。
在图片中我添加了步骤 3 的屏幕截图。单元格 H3 包含步骤 1。列 H
中的其他单元格显示步骤 2 中的行号。
我有一个输入 sheet,其中包含几个不同的变量,其中包括名称、位置和工作。我想在不同的 sheet 上显示这些值,其中我按组汇总数据。所以输入如下
A B C
1 NAME CIYY WORK
2 Bart NY Plumber
3 Emily NY Firefighter
4 Daniel LA Firefighter
5 Cohen NY Firefighter
6 Sasha LA Plumber
7 Dirk LA Plumber
8 Molly LA Plumber
现在我想查找洛杉矶水管工的姓名,这意味着它需要看起来像这样:(没有 #NA
并且中间没有空单元格)
A
1 NAME
2 Sasha
3 Dirk
4 Molly
使用索引、匹配等应该很容易。但是,只需删除行和添加行即可更改输入。 如何在不冒 #REF
错误 的风险的情况下实现这一目标。例如,当 Dirk 被删除时,输出应如下所示:
A
1 NAME
2 Sasha
4 Molly
The solution on this page 非常接近,但在不满足条件时给我留下 #NA
。
虽然这些值是唯一的,但我觉得 this solution for extracting unique values 会有帮助,但无法将它们组合起来。
尝试这样的操作,给出整个范围、单元格和列:
=INDEX(1:1048576,MATCH("Bart",A:A,0),MATCH("NY",2:2,0))
因此,您可以从 A:A
和 2:2
中删除,范围将保持不变。
您需要使用 INDEX 和 AGGREGATE 进行两列匹配。
=INDEX(A:A, AGGREGATE(15, 6, ROW(A:INDEX(A:A, MATCH("zzz", A:A)))/((B:INDEX(B:B, MATCH("zzz", A:A))=G)*(C:INDEX(C:C, MATCH("zzz", A:A))=H)), ROW(1:1)))
填写连续的比赛。如果您不想在 运行 匹配项中出现错误代码,请使用 IFERROR 包装器。
我找到了使用 INDRECT 解决此问题的方法。但是我不喜欢这个功能,仍然建议使用 Jeeped 提出的解决方案。
解决方案需要三个步骤。
- 添加一个包含两个字符串组合的额外列:即
D2 = B2&C2
,并用=MATCH($M;D:D;0)
存储第一次出现 LAPlumber 的行
- 现在,迭代地找到下一次出现 LAPlumber 的行:
=IFERROR(MATCH($M;INDIRECT("$D$"&SUM($N:$N17;1)&":$D";TRUE);0);"")
。这个函数使用前面的row-numbers,用INDIRECT重新定义数组。 请注意,这些值的结果是相对于上一行的结果。 - 对于每一行,找到对应的名称:
=INDEX($A:$C;SUM($N:N18);O)
。 sum函数用于合并相对row-numbers。
在图片中我添加了步骤 3 的屏幕截图。单元格 H3 包含步骤 1。列 H
中的其他单元格显示步骤 2 中的行号。