【问题标题】:Excel - Return adjacent value from multiple columnsExcel - 从多列返回相邻值
【发布时间】:2020-02-11 00:25:00
【问题描述】:

我有一个结构化的报告,我需要将值直接返回到单元格的右侧。

Example:
A   B      C   D   E   F    G  H
1  Red     4 Green 6 Orange 7 Pink
2  Black   5 Blue
3  Yellow  

Desired Output
1 Red
2 Black
3 Yellow
4 Green
5 Blue
6 Orange
7 Pink

我总共需要查看大约 40 列数据。一种解决方案是执行 IFERROR(VLOOKUP),这将需要大约 40 个 VLOOKUPS。

我想检查是否有一种简单的方法可以在矩阵中搜索一个值,然后返回它旁边的值。

【问题讨论】:

  • 40 个 vlookup 在宏伟的计划中并不多。只有当它们变得复杂时,您才会看到性能问题。
  • 你的数据会一直是数字吗?这个词还是只是为了举例?
  • 总是数字和单词的组合。我可能只是使用 VLOOKUP,但想检查是否有简单的方法可以做到这一点。

标签: excel vlookup


【解决方案1】:

您可以使用 Excel 2010+ 中提供的 Power Query 将原始表格转换为所需的输出

  • 在 Data 选项卡上选择 Get&Transform from Table/Range(这在不同版本中可能有所不同)
  • 添加索引列。
  • 选择索引列,然后选择UNPIVOT other columns
  • 添加另一个从零开始的索引列
  • 选择这个新的 Index 列,然后添加 Integer/Divide (by 2) 列。
  • 再次选择相同的索引列,添加模(乘以 2)列。
  • 删除您第二次添加的从零开始的索引列。
  • 选择模数列和轴
    • 对于 Values 列,选择 Value(包含所有数据的列的默认名称
    • Advanced 选项下选择Don't Aggregate
  • 删除多余的列
  • 将旋转列从 0 | 1 重命名为您想要的任何内容(我不理会它们)
  • 按数字列对行进行排序

所有步骤都可以在 UI 中完成,但下面是 M 代码,您可以根据需要将其粘贴到高级编辑器中。您必须更改源表名称以匹配 Excel 中的任何内容。

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", Int64.Type}, {"Column2", type text}, {"Column3", Int64.Type}, {"Column4", type text}, {"Column5", Int64.Type}, {"Column6", type text}, {"Column7", Int64.Type}, {"Column8", type text}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Added Index", {"Index"}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute"}),
    #"Added Index1" = Table.AddIndexColumn(#"Removed Columns", "Index.1", 0, 1),
    #"Inserted Integer-Division" = Table.AddColumn(#"Added Index1", "Integer-Division", each Number.IntegerDivide([Index.1], 2), Int64.Type),
    #"Inserted Modulo" = Table.AddColumn(#"Inserted Integer-Division", "Modulo", each Number.Mod([Index.1], 2), type number),
    #"Removed Columns1" = Table.RemoveColumns(#"Inserted Modulo",{"Index.1"}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Removed Columns1", {{"Modulo", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Removed Columns1", {{"Modulo", type text}}, "en-US")[Modulo]), "Modulo", "Value"),
    #"Removed Columns2" = Table.RemoveColumns(#"Pivoted Column",{"Index", "Integer-Division"}),
    #"Sorted Rows" = Table.Sort(#"Removed Columns2",{{"0", Order.Ascending}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Sorted Rows",{{"0", Int64.Type}, {"1", type text}})
in
    #"Changed Type1"

【讨论】:

    【解决方案2】:

    我有 Excel 2019 (3​​65),所以请尝试在 ROWCOLUMN 之前使用和不使用 @ 符号

    这是带有@ 符号的公式:

    =@INDEX(Matrix;SUMPRODUCT((Matrix=A7)*ROW(Matrix))-@ROW(Matrix)+1;SUMPRODUCT((Matrix=A7)*COLUMN(Matrix))-@COLUMN(Matrix)+1+1)
    

    没有@ 符号:

    =INDEX(Matrix;SUMPRODUCT((Matrix=A7)*ROW(Matrix))-ROW(Matrix)+1;SUMPRODUCT((Matrix=A7)*COLUMN(Matrix))-COLUMN(Matrix)+1+1)
    

    基于此设置

    结果

    注意:这只有在矩阵中没有重复项时才有效

    让我知道它是否有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多