簡體   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