[英]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 。
這些步驟是:
Transform
選項卡下的Transform
合並列”功能將前7列與定界符(例如分號)合並;
; GALLONS
和TOTAL PRICES
重復合並列 ;
。 如果正確完成操作,則應具有以下內容: Transform
選項卡下的Transform
取消透視列”功能GALLONS;TOTAL PRICE
所有合並列,然后刪除“ Attribute
列; Transform
選項卡下的Transform
拆分列”功能按定界符拆分每列;
。 如果正確完成操作,則應具有以下內容: GALLONS
范圍列中創建一個重復列 (這是上述屏幕截圖中的倒數第二列),然后用定界符-
分割原始的GALLONS
范圍列。 然后,您應該具有: 第二個表是輸出表,您可以從這個新表執行INDEX + MATCH ,這應該比從舊表容易得多。 如果數據相同但結構不同,則可以只使用輸出表,而不必擔心查找缺失的價格。
我在源表中添加了一條測試行,這是單擊按鈕后的刷新輸出:
這是幕后的功率查詢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將其移動到找到的單元格的右邊。
請注意,您不希望此公式中有整列,因為計算起來會很慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.