【问题标题】:INDEX returns wrong value and no valueINDEX 返回错误值且没有值
【发布时间】:2019-09-07 23:08:19
【问题描述】:

我正在尝试查找匹配的值并将它们排序在一列中。 A 列包含 A 列中人员完成的名称和 B 列培训。

可以在这里看到我的数据示例:


有了这些数据,我想获得一个包含两列(名称和培训)的单独表。在 C 列中,我想要名称,在 D 列中,我想要由 C 列中的人员完成的培训。

=IFERROR(INDEX($B$2:$B$7,SMALL(IF($C2=$A$2:$A$7,ROW($A$2:$A$7)-1,""),ROWS($D$1:D1))),"No training done")

我尝试过使用上述公式,但它似乎只适用于表格中的第一个条目。我不知道我应该改变什么。


这就是我得到的

它向受过培训的人显示“未完成培训”,并且“0”应为“未完成培训”。

这是我的预期结果:

L.E:Anna 擅长 Excel。上图中我的一个错误。
另外,我只对培训专栏感兴趣,因为我已经掌握了排序名称的公式。

谢谢。

【问题讨论】:

  • 当您使用 Small 时,需要一个矩阵和一个位置,并且您返回一个数字 ROW($A$2:$A$7)-1,这就是它工作的原因在第一行。当您在矩阵上只使用一个数字的第二个元素时,没有返回值。
  • 我建议您使用辅助列将空白条目替换为“未完成培训”,然后创建一个包含辅助列的数据透视表,并在数据透视表中显示每个人的培训情况。如果您想保持名称的原始顺序,您可以添加另一个帮助列来为每个条目提供索引号,并且当您创建数据透视表时,您可以按照与原始数据集中相同的顺序对数据进行排序。 #powerquery 如果您正在处理更大的数据集并且不想使用辅助列,则可以使用相同的逻辑完成这项工作。
  • 为什么安娜没有进行任何培训?这是您在预期输出中的错误吗?
  • @JvdV 是的,这是我的错误。

标签: excel excel-formula


【解决方案1】:

D2:D7中输入这个公式:

= IFERROR( INDEX( $A$2:$A$7,
AGGREGATE( 15, 6,
MATCH( $A$2:$A$7, $A$2:$A$7, 0 ),
ROWS( B2:B$2 ) ) ), "" )

然后在E2:E7中输入这个公式

= IFERROR( TRIM( SUBSTITUTE( REPT( " ", 3 ) & INDEX( $B$2:$B$7,
AGGREGATE( 15, 6,
ROW(E:E) / ( ( $A$2:$A$7 = D2 ) * 1 ),
COUNTIF( D$2:D2, D2) ) ) & REPT( " ", 3 ), REPT( " ", 6 ), "No Training done" ) ), "" )

【讨论】:

    【解决方案2】:
    =INDEX(Training,AGGREGATE(15,6,1/(C2=Names)*ROW(Names),COUNTIF($C$2:$C2,$C2))-1)
    

    在本例中,我使用了自定义格式的结果:;;"No Training Done";@

    但是,如果您不介意更长的公式,您可以使用 IF 函数在公式不返回任何内容的情况下返回 No Training Done 语句。

    =IF(INDEX(Training,AGGREGATE(15,6,1/(C2=Names)*ROW(Names),COUNTIF($C$2:$C2,$C2))-1)=0,"No Training Done",INDEX(Training,AGGREGATE(15,6,1/(C2=Names)*ROW(Names),COUNTIF($C$2:$C2,$C2))-1))
    

    此外,您可以根据需要使用整列引用。如果您这样做,请删除 -1,因为您无需针对标题行进行调整。

    如果您想使用Power Query 又名Get&Transform,只需将null 替换为No Training Done,然后按照您想要的顺序对结果进行排序。这一切都可以从 PQ Editor GUI 中完成,下面是 M 代码

    M 码

    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Names", type text}, {"Training", type text}}),
        #"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,"No Training Done",Replacer.ReplaceValue,{"Training"}),
        #"Sorted Rows" = Table.Sort(#"Replaced Value",{{"Names", Order.Ascending}})
    in
        #"Sorted Rows"
    

    【讨论】:

      【解决方案3】:

      最简单的方法是:

      1) 将您的信息复制并粘贴到 C:D 列

      2) 在单元格 A:2 上放置 =COUNTIF($C$2:C2,C2) 并将其拖到您的行范围内。

      3) 在单元格 B:2 上放置 =C2&A2 并将其拖到您的行范围内。

      4) 在单元格 E:2 上放置 =B2 并将其拖到您的行范围内。

      5) 在单元格 F:2 处 =IF(VLOOKUP(E2,$B$2:$D$7,3,FALSE)="","",VLOOKUP(E2,$B$2:$D$7,3,FALSE))

      6) 隐藏 A:B 列

      希望对你有帮助

      【讨论】:

      • 并没有真正帮助,它不会对名称进行排序(我已经这样做了),如果我想整理更多条目,例如只查找 3 个人,它不会工作。
      猜你喜欢
      • 2022-08-23
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2016-06-22
      • 1970-01-01
      • 2011-06-25
      • 2019-02-03
      相关资源
      最近更新 更多