我正在尝试为我的数据创建一个搜索表,其中有四列可以包含任何顺序的值,并且都是可选的。例如:
姓名 | 性别 | 值1 | 值2 | 值3 | 价值4 |
---|---|---|---|---|---|
爱丽丝 | F | A | |||
鲍勃 | M | A | B | C | |
查理 | F | C | Z | ||
查理 | M | B | D | A |
我目前的搜索选项是姓名、性别和价值观。除名称外,所有内容都是可选的。我目前已经使用以下公式实现了姓名、性别和第一个值:
=FILTER(
Data!D2:L,
Data!D2:D = $B$1,
IF(
NOT(ISBLANK($D$1)),
Data!E2:E = $D$1,
Data!E2:E <> $D$1
),
IF(
NOT(ISBLANK($F$1)),
(Data!I2:I = $F$1) + (Data!J2:J = $F$1) + (Data!K2:K = $F$1) + (Data!L2:L = $F$1),
Data!D2:D = $B$1
)
)
对于其他上下文,我的姓名下拉列表位于
$B$1
中,性别下拉列表位于 $D$1
中,值的下拉列表位于字段 $F$1:$I$1
中。
我的过滤器当前可以工作,但是,我需要为每个值使用 IF 语句来首先查看它是否为空,然后加入每个可能的列的检查。最后,如果值 1 的下拉列表为空,我不能简单地返回
TRUE
,所以我必须使用我已经知道是 true 的检查。
这一切都很好,尽管我很想使用
COUNTIF
。将每列的单独检查替换为:
COUNTIF(Data!I2:L, $F$1) > 0
遗憾的是,这似乎不起作用,并且会抛出错误,“FILTER 的范围大小不匹配。预期行数:1999,列数:1。实际行数:1,列数:1。”
有什么办法可以解决这个问题吗?此外,是否有比为每个可能的空白字段设置 IF 更简单的方法来解决此问题?
为了一些额外的上下文,这是我添加第二个到第四个值后的完整公式:
=FILTER(
Data!D2:L,
Data!D2:D = $B$1,
IF(
NOT(ISBLANK($D$1)),
Data!E2:E = $D$1,
Data!E2:E <> $D$1
),
IF(
NOT(ISBLANK($F$1)),
(Data!I2:I = $F$1) + (Data!J2:J = $F$1) + (Data!K2:K = $F$1) + (Data!L2:L = $F$1),
Data!D2:D = $B$1
),
IF(
NOT(ISBLANK($G$1)),
(Data!I2:I = $G$1) + (Data!J2:J = $G$1) + (Data!K2:K = $G$1) + (Data!L2:L = $G$1),
Data!D2:D = $B$1
),
IF(
NOT(ISBLANK($H$1)),
(Data!I2:I = $H$1) + (Data!J2:J = $H$1) + (Data!K2:K = $H$1) + (Data!L2:L = $H$1),
Data!D2:D = $B$1
),
IF(
NOT(ISBLANK($I$1)),
(Data!I2:I = $I$1) + (Data!J2:J = $I$1) + (Data!K2:K = $I$1) + (Data!L2:L = $I$1),
Data!D2:D = $B$1
)
)
QUERY
。这是一个例子:
=QUERY(A2:F,
"where 0=0"&
IF(B1="",," and A='"&B1&"'")&
IF(D1="",," and B='"&D1&"'")&
IF(F1="",," and C='"&F1&"'")&
IF(G1="",," and D='"&G1&"'")&
IF(H1="",," and E='"&H1&"'")&
IF(I1="",," and F='"&I1&"'"))
您还可以定义一个自定义函数来避免所有这些重复:
=LET(F,LAMBDA(opt,col,IF(opt="",," and "&col&"='"&opt&"'")),
QUERY(A2:F,
"where 0=0"&
F(B1,"A")&F(D1,"B")&F(F1,"C")&F(G1,"D")&F(H1,"E")&F(I1,"F")))
这里对您已有的内容稍作修改
IF-ELSE
TRUE 检查:
=filter(Data!D2:L,(Data!D2:D=B1)*
(if(len(E1),Data!E2:E=E1,1))*
(if(len(F1),((Data!I2:I=F1)+(Data!J2:J=F1)+(Data!K2:K=F1)+(Data!L2:L=F1)),1))*
(if(len(G1),((Data!I2:I=G1)+(Data!J2:J=G1)+(Data!K2:K=G1)+(Data!L2:L=G1)),1))*
(if(len(H1),((Data!I2:I=H1)+(Data!J2:J=H1)+(Data!K2:K=H1)+(Data!L2:L=H1)),1))*
(if(len(I1),((Data!I2:I=I1)+(Data!J2:J=I1)+(Data!K2:K=I1)+(Data!L2:L=I1)),1)))