Excel中的复杂查找功能使用4个不同的查找参数

时间:2015-07-07 17:19:20

标签: excel excel-vba excel-formula vlookup vba

我正在研究excel数据库中的一个项目,并尝试匹配4个不​​同的属性,这些属性都有自己的列(A,B,C,D),以便在不同的页面上找到相应的值(Sheet2!)。一张纸2再次在它们自己的列(B,C,D,E)中找到这些值,如果所有值都匹配,则需要A列Sheet2中的值!在sheet1的E列中显示!

问题在于Sheet1上的值经常出现!将能够在Sheet2上匹配多达12个不同的唯一行!只有VBA的中级经验才能让这难以置信。可以存在符合所有条件的重复项。并且当发生这种情况时,我想返回匹配的第一个项目,只要在该项目上没有进行上一个匹配。

为了向您提供更多信息,我们根据速度为产品提供了不同的值,以指定它们所属的位置。这将它们分成了Section#,ShelvingType,Verticle和Horizo​​ntal Location。我们希望将这些值与我们之前存在的具有相应(匹配)数字或文本值的位置的值相匹配。

更详细地说,在第一张表格中,我们的产品具有值应该去的地方。一张二张纸具有预先存在的位置,产品可以使用这些位置具有对该位置具有代表性的值。因此,我们希望将产品新的位置值从第一页开始,并匹配第二页上的现有位置值。问题是,对于每个位置,最多有12个产品可以去那里。所以,我们想要说明product1进入第一个匹配值的位置,而product2进入下一个匹配值的位置,依此类推第四个

2 个答案:

答案 0 :(得分:0)

假设您的数据从第2行开始(标签的第1行):

{MATCH(A1&B1&C1&D1,B2:B100&C2:C100&D2:D100&E2:E100,0)}

以上是数组公式,因此您不必输入大括号{。 输入公式

后,只需按Ctrl + Shift + Enter即可

More info

答案 1 :(得分:0)

已修改以删除之前的回复

根据您的进一步阐述,如果我理解正确,我同意@Aaron Contreras留下的评论。您应该创建帮助列,其中显示所有条件匹配的“唯一ID”,以及随着找到相同条件代码的更多项而增加的其他帮助列。这将成为该项目的“超唯一”ID。

此时我不认为数组公式是可能的,但我会在答案中留下第一个匹配标准的结果,而不会进一步消除“先前使用的”结果。这可能会进一步完善,但我怀疑它比仅使用我在下面的响应中显示的帮助列更优雅。至少,我无法弄清楚如何优雅地做到这一点。

总结我的假设:

- 你的可用空间在sheet1中;列A包含类似于可用空间位置的内容,列B-E包含将存储在那里的任何内容的标准。 - 您要放置在某个位置的新项目列表位于sheet2中; columnA将是我们的公式所在的位置,显示放置该项目的可用位置。

在Sheet1上输入 在sheet1的F列中,向下拖动此公式:

  

= B1&安培; C1&安培; D1&安培; E1   这将创建将来要搜索的唯一ID密钥。

但是,由于sheet1上的相同条件会有多次点击(因为多个位置可以保持相同的内容),我们需要通过显示已经发生标准组合的次数来使每一行“更独特”。因此,该公式将在sheet1的G列中,从单元格G1开始并向下拖动:

  

= F1&安培; COUNTIF($ F $ 1:F1,F1)   当你向下拖动时,这将计算特定标准组合在sheet1上出现的第n次。

在Sheet2上输入 在Sheet2中,在F&列中创建相同的列。 G.公式将完全相同,它们只是引用sheet2而不是sheet1。

然后,从A1向下拖动的工作表2中A列中的公式为:

  

=指数(Sheet 1中!A:A,匹配(G1,工作表Sheet G:!G,0))

这将首次发现所有条件与sheet1匹配,第n次在第2页上使用此条件。

如果我有任何遗漏,请告诉我。

未完成的数组方法 同样,阵列响应是可能的,但对于您的目的可能是不必要的;无论如何,您应该拥有所有组合的唯一ID。但是,如果你想使用数组方法,你可以这样(不考虑使用的多个位置;仅在你想要接受它时留待参考):

在sheet2中,在第1行输入以下公式[使用CTRL + SHIFT + ENTER确认而不是仅使用ENTER,每次更改公式],使用不同的条件(并向下复制):

  

=指数(Sheet 1中!A1:A100,匹配(1,(Sheet 1中B1:B100 = B1)(Sheet 1中C1:C100 = C1)(Sheet 1中D1:D100 = D1) *(!Sheet 1中E1:E100 = E1),0))

这使用“TRUExTRUE = TRUE; TRUExFALSE = FALSE; FALSExFALSE = FALSE”的固有布尔逻辑来查找所有条件匹配的第一行。请注意,我没有在所有列中完成此操作,因为对于Array公式,这是一个重要的资源占用。