我在 Excel 中使用了 2 个数据库。它们是互联网速度测试,将用户输入的地址和实际速度测试分为 2 个数据库。地址表和速度测试表没有唯一标识符将它们链接在一起(哎呀!),但它们有时间戳。
我想使用时间戳作为标识符。如何进行查找,测试时间戳值是否出现在查找值之前或之后的 15 分钟。
答案1
如果您能提供一些示例数据,那会很有帮助。我猜测了一下,并编造了一些可能与您的数据相似的数据,希望公式工作原理的解释能让您将其调整到您的数据结构中。
您的问题主要在于如何在一列中找到与另一列中的时间相差 15 分钟的时间。下表中的时间戳列实际上是完整的日期时间,但格式为仅显示小时和分钟。
E3 中的数组公式为:
=IFERROR(INDEX(D$3:D$52,MATCH(1,(1*(24*60*ABS(B3-D$3:D$52)<=$H$3)),0)),"")
必须先输入CTRLShiftEnter,然后填写。
它的工作原理如下:内部表达式ABS(B3-D$3:D$52)
生成一个数组,其中包含 B3 中的时间与 D 列中所有时间之间的绝对差值。结果是一个数字,其中小数部分表示两个日期时间之间的天数的小数部分。乘以 24*60 将其转换为分钟,不等式检查这些值是否小于 H3 中的分钟数(最初为 15,但稍后会详细介绍)。
此时,表达式(24*60*ABS(B3-D$3:D$52)<=$H$3)
将生成一个 True/False 值数组,对应于 B3 是否在 D 列时间的 15 分钟内。乘以 1 会将 True/False 值转换为 1 和 0。
现在 MATCH() 找到数组中第一个 1 的位置,INDEX() 从 D 列生成相应的时间。最后,如果在 +/- 15 分钟内未找到匹配的时间,则 IFERROR() 生成空白(而不是 #N/A)。
F3 中的这个公式: =IFERROR(INDEX(C$3:C$50,MATCH(E3,D$3:D$50,0)),"")
只是在 D 列中查找 E 列的时间,并从 C 列返回相应的速度。
最后,G3 中的这个公式:=IF(SUMPRODUCT(1*(24*60*ABS(B3-D$3:D$52)<=$H$3))>1,"Yes","")
检查错误。它将内部表达式中的 1 和 0 数组相加,如果答案大于 1,则生成“是”。这意味着在 B 列中的时间的 15 分钟内有 2 个或更多时间。MATCH() 函数只会找到第一个,这可能不正确。解决这个问题的方法是减少 H3 中的值,直到“是”从给定行中消失。此时,E 列中的时间是与 B 列中的时间最接近的单个时间。
我希望您发现这有帮助。
笔记:
我为 B 列和 D 列生成了随机时间,因此 B 列中的某些时间在 D 列中没有匹配的时间(+/- 15 分钟)。如果您的数据没有不匹配项,则可以删除 IFERROR 包装器。
据推测您的数据库正在增长,因此您可以在公式中使用整列引用(例如 D:D)。