答案1
以下是 5 个公式的递进。每个公式都基于其之前的公式。希望以这种方式递进可以让后面的公式更容易理解。
[ 公式 1/5 ] 基础公式
=IFERROR(IF(
MATCH(A2:A7,FILTER(A2:A7,B2:B7="Wash car"),0),
"yes"),"no")
- 如果函数用途匹配就像它一样
logical_test
。 - 这如果函数的
value_if_true
参数是"Yes"
value_if_false
被省略,因为logical_test
使用只能返回TRUE
或#N/A
- 错误信息用以下方式替换错误
"No"
[ 公式 2/5 ] 忽略空行
=IF(A2:A7<>0, IFERROR(IF(
MATCH(A2:A7,FILTER(A2:A7,B2:B7="Wash car"),0),
"Yes"),"No"),"")
- 要忽略空白行,如果函数被添加
value<>0
为logical_test
。它将返回:TRUE
对于任何包含非零数字的单元格以及任何文本字符串,甚至包含数字的单元格。例如("0"<>0)=TRUE
FALSE
对于 Excel 强制为零的数字0
以及空单元格。例如,如果OR(ISBLANK(A1),A1=0)
那么(A1<>0)=FALSE
- 这基本公式用作
value_if_true
value_if_false
是一个空字符串""
。
此方法跳过返回,"No"
同时防止数据间隙导致的行偏移。
[ 公式 3/5 ] 标题行上的公式
将公式移动到标题行可能会防止它被覆盖。
=VSTACK("Wash on Order?",
IF(A2:A7<>0, IFERROR(IF(
MATCH(A2:A7,FILTER(A2:A7,B2:B7="Wash car"),0),
"Yes"),"No"),""))
- 堆栈允许垂直堆叠阵列
- 使用的第一个数组是标题
"Wash on Order?"
- 第二个数组是前面的公式。
[ 公式 4/5 ] 添加了 LET 函数
尽管让单独使用不会给前一个公式增加很多内容,但在此步骤中使用它来阐明变换。随着公式变得越来越复杂,让变得更加清晰。
=LET(rng,A2:B7,
a,DROP(rng,,-1), b,DROP(rng,,1),
VSTACK("Wash on Order?",
IF(a<>0, IFERROR(IF(
MATCH(a, FILTER(a, b="Wash car"), 0),
"Yes"), "No"), "")))
- 这让函数允许将值和公式存储在变量中以供重复使用。这可以减少代码重复和公式长度,还可以使复杂的公式更易于理解和管理。
- 源范围存储在 中
rng
。 - 使用以下方式返回A 列
a
和 B 列b
降低派遣不必要的队伍。 a
现在在公式b
中用和代替和A2:A7
。B2:B7
[ 公式 5/5 ] 自动调整范围大小
允许数据增长而无需修改公式。接受完整列,然后根据填充的数据根据需要调整数组大小。让正在全面展示。
=LET(rng,A:B,
arr,DROP(FILTER(rng, ROW(rng)<=
MAX((rng<>0)*(ROW(rng)))),1),
a,DROP(arr,,-1), b,DROP(arr,,1),
VSTACK("Wash on Order?",
IF(a<>0, IFERROR(IF(MATCH(a,
FILTER(a, b="Wash car"), 0),
"yes"),"no"),"")))
答案2
以下解决方案似乎满足了您的样本数据中设定的目标。
在空白列中
C
,将每行的A
和B
列与=concat(A2,B2)
(在单元格中C2
)连接起来。在空白列中
D
,从 开始添加以下公式D2
。这是一个数组公式,因此您需要CTRL+SHIFT+ENTER
同时按下 才能使其起作用。=IF(OR($A$1:$A$6=A1)*(OR($C$1:$C$6=CONCAT(A1,"Wash car"))),"Yes","No")
复制
D2
到剩余的行。
如果我忽略了某些内容(我觉得我可能忽略了,因为我的样本数据集非常有限),请告诉我,我会尝试纠正。如果此解决方案最终解决了您的问题,请将其标记为答案。