繁体   English   中英

Excel-复杂的索引/匹配/匹配查找

[英]Excel - Struggling with complex Index/Match/Match lookup

我有一张有9列和大约6000行的表格。 每行都有一个价格作为最后一列。 这些价格中的一些价格应为0.00。

在另一个工作表中,我有大约3700行的“原始”表。 我需要的价格在这些行中。 但是,原始表在行中水平放置价格,每个行旁边是具有特定gal范围的单元格。 基本上,我的表格在每个位置/ gal范围/价格组合中都有唯一的行,原始表在单个位置行中依次包含所有gal范围/价格

例如,原始表中的一行如下所示:

... / 1-2000 / 2.8383 / 2001-4000 / 2.5382 / ...

在我的新表中,它们看起来像这样:

... / 1-2000 / 2.8383
... / 20001-4000 / 2.5382
etc

除了这些gal范围和价格以外,我的新表和原始表中的所有内容都相同。

我想做的是使用数组多个条件索引/匹配(基于新表和原始表中的3个单元格)查找行,找到与gals范围匹配的值,然后取价格在该gal范围单元格的右侧。

这是我要在新表中获取值的行: 新表中的行

这是原始表中具有我需要的值的行: 原始表中具有值的行

以下是我构建的公式的详细信息:

INDEX(old!$A$2:$Q$3755,MATCH(1,(A29=old!$A$2:$A$3755)*(F29=old!$F$2:$F$3755)*(G29=old!$G$2:$G3755),1),MATCH(H29,old!$J$2:$Q$3755,1)+1)

第一个标准的Index / Match部分效果很好...我为表建立了索引,然后Match以找到该行。 如果我只输入Col的数字(例如1、2、3),它将从相应的单元格中完美地返回值。 但是,我似乎无法使Col匹配部分起作用...我不断收到REF和N / A错误。

进行双向搜索是否有技巧? 似乎只需要在行中找到该值并在...之后获取下一个单元格就很简单了。

我要寻找的gal范围值不是唯一的……至少有20个其他引用具有相同范围(例如“ 1-2000”)。 有没有一种方法可以将col匹配限制为我仅找到的行匹配?

任何帮助是极大的赞赏。

谢谢,瑞克

解决这种情况的一种方法是使用#powerquery

请参考本文以了解如何在您的Excel版本上使用Power Query Excel 2010 Professional Plus和更高版本中可用。 我的演示使用Excel 2016

这些步骤是:

  1. 将旧数据加载/添加到Power Query Editor。 我的样本数据只有一行,但数千行却相同。

样本数据

  1. 使用“ Transform选项卡下的Transform 合并列”功能将前7列与定界符(例如分号)合并; ;
  2. 用相同的分隔符对每对GALLONSTOTAL PRICES重复合并列 ; 如果正确完成操作,则应具有以下内容:

合并的

  1. 使用“ Transform选项卡下的Transform 取消透视列”功能GALLONS;TOTAL PRICE所有合并列,然后删除“ Attribute列;

非透视

  1. 使用“ Transform选项卡下的Transform 拆分列”功能按定界符拆分每列; 如果正确完成操作,则应具有以下内容:

Splited

  1. GALLONS范围列中创建一个重复列 (这是上述屏幕截图中的倒数第二列),然后用定界符-分割原始的GALLONS范围列。 然后,您应该具有:

Splited2

  1. 根据需要重命名列标题;

改名

  1. 关闭新表并将其加载到新工作表(默认情况下),或者您可以更改默认设置并为新表创建连接并将其加载到工作簿中的所需位置。

产量

第二个表是输出表,您可以从这个新表执行INDEX + MATCH ,这应该比从旧表容易得多。 如果数据相同但结构不同,则可以只使用输出表,而不必担心查找缺失的价格。

我在源表中添加了一条测试行,这是单击按钮后的刷新输出:

输出2

这是幕后的功率查询M代码,仅供参考。 所有步骤都使用编辑器的内置功能执行,非常简单。

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"IATA", Int64.Type}, {"ST", type text}, {"FUELER", type text}, {"UPDATED", type datetime}, {"RESTRICTIONS", type text}, {"BASEF UEL", type text}, {"NOTES", type any}, {"GALLONS1", type text}, {"TOTAL PRICES1", type text}, {"GALLONS2", type text}, {"TOTAL PRICES2", type text}, {"GALLONS3", type text}, {"TOTAL PRICES3", type text}, {"GALLONS4", type text}, {"TOTAL PRICES4", type text}, {"GALLONS5", type text}, {"TOTAL PRICES5", type text}}),
    #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Changed Type", {{"IATA", type text}, {"UPDATED", type text}, {"NOTES", type text}}, "en-AU"),{"IATA", "ST", "FUELER", "UPDATED", "RESTRICTIONS", "BASEF UEL", "NOTES"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged"),
    #"Merged Columns1" = Table.CombineColumns(#"Merged Columns",{"GALLONS1", "TOTAL PRICES1"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged.1"),
    #"Merged Columns2" = Table.CombineColumns(#"Merged Columns1",{"GALLONS2", "TOTAL PRICES2"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged.2"),
    #"Merged Columns3" = Table.CombineColumns(#"Merged Columns2",{"GALLONS3", "TOTAL PRICES3"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged.3"),
    #"Merged Columns4" = Table.CombineColumns(#"Merged Columns3",{"GALLONS4", "TOTAL PRICES4"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged.4"),
    #"Merged Columns5" = Table.CombineColumns(#"Merged Columns4",{"GALLONS5", "TOTAL PRICES5"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged.5"),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Merged Columns5", {"Merged"}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Columns",{"Attribute"}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Removed Columns", "Merged", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"Merged.1", "Merged.2", "Merged.3", "Merged.4", "Merged.5", "Merged.6", "Merged.7"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Merged.1", Int64.Type}, {"Merged.2", type text}, {"Merged.3", type text}, {"Merged.4", type datetime}, {"Merged.5", type text}, {"Merged.6", type text}, {"Merged.7", type text}}),
    #"Split Column by Delimiter1" = Table.SplitColumn(#"Changed Type1", "Value", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"Value.1", "Value.2"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Split Column by Delimiter1",{{"Value.1", type text}, {"Value.2", type text}}),
    #"Duplicated Column" = Table.DuplicateColumn(#"Changed Type2", "Value.1", "Value.1 - Copy"),
    #"Reordered Columns" = Table.ReorderColumns(#"Duplicated Column",{"Merged.1", "Merged.2", "Merged.3", "Merged.4", "Merged.5", "Merged.6", "Merged.7", "Value.1 - Copy", "Value.1", "Value.2"}),
    #"Split Column by Delimiter2" = Table.SplitColumn(#"Reordered Columns", "Value.1", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"Value.1.1", "Value.1.2"}),
    #"Changed Type3" = Table.TransformColumnTypes(#"Split Column by Delimiter2",{{"Value.1.1", Int64.Type}, {"Value.1.2", Int64.Type}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type3",{{"Merged.1", "IATA"}, {"Merged.2", "ST"}, {"Merged.3", "FUELER"}, {"Merged.4", "UPDATED"}, {"Merged.5", "RESTRICTIONS"}, {"Merged.6", "BASEF UEL"}, {"Merged.7", "NOTES"}, {"Value.1 - Copy", "GALLONS"}, {"Value.1.1", "Min Fuel"}, {"Value.1.2", "Max Fuel"}, {"Value.2", "TOTAL PRICE"}}),
    #"Changed Type4" = Table.TransformColumnTypes(#"Renamed Columns",{{"UPDATED", type date}})
in
    #"Changed Type4"

这可以通过索引/匹配来完成,但是您必须保持冷静。

我的截图供参考

在此处输入图片说明

F7单元格中的公式为

=INDEX(
INDEX(A2:A3,MATCH(B7&C7&D7,INDEX(A2:A3&C2:C3&F2:F3,0),0))
  :INDEX(L2:L3,MATCH(B7&C7&D7,INDEX(A2:A3&C2:C3&F2:F3,0),0)),
MATCH(E7,
     INDEX(A2:A3,MATCH(B7&C7&D7,INDEX(A2:A3&C2:C3&F2:F3,0),0))
     :INDEX(L2:L3,MATCH(B7&C7&D7,INDEX(A2:A3&C2:C3&F2:F3,0),0)),0)
+1)

解释:首先,我们在A列上建立一个Index,以找到具有三个值的串联的行。 这与并运算符结合:使用相同的Match在列L上具有索引。

该索引将返回一行数据,从A列到L列。然后用作另一个Index / Match的范围参数,其中在该行数据Match中查找“ g值”并加1将其移动到找到的单元格的右边。

请注意,您不希望此公式中有整列,因为计算起来会很慢。

这是另一种方法,根本不使用索引/匹配,而是使用Sumproduct。 在F7中:

=SUMPRODUCT($B$2:$L$3,($A$2:$A$3=B7)*($C$2:$C$3=C7)*($F$2:$F$3=D7)*($A$2:$K$3=E7))

请注意,使用B到L的第一个范围以及A到K的最后一个范围可以实现一列的偏移。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM