excel 筛选器中的多个条件

tzdcorbm  于 2023-01-21  发布在  其他
关注(0)|答案(3)|浏览(206)

有没有一种方法可以在过滤器函数中执行多个条件?

在上图中,我只想过滤D列(来自表1)他们的呼叫持续时间,这将显示在表2中。问题是,还有其他数据或值(有时是随机字符)在D列的单个单元格中,您可以看到行合并(在表1中)我想排除里面的所有内容,除了用黄色突出显示的持续时间,这样我就可以使所有内容不合并,最终输出将显示在表2中。在过滤器功能中是否可能?
单元格I3中使用的当前公式

=HSTACK(A3:A23,B3:B23,C3:C23,D3:D23,F3:F23)
ycl3bljg

ycl3bljg1#

已更新

使用此公式“提取”时间值。

=TEXT(FILTER(D3:D23,IFERROR(TIMEVALUE(TEXT(D3:D23,"[h]:mm:ss")),"")<1),"[h]:mm:ss")

如果单元格不是时间格式,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)))
4dbbbstv

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,...2321行),INDEX将返回行2021的错误(对于数字2223),IFERROR将用破折号替换它们
  • FilterArray,HSTACK(DROP(array,,-1),TimeArray)-堆叠前3列和时间阵列,生成第一个FILTER参数
  • FirstCol,TAKE(array,,1)-第一列
  • FilterInclude,FirstCol<>""-产生第二个FILTER参数的第一列非空白
  • FILTER(FilterArray,FilterInclude)-FILTER公式
zu0ti5jz

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)
您可以选择在数据中包括或排除题头。这两种方式都适用。

如果是可变高度合并

如果合并单元格不是每个定义的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,则返回0
d返回在其行中索引的列D(s = sequence(rows(merged))))+shiftrow值。
mf将合并范围列A:C与列D d和合并范围的最后一列中的固定值组合在一起。
unmergedmf中过滤出第一列中具有空值的行
最后,0被替换为空白。

相关问题