如何找到值不为空的行中的第一个单元格,并检查该数字是否小于或等于其他单元格中的数字

问题描述 投票:7回答:3

我有以下Google电子表格:

item  have ready  need1 need2 need3
A     1                 2     1
B     1           2     1     1
C     2                 2     

等等

我想填写ready列如下:

  • 找到need1,...,needN范围中的第一列,其中包含非空值
  • 如果找到的值小于或等于have列中的值,请将ready列设置为快乐(例如yes
  • 如果找到的值大于have列中的值,则不要执行任何操作

所以上面的输入,处理时应该如下所示:

item  have ready  need1 need2 need3
A     1                 2     1
B     1           2     1     1
C     2    yes          2     

对于第一步,我找到了一个建议的解决方案,这对我不起作用:

=INDEX( SORT( FILTER( D10:H10 , LEN( D10:H10 ) ) , 
FILTER( COLUMN( D10:H10 ) , LEN( D10:H10 ) ) , 0 ) , 1 )

(它返回#REF!)不确定它有什么问题或如何继续下一步。

提前致谢!

google-sheets formulas
3个回答
6
投票

如果你知道你需要有多少列,甚至只知道工作表上有多少列,这是非常简单的。如果没有,你需要查看整行,你可能需要重新设计一点,以避免来自单元格的循环引用,公式是该行的一部分。

你的后两个步骤相当简单 - 你想要一个基于条件的两个结果中的一个,所以你将要使用=IF。你的条件是'需要'数字小于或等于'有'数字,如果那是真的你想要它说'是',如果没有则你想要它。所以,这给了我们:

=IF(need<=have, "Yes", "")

下面的示例假设您的上表从左上角的单元格A1开始,并且工作表中的最后一列是Z.

接下来我们需要找到'需要'和'有'。找到'have'非常简单 - 它只是B列中的数字。

找到“需要”稍微复杂一些。你有正确的想法使用INDEXFILTER,但你的公式似乎有点过于复杂。基本上我们可以使用FILTER过滤掉空白值,并使用INDEX找到剩下的第一个。首先,FILTER

您要过滤的范围是从D列到Z列的同一行中的所有内容(或最终列的任何内容),您要过滤的条件是这些相同的单元格不是空白。对于您在单元格C2中键入的公式,这给了我们:

=FILTER(D2:Z2, D2:Z2<>"")

接下来,INDEX:如果给INDEX一个数组,一个行号和一个列号,它将告诉你那个行和列相遇的单元格是什么。由于我们已经过滤掉了空白,我们只需要在过滤后的数组的第一列中留下任何内容,这样我们就可以:

=INDEX(FILTER(D2:Z2, D2:Z2<>""), 1, 1)

或者,因为我们的数组中只有一行,而INDEX非常聪明,只需:

=INDEX(FILTER(D2:Z2, D2:Z2<>""), 1)

因此,为了将它们整合在一起,我们对C2单元的最终公式是:

=IF(INDEX(FILTER(D2:Z2, D2:Z2<>""), 1)<=B2, "Yes", "")

然后根据需要将公式向下拖动多个行。如果您的工作表变宽或变宽,只需将Z更改为您的最后一列。


2
投票

如果您不知道范围的大小,请使用函数rowcolumnrowscolumns


简单的公式

这是你正在寻找的一个例子:

=if(INDEX(FILTER(OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1),OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)<>""),1)<=B2,"yes","")

这部分公式:

  • OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)

返回从给定单元格(D2)到Sheet结尾的范围(COLUMNS(1:1)-column(D2)+1


ARRAYFORMULA

我建议使用ArrayFormula,它会自动扩展:

=ARRAYFORMULA(if(REGEXEXTRACT(SUBSTITUTE(trim(transpose(query(transpose(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)),,COLUMNS(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)))))," ",", "),"\d+")*1<=OFFSET(B2,,,COUNTA(A2:A)),"yes",""))

它假定'Item'列没有空值。


2
投票

来自@Max Makhrov的解决方案有效,并且具有为整列使用单一公式的优势。但是,它假设您的ready列(D)右侧的所有列都是need_列。

@dmusgrave的解决方案也有效,只要你在INDEX=IF(INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes","")之前删除额外的“=”。但是,它做出了相同的假设,并且在Z列也有限制。

这样的假设似乎是合理的,但是如果它们限制了你,那么你可以在need_专栏的右边找到任意数量的ready列:

=IF(INDEX(FILTER(INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&row() ), INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1,4)="need")))&row() )<>""),1)<=B2,"Yes","")

这个想法只是通过以下方式取代D2:Z2(在@dmusgrave的解决方案中):

INDIRECT( "D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&row() )

说明:从当前行的D开始,直到同一当前行的最后一个need_列。 CHAR(68)D,你可以在其中添加标题为need.*的列数减1(因此为67)。

使用相同的逻辑,您可以轻松地使您的公式更健壮/通用,例如没有need_列从ready列开始,等等。

© www.soinside.com 2019 - 2024. All rights reserved.