有没有一种方法可以在过滤器函数中执行多个条件?
在上图中,我只想过滤D列(来自表1)他们的呼叫持续时间,这将显示在表2中。问题是,还有其他数据或值(有时是随机字符)在D列的单个单元格中,您可以看到行合并(在表1中)我想排除里面的所有内容,除了用黄色突出显示的持续时间,这样我就可以使所有内容不合并,最终输出将显示在表2中。在过滤器功能中是否可能?单元格I3中使用的当前公式
=HSTACK(A3:A23,B3:B23,C3:C23,D3:D23,F3:F23)
ycl3bljg1#
已更新
使用此公式“提取”时间值。
=TEXT(FILTER(D3:D23,IFERROR(TIMEVALUE(TEXT(D3:D23,"[h]:mm:ss")),"")<1),"[h]:mm:ss")
如果单元格不是时间格式,TIMEVALUE将返回一个#VALUE。利用这一点可以忽略所有非时间单元格。如果您尝试保留行位置,则应作为一个整体工作:
TIMEVALUE
#VALUE
=HSTACK(A3:A23,B3:B23,C3:C23,TEXT(IFERROR(TIMEVALUE(TEXT(D3:D23,"[h]:mm:ss")),""),"[h]:mm:ss"),F3:F23)
评论更新
我认为这应该可以过滤掉D列没有时间格式或包含-的所有数据。
-
=HSTACK(FILTER(A3:C23,A3:A23<>0),FILTER(D3:D23,(D3:D23="-")+(IFERROR(TIMEVALUE(TEXT(D3:D23,"[h]:mm:ss")),0)>0)))
4dbbbstv2#
CleanTimeCol
=LET(array,A3:D23, TimeCol,TAKE(array,,-1),CleanTimeCol,IF(ISNUMBER(TimeCol),TimeCol,"-"),MergeShift,2, TimeArray,IFERROR(INDEX(CleanTimeCol,SEQUENCE(ROWS(array),,1+MergeShift)),"-"), FilterArray,HSTACK(DROP(array,,-1),TimeArray), FirstCol,TAKE(array,,1), FilterInclude,FirstCol<>"", FILTER(FilterArray,FilterInclude))
=LET(array,A3:D23, TimeCol,TAKE(array,,-1),MergeShift,2, TimeArray,IFERROR(INDEX(TimeCol,SEQUENCE(ROWS(array),,1+MergeShift)),"-"), FilterArray,HSTACK(DROP(array,,-1),TimeArray), FirstCol,TAKE(array,,1), FilterInclude,FirstCol<>"", FILTER(FilterArray,FilterInclude))
array,A3:D23
TimeCol,TAKE(array,,-1)
MergeShift,2
TimeArray,IFERROR(INDEX(TimeCol,SEQUENCE(ROWS(array),,1+MergeShift)),"-")
SEQUENCE
3,4,5,...23
21
INDEX
20
22
23
IFERROR
FilterArray,HSTACK(DROP(array,,-1),TimeArray)
FILTER
FirstCol,TAKE(array,,1)
FilterInclude,FirstCol<>""
FILTER(FilterArray,FilterInclude)
zu0ti5jz3#
如果是固定高度合并
=LET(merged,A2:F23, seq,SEQUENCE(1+MAX(ROW(merged))-MIN(ROW(merged)),,MIN(ROW(merged))), condition,DROP(REDUCE(0,seq,LAMBDA(x,y, VSTACK(x,(IFERROR(1/(INDEX(A:A,y)<>"")/(INDEX(A:A,y+1)="")/(INDEX(A:A,y+2)="")+1,0))))),1), columnD,INDEX(INDEX(merged,,4),1+ROW(merged)-MIN(ROW(merged))+condition), flt,FILTER(HSTACK(TAKE(merged,,3),columnD,TAKE(merged,,-1)),CHOOSECOLS(merged,1)<>""), IF(flt=0,"",flt))
第一个函数获取包括合并单元格在内的整个数据范围,并将其命名为merged。然后创建一个包含行号的序列:seq然后,它按照seq中的定义逐行检查A列,看该行是否包含value而后面两行不包含value。如果是,它返回1。此数组名为condition,用于在condition数组等于1时显示D列中下面2行的值,在等于0时显示当前行的值。这导致columnD如果我们将修改后的columnD之前的merged范围列和最后一个merged范围列堆叠起来,并过滤掉第一个merged范围列为空值的行,则会得到以下结果:flt。为了避免空白单元格显示为0,我添加了IF(flt=0,"",flt)。您可以选择在数据中包括或排除题头。这两种方式都适用。
merged
seq
1
condition
0
columnD
flt
IF(flt=0,"",flt)
如果是可变高度合并
如果合并单元格不是每个定义的3个合并行,则以下公式有效:
=LET(merged,A2:F23, r,ROWS(merged), s,SEQUENCE(r), shiftrow,MAP(s,s+1,LAMBDA(a,b,LET(remainder,INDEX(merged,SEQUENCE(r-a,,b),1),(INDEX(merged,a,1)<>"")*(IFERROR(INDEX(merged,b,1)="",0))*IFERROR(XMATCH("*",remainder,2)-1,IFERROR(ROWS(remainder),0))))), d,INDEX(merged,s+shiftrow,4), mf,HSTACK(TAKE(merged,,3),d,TAKE(merged,,-1)), unmerged,FILTER(mf,TAKE(mf,,1)<>""), IF(unmerged=0,"",unmerged))
这首先接受整个范围merged,然后shiftrow检查当前行c中的单元格是否包含值,并且下一行n中的值是否为空。它将从下一行找到下一个非空单元格的行数作为一个值返回。如果shiftrow返回TRUE,它将检查第一个非空单元格从下一行n到最后一行的空单元格;如果shiftrow返回FALSE,则返回0d返回在其行中索引的列D(s = sequence(rows(merged))))+shiftrow值。mf将合并范围列A:C与列D d和合并范围的最后一列中的固定值组合在一起。unmerged从mf中过滤出第一列中具有空值的行最后,0被替换为空白。
shiftrow
c
n
d
s
sequence(rows(merged)))
mf
unmerged
3条答案
按热度按时间ycl3bljg1#
已更新
使用此公式“提取”时间值。
如果单元格不是时间格式,
TIMEVALUE
将返回一个#VALUE
。利用这一点可以忽略所有非时间单元格。如果您尝试保留行位置,则应作为一个整体工作:
评论更新
我认为这应该可以过滤掉D列没有时间格式或包含
-
的所有数据。4dbbbstv2#
使用合并的单元格过滤数据
CleanTimeCol
。array,A3:D23
-所有数据TimeCol,TAKE(array,,-1)
-最后(时间)列MergeShift,2
-合并列要覆盖的常数TimeArray,IFERROR(INDEX(TimeCol,SEQUENCE(ROWS(array),,1+MergeShift)),"-")
-SEQUENCE
将生成3,4,5,...23
(21
行),INDEX
将返回行20
和21
的错误(对于数字22
和23
),IFERROR
将用破折号替换它们FilterArray,HSTACK(DROP(array,,-1),TimeArray)
-堆叠前3列和时间阵列,生成第一个FILTER
参数FirstCol,TAKE(array,,1)
-第一列FilterInclude,FirstCol<>""
-产生第二个FILTER
参数的第一列非空白FILTER(FilterArray,FilterInclude)
-FILTER
公式zu0ti5jz3#
如果是固定高度合并
第一个函数获取包括合并单元格在内的整个数据范围,并将其命名为
merged
。然后创建一个包含行号的序列:
seq
然后,它按照
seq
中的定义逐行检查A列,看该行是否包含value而后面两行不包含value。如果是,它返回1
。此数组名为condition
,用于在condition
数组等于1
时显示D列中下面2行的值,在等于0
时显示当前行的值。这导致columnD
如果我们将修改后的
columnD
之前的merged
范围列和最后一个merged
范围列堆叠起来,并过滤掉第一个merged
范围列为空值的行,则会得到以下结果:flt
。为了避免空白单元格显示为0
,我添加了IF(flt=0,"",flt)
。您可以选择在数据中包括或排除题头。这两种方式都适用。
如果是可变高度合并
如果合并单元格不是每个定义的3个合并行,则以下公式有效:
这首先接受整个范围
merged
,然后shiftrow
检查当前行c
中的单元格是否包含值,并且下一行n
中的值是否为空。它将从下一行找到下一个非空单元格的行数作为一个值返回。如果shiftrow
返回TRUE,它将检查第一个非空单元格从下一行n
到最后一行的空单元格;如果shiftrow
返回FALSE,则返回0
d
返回在其行中索引的列D(s
=sequence(rows(merged)))
)+shiftrow
值。mf
将合并范围列A:C与列Dd
和合并范围的最后一列中的固定值组合在一起。unmerged
从mf
中过滤出第一列中具有空值的行最后,
0
被替换为空白。