我想查找日期范围内的文本数作为数组中的条件1和条件2

时间:2019-05-25 17:28:06

标签: excel-formula

我想对条件1为日期范围(从日期到日期)的数组(以下:表:列表)中的值(N / D)的数量进行计数,条件2为Shift A,b acros(如图所示)在下面的表输出中)。我想在D / N列中填入一个日期范围内发生D / N次数并转换A,B,C,D?

输出

From Date   Through Date    Shift   D/N
25-May-19   26-May-19         A      ?
25-May-19   26-May-19         B      ?

表列表

Dates       A   B   C   D
25-May-19   N   D   -   -
26-May-19   N   D   -   -
27-May-19   -   D   N   -



INDEX(A:E,MATCH(H7:I7,A:E,0),MATCH(J7,A:E,0))

值-?

1 个答案:

答案 0 :(得分:0)

您可能遇到的部分问题是日期。确保您的日期是excel日期,而不是看起来像日期的字符串/文本。仅仅更改单元格的格式并不能使其成为日期,它只是告诉excel如何尝试在单元格中显示信息。

excel中的日期存储为整数,它们表示自1900/1/1以来的日期,该日期为第1天。测试单元格是否包含日期或字符串的最简单方法之一是:

=ISTEXT(A1)
or
=ISNUMBER(A1)

Where A1 is the cell with the date to be tested.

如果第一个公式返回TRUE,则为字符串/文本。 FALSE表示它是一个数字。相反的TRUE和FALSE结果适用于第二个公式。

在公式中,如果在引号“”之间包含某些内容,它将被解释为字符串。所以类似"<=19/05/26"的意思是它在寻找一个小于该字符串的字符串,而不是一个小于该字符串的日期。要进行日期比较,可以将文本比较与包含要与"<="&B2进行比较的日期的单元格连接起来,其中B2有日期,或者如果您想对其进行硬编码,请使用类似{{1} }

为了使以下解决方案有效,您的日期都需要存储为数字。 AKA Excel序列日期格式。

根据下图所示的布局数据,您可以使用COUNTIFS,INDEX和MATCH来获取所需的日期。我建议您分别找到D和N的数量,然后将它们总数相加。但是,如果要在单个单元格公式解决方案中使用它,则可以实现该效果,也可以通过N列中的结果证明。但是,该公式开始变长,以后可能很难读取/维护。

该解决方案的核心将是COUNTIFS函数。 COUNTIFS函数的格式如下:

"<="&Date(19,05,26)

让我们一次开始建立一个公式标准。第一个条件是所有大于或等于起始日期的日期。如果只希望起始日期之后的日期,请删除等号或条件。

COUNTIFS(Range to count 1, Criteria 1, Range to count 2, Criteria 2,...,Range to count n, Criteria n)

请注意$以锁定单元格引用。这样做是为了使公式被复制时,$旁边的列或行引用不会更改。

第二个条件类似于第一个条件,只是您要获取所有小于或等于结束日期的日期。再次添加/删除等号以满足您的需求。

=COUNTIFS($A$2:$A$4,">="&$G2,

下一个条件是获取与列标题D或N匹配的所有单元格。现在让我们只关注D。棘手的部分是定义要查找的列。现在让我们调用该列以查找XXX,这将使公式变为:

=COUNTIFS($A$2:$A$4,">="&$G2,$A$2:$A$4,"<="&$H2,

现在,为了定义XXX,INDEX和MATCH将成为您的朋友。关于INDEX的重要注意事项是它不直接返回单元格的值,而是返回单元格地址,后者又拉出一个单元格值。 INDEX的基本格式为:

=COUNTIFS($A$2:$A$4,">="&$G2,$A$2:$A$4,"<="&$H2,XXX,J$1)
OR
=COUNTIFS($A$2:$A$4,">="&$G2,$A$2:$A$4,"<="&$H2,XXX,"="&J$1)

NOTE: both formulas are the same.  When no comparison operator is provided
      it is taken as "=" by default. 

那是二维范围。如果您的范围是一维的,可以是一列,也可以只是一行,那么仅需要提供第二个参数“ Range's Row ...”,它表示列表要走多远。

关于2D索引的有趣之处在于,当为ROW或Column提供0时,而不是抛出错误,而是返回所有行或列。这很重要,因为您只需要1个特定列的所有行。这意味着您的INDEX公式将开始看起来像:

INDEX(Range to look in, Range's ROW to look in, Range's COLUMN to look in)

因此,现在您需要查找特定的列号。那是MATCH将成为您朋友的地方。 MATCH采用以下格式:

INDEX($B$2:$E$4,0,SPECIFIC COLUMN NUMBER)

您已经知道要尝试匹配shift列,以便将其作为您的查找值,而查找范围将是您的列标题。在这种情况下,您想要的搜索类型是完全匹配,并由0表示。这意味着您的MATCH公式如下所示:

MATCH(Value to find, 1D range to look in, what type of search)

现在要组合各个部分,将MATCH公式放入您的INDEX中并替换“ SPECIFIC COLUMN ...”。您的INDEX现在将如下所示:

MATCH($I2,$B$1:$E$1,0)

上面的公式现在可以替换您的COUNTIFS公式中的XXX,您将获得:

INDEX($B$2:$E$4,0,MATCH($I2,$B$1:$E$1,0))

将上述公式放在J2中,然后将单元格向下和向右复制。

在L2中,使用两个公式之一获取日期范围内D和N的总数:

=COUNTIFS($A$2:$A$4,">="&$G2,$A$2:$A$4,"<="&$H2,INDEX($B$2:$E$4,0,MATCH($I2,$B$1:$E$1,0)),J$1)

现在要将您的公式全部放在一个单元格中,请看上面的第二个公式。您可以简单地转到单元格J2的内容并复制整个公式。然后编辑单元格L2,并使用复制的公式替换J2的单元格引用。通过复制K2中的公式并替换L2中对K2的引用来重复此过程。您将得到一个类似于以下内容的公式:

=SUM(J2:K2)
OR
=J2+K2

阅读起来又长又难,这就是为什么我建议将公式分别分解为D和N的部分。

POC

现在,作为一种替代方法,您可以使用SUMPRODUCT并进行阵列操作。您要放置在I2中并向下正确复制的SUMPRODUCT公式可能是:

=COUNTIFS($A$2:$A$4,">="&$G2,$A$2:$A$4,"<="&$H2,INDEX($B$2:$E$4,0,MATCH($I2,$B$1:$E$1,0)),J$1)+COUNTIFS($A$2:$A$4,">="&$G2,$A$2:$A$4,"<="&$H2,INDEX($B$2:$E$4,0,MATCH($I2,$B$1:$E$1,0)),K$1)