搜索列A以匹配列C中的数字如果为True则返回列B如果为false则返回“0”

时间:2015-05-21 15:27:41

标签: excel

我试图以15分钟的增量收集数据,看起来像是以5分钟为增量收集的数据,空格为零。我创建了一个列,其中Julian日期/时间以15分钟为增量(A),一列具有Julian日期/时间,以5分钟为增量(C),15分钟增量数据在B列中。我创建了一个简单的公式检查所有A列是否与C列完全匹配如果为true我需要它返回对应于A列匹配的B列,如果为false则返回0。

这是我到目前为止所拥有的??????是缺少真正的回报公式。返回B列中相应数据的公式是什么?

=IF(ISNUMBER(MATCH(C2,D:D,0)),"?????????","0")

4 个答案:

答案 0 :(得分:3)

处理此类查找的常用方法是使用INDEX-MATCH。您也可以使用VLOOKUP,但我总是更喜欢INDEX-MATCH

范围图片显示C列中的5分钟时间,以及F列中的15分钟数据。

showing ranges

C1中的

公式INDEX-MATCHIFERROR的组合。 IFERROR用于处理未找到值的情况并返回您想要的0

=IFERROR(INDEX($F$1:$F$11,MATCH(B1,$E$1:$E$11,0)),0)

该公式可以从C1复制到5分钟结束。

答案 1 :(得分:3)

您的示例公式看起来使用了您的叙述所描述的不同列。我将使用我在描述中理解的列作为列。为清晰起见,请参阅下面的示例图片。

时间查找是15 digit precision floating point errors的主要候选者。这是由于时间的基本性质是一天的小数部分以及显示60分钟和24小时所固有的重复小数。这个问题通常通过使用渐进式进展与基准增长来放大。

如果您在A2中有基准时间并希望创建一系列15分钟的增量以填充该列,请不要使用以下内容:

=TIME(0,15,0)+A2     ◄ generates incremental error growth

当您填写该公式时,任何错误都会在您填写时成倍增加。您的基本分钟显示可能不会显示任何明显的错误,但如果它显示为秒,您可能会发现每隔几百行添加或减去额外的秒数。这称为增量误差扩展,其中每个连续行都会增加前一个公式生成的误差。简而言之,如果一列中有这些公式中的一百个,那么第一个中的任何错误都会被最后一个错误乘以100。

通过始终将顺序时间公式基于A2,将误差最小化为a 单一计算。将公式更改为,

=TIME(0,ROW(1:1)*15,0)+A$2    ◄ datum growth based on minutes added to A2

即使使用基准增长公式,您也可能在完全匹配时遇到一些错误。最好将公式包装在MROUND function中,以允许您将返回值四舍五入到指定的倍数;在这种情况下,到最近的第二个。

=MROUND(TIME(0, ROW(1:1)*15,0)+A$2, TIME(0, 0, 1))

向下填写以获得一个渐进的值列,增量为15分钟。您可能看不到显示值的任何差异,但用于查找的原始基础值将完全不同。这个原则被称为基准增量;例如所有累进数字均基于对原始数据的单一计算。

因此,使用A2中的时间值,这些是应该使用的公式。

8:30:00 AM                                           ◄ starting time value in A2
=MROUND(TIME(0, ROW(1:1)*15,0)+A$2, TIME(0, 0, 1))   ◄ in A3 add 15 minutes to A2 (fill down as necessary)
=A2                                                  ◄ starting time value in C2
=MROUND(TIME(0, ROW(1:1)*5,0)+C$2, TIME(0, 0, 1))    ◄ in C3 add 5 minutes to C2 (fill down as necessary)

这些将产生最精确的时间增量,用于完全匹配查找。

现在,您可以应用与VLOOKUP function配对的INDEX functionMATCH function来检索B列中的值。IFERROR function将捕获不匹配并输出 0 而不是#N/A错误。

Iime Increments as Datum

D栏中的公式使用INDEX / MATCH对。 D2是,

=IFERROR(INDEX($B:$B, MATCH(C2,$A:$A, 0)), 0)

使用VLOOKUP在E2中有一个替代公式,

=IFERROR(VLOOKUP(C2,$A:$B, 2, FALSE), 0)
  

警告:TIME function可以应用最多分钟数。这是有符号整数的最大正值或32,767(约为22¾天的分钟数)。

答案 2 :(得分:1)

您可以完全取消查找,只需使用索引函数来引用所需的单元格:

Formula

答案 3 :(得分:0)

关于Is a comment warning enough when dealing with potential data loss?=TIME(0,ROW(1:1)*15,0)+A$2我提醒说,应用“自由”可能存在丢失数据的风险。可能取决于机器规格等,但试图用该公式填充大部分列我的Excel崩溃(尝试1-1 / 2小时的大部分时间)。我会对其他人的经历感兴趣,部分原因是处理最不重要的数字可能与处理器有关。

在我的机器上,我尝试比较:

=TIME(0,ROW(1:1)*15,0)+A$2  

=TIME(0,15,0)+B2  

超过1,000行(即大约10-1 / 2天的季度小时)并发现差异(计算,因此可能导致进一步的不准确)。主要区别在于后者考虑了日期变化(数字格式中的整数部分),而前者则没有。允许超过1,000个数据点的整数差异,大约有30个不同的数字格式为0.00000000000003,另外10个左右的数量小得多。

最后一个数据点(第10天上午09:45)是表现出较大差异的数据之一(尽管不是一系列较小差异的累积)。 任何差异都足以导致无法进行完全匹配,但在几秒钟内我估算的差异大约为0.000000002592,比如〜0.0000026毫秒或〜{{ 1}}纳秒。

因为在我看来这一天(整数部分)可能很有用,我建议在一个单元格中输入26并在下一个单元格中输入0,然后向下拖动以适应系列填充。这没有性能影响,因为单元格内容是值而不是公式。对于最后一个条目,这产生了00:15:00的差异,即大约是上述的两倍,并且在一些情况下大约为0.00000000000005,大约78纳秒。

随着四舍五入到第二个,存在相似数量级的差异。但是,使用EXACT对最后一个系列填充结果(使用0.00000000000009的最后一个结果进行舍入到第二个)的比较将返回“TRUE”。

整列的系列填充花了我大约3秒钟。然后用另一列中的公式将其舍入到一秒钟约12秒。