【问题标题】:Index-Match to Return Adjacent Cell of Closest Matched Value索引匹配以返回最接近匹配值的相邻单元格
【发布时间】:2013-09-04 17:08:27
【问题描述】:

这是我的 2 个表格的简化版本:

我需要能够根据相邻测量值与 Table1 中该测量和类型的值的最接近匹配来填充 Table2 中的缺失值.

例如,在第 18 行,我需要查找单元格 B18 [4.3] 与单元格 B3B11 最接近的匹配项(因为这两个是唯一的 A 类记录),并将最接近匹配的相邻 measurement2 返回到单元格 C18 中。或者,在第 19 行,我需要在单元格 C6:C8 中查找最接近的单元格 C19 [2.3] 匹配并返回相邻的 measurement1 进入单元格 B19

【问题讨论】:

  • 但是在这种情况下,A 的 5.5 和 3.1 都与 4.3 相差 1.2。什么给了?
  • 啊,是的,你是对的,没听懂。我想我必须在这些情况下返回更高或更低的匹配,并在整个项目中保持一致。

标签: excel excel-formula excel-2010 vba


【解决方案1】:

我会以不同的方式设置表 2,如下所示:

单元格 D18 中的 数组 公式并向下复制为:

=INDEX(IF(B18=$B$2,$C$3:$C$12,$B$3:$B$12),MATCH(MIN(IF($A$3:$A$12=A18,ABS(IF(B18=$B$2,$B$3:$B$12,$C$3:$C$12)-C18))),IF($A$3:$A$12=A18,ABS(IF(B18=$B$2,$B$3:$B$12,$C$3:$C$12)-C18)),0))

为了确认一个数组公式,您需要使用 Ctrl+Shift+Enter 而不是 Enter。

【讨论】:

  • 这对tigeravatar也很有效。而且绝对是一种更有效的方式。但是为了不必重新组织我的数据,我会接受 Jerry 的建议。谢谢!
【解决方案2】:

好的,我不知道是否可以进一步简化(公式中有两次计算),但我为单元格C18想出了这个:

=INDEX(C$3:C$12,MATCH(9^99,IF(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))),C$3:C$12)))

对于单元格 B19:

=INDEX(B$3:B$12,MATCH(9^99,IF(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19))=MIN(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19),999)),B$3:B$12)))

EDIT2: 正如 barryhoudini 指出的那样,他的公式纠正了其中的一个错误。我编辑了以上两个公式。否则,正如他正确提到的,您也可以将这个公式用于 C18:

=LOOKUP(9^99,IF(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))=MIN(IF($A$3:$A$12=$A18‌​,ABS($B$3:$B$12-$B18))),C$3:C$12))

注意事项:

  1. 这些是数组公式,仅适用于 Ctrl+Shift+Enter 而不仅仅是 Enter kbd>.

  2. 公式将获取表中的最后一个匹配项,在这种情况下,对于 A 的 measure1 为 4.3,如果存在相同的差异,它将返回 2.8。

EDIT1:好的,为了保持一致性,我想出了这个总是在 B19 中获得更高的匹配度:

EDIT3:并使用LOOKUP 而不是INDEX/MATCH 来获得更短的公式,并且还修复了第一列问题。

=LOOKUP(9^99,IF(MAX(IF(ABS($C$3:$C$12-$C19)=MIN(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19),999)),C$3:C$12))=IF(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19))=MIN(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19),999)),C$3:C$12),IF(ABS($C$3:$C$12-$C19)=MIN(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19),999)),B$3:B$12)))

这个是 C18 的:

=LOOKUP(9^99,IF(MAX(IF(ABS($B$3:$B$12-$B18)=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18),999)),B$3:B$12))=IF(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18),999)),B$3:B$12),IF(ABS($B$3:$B$12-$B18)=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18),999)),C$3:C$12)))

对于较低的匹配,B19:

=LOOKUP(9^99,IF(MIN(IF(ABS($C$3:$C$12-$C19)=MIN(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19),999)),C$3:C$12))=IF(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19))=MIN(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19),999)),C$3:C$12),IF(ABS($C$3:$C$12-$C19)=MIN(IF($A$3:$A$12=$A19,ABS($C$3:$C$12-$C19),999)),B$3:B$12)))

对于 C18:

=LOOKUP(9^99,IF(MIN(IF(ABS($B$3:$B$12-$B18)=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18),999)),B$3:B$12))=IF(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18),999)),B$3:B$12),IF(ABS($B$3:$B$12-$B18)=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18),999)),C$3:C$12)))

EDIT4: 对于两种类型:

=LOOKUP(9^99,IF(MAX(IF(ABS($C$3:$C$12-$C19)=MIN(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19),999)),C$3:C$12))=IF(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19))=MIN(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19),999)),C$3:C$12),IF(ABS($C$3:$C$12-$C19)=MIN(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19),999)),B$3:B$12)))

这个是 C18 的:

=LOOKUP(9^99,IF(MAX(IF(ABS($B$3:$B$12-$B18)=MIN(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18),999)),B$3:B$12))=IF(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18))=MIN(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18),999)),B$3:B$12),IF(ABS($B$3:$B$12-$B18)=MIN(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18),999)),C$3:C$12)))

对于较低的匹配,B19:

=LOOKUP(9^99,IF(MIN(IF(ABS($C$3:$C$12-$C19)=MIN(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19),999)),C$3:C$12))=IF(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19))=MIN(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19),999)),C$3:C$12),IF(ABS($C$3:$C$12-$C19)=MIN(IF(($A$3:$A$12=$A19)*($D$3:$D$12=$D19),ABS($C$3:$C$12-$C19),999)),B$3:B$12)))

对于 C18:

=LOOKUP(9^99,IF(MIN(IF(ABS($B$3:$B$12-$B18)=MIN(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18),999)),B$3:B$12))=IF(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18))=MIN(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18),999)),B$3:B$12),IF(ABS($B$3:$B$12-$B18)=MIN(IF(($A$3:$A$12=$A18)*($D$3:$D$12=$D18),ABS($B$3:$B$12-$B18),999)),C$3:C$12)))

【讨论】:

  • 杰瑞很棒!只是为了与我的原始帖子保持一致,供未来的观众使用,您的等式列出了 $C16 和 $B15,我将使用 $C19 和 $B18 作为我的表格。显然只是你如何在你的桌子上设置它的残余,但只是想我会补充一点。谢谢!
  • @John 哦,哎呀,你说得对,我把 table2 放在 table1 之后 ^^;。我会立即更改。
  • @tigeravatar 在某些时候,我不知道如何只生成更高或更低的,所以我只是复制粘贴了一段时间 ^^;肯定有更短的方法,哦,好吧。
  • 如果表中有重复的值,你会得到错误的答案,例如如果您将表中的 B12 更改为 3.1,您的第一个 C18 公式会从 C12 返回 3.4,尽管 A12 是“B”。您需要在 MATCH 的查找值中复制 MIN(IF 部分的条件以停止:=INDEX(C$3:C$12,MATCH(9^99,IF(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))),C$3:C$12)))......或者您可以使用 LOOKUP 而不是 INDEX/MATCH 来缩短它,即=LOOKUP(9^99,IF(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))=MIN(IF($A$3:$A$12=$A18,ABS($B$3:$B$12-$B18))),C$3:C$12))跨度>
  • @John 这是该网站所做的。得到错误后,excel应该突出显示导致错误的部分。只需退格几次并重写相同的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2019-12-14
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多