使用 Excel 中的数组函数创建摘要 table 时遇到问题
Trouble using array functions in Excel to create summary table
我有一个table,一栏是教师名单,后面几栏是个人培训课程。我们的想法是,对于每门课程,我们都会有一名“首席导师”和另外三名“导师”,并且这些标签是根据选定教师的姓名分配的。所以它看起来像:
Teacher
training1
training2
training3
john
Lead tutor
bob
Tutor
Tutor
Tutor
jane
Tutor
Tutor
alice
Tutor
Lead tutor
tim
Tutor
Tutor
Tutor
gus
Lead tutor
我正在尝试创建一个单独的摘要 table 以显示每门课程的分配对象,例如:
Lead tutor
Tutor
Tutor
Tutor
training1
john
bob
alice
tim
training2
alice
bob
jane
tim
training3
gus
bob
jane
tim
我知道我需要类似 index/match/small/if/column/row 的东西,但是在我在网上找到的所有示例中,我就是无法让它工作...
我最接近它工作的是:
{=IFERROR(INDEX($A$2:$A$14,SMALL(IF(G$2=$B$2:$C$14,ROW($B$2:$C$14)-1,"未分配"),COLUMNS($F$3:F3))),"")}
它没有给我错误消息,但也没有给我正确的结果...!
我已经在 GoogleDrive 上上传了我的尝试 - 如果有人可以阐明我做错了什么,我将不胜感激(我只在 youtube 上了解数组和 index/aggregate/match 但就是不能让我的脑袋转过来...!)
https://drive.google.com/file/d/1YKhKppAevNGrU_XFGe3IVNFOXynoKFiS/view?usp=sharing
提前致谢
我选择了 2 公式方法。拥有一个公式并将其复制到整个 table 会好得多,但我认为这种努力是不值得的。因此,我有以下公式来提取首席导师。 (183)
=INDEX(Table1[Teacher],MATCH(B,INDIRECT("Table1["&$A12&"]"),0))
为此,我将您的第一个 table 转换为覆盖范围 A1:D7 的 Excel table (Table1
)。这是您 table 的精确副本。因此 headers 是“Teacher”、“Training1”、“Training2”和“Training3”。因此 Table1[Teacher]
等同于 A2:A7。您可以将一种语法替换为另一种语法,但使用 table 将为您提供一个动态范围,否则您必须创建该动态范围。
你的输出 table 在 A11:E14 范围内。因此我在 A12:A14 中有“Training1”、“Training2”和“Training3”。因此,INDIRECT("Table1["&$A12&"]"
指的是这些名称的 table 列,因为公式被向下复制。该组件在以下公式中具有显着特征。
上面的公式在B12,然后复制到B13:14。观察它对 B11 的引用,它从那里获得“首席导师”。更改其对 A12 的引用以捕获包含“Training1”的行,该行必须与 table.
中的列标题相匹配
这是单元格 C12 的公式。您可以像在 Office 365 中一样使用它,但在 Excel 的早期版本中它将是一个数组公式。数组公式需要通过 CTL + SHIFT + ENTER 确认。调整好后复制到C14:E14.
=INDEX(Table1[Teacher],SMALL(IF(INDIRECT("Table1["&$A12&"]")="Tutor",ROW(INDIRECT("Table1["&$A12&"]"))-ROW(INDEX(INDIRECT("Table1["&$A12&"]"),1))+1),COLUMN()-2))
此公式中存在不规则之处,我决定留给您修复。如您所见,它包含要在 table 中搜索的单词“导师”(不同于“首席导师”)。在我的测试 table 中,我在 C11:E11 中找到了这个词(从您的 table 设计中复制)并且应该从那里获取它,就像我在第一个涉及 B11 的公式中所做的那样。实际上,它将帮助您理解公式,但如果您是这样设置 table.
的,则可以将“导师”一词替换为 C
有一个对 table 的“教师”栏的引用和对 A12 的 3 个引用,上面已经解释过了。我提请你注意 COLUMN()-2)
。当您在 C 列中输入此公式时,它将 return 1,并复制到右侧,它将计数为 2 和 3。这就是 SMALL 函数等级的定义方式。根据粘贴公式的列进行调整。
编辑
假设您不想将第一个 table 转换为 table,您可以通过分配的名称引用范围(并在该过程中动态化)。创建 4 个命名范围,如下所示:-
A2:A7 as "Teachers"
B2:B7 as "Training1"
C2:C7 as "Training2"
D2:D7 as "Training3"
观察到 3 个新命名范围的名称在 A12:A14 中。现在 B12 和 C12 的公式如下所示。
[B12] =INDEX(Teachers,MATCH(B,INDIRECT($A12),0))
[C12] = INDEX(Teachers,SMALL(IF(INDEX(INDIRECT($A12),,1)="Tutor",ROW(INDEX(INDIRECT($A12),,1))-ROW(INDEX(INDIRECT($A12),1))+1),COLUMN()-2))
我研究了一个要使用的公式。
在 G3 中使用以下内容:=LET(x,INDEX(Table24,,MATCH($F3,:,0)),IFERROR(INDEX(Table24[[name]:[name]],SMALL(IF(G=x,ROW(x)-1,""),COUNTIF($G:G,G))),""))
或者如果你有旧版本的 Excel 使用这个(避免 LET 函数):
=IFERROR(INDEX(Table24[[name]:[name]],SMALL(IF(G=INDEX(Table24,,MATCH($F3,:,0)),ROW(INDEX(Table24,,MATCH($F3,:,0)))-1,""),COUNTIF($G:G,G))),"")
我有一个table,一栏是教师名单,后面几栏是个人培训课程。我们的想法是,对于每门课程,我们都会有一名“首席导师”和另外三名“导师”,并且这些标签是根据选定教师的姓名分配的。所以它看起来像:
Teacher | training1 | training2 | training3 |
---|---|---|---|
john | Lead tutor | ||
bob | Tutor | Tutor | Tutor |
jane | Tutor | Tutor | |
alice | Tutor | Lead tutor | |
tim | Tutor | Tutor | Tutor |
gus | Lead tutor |
我正在尝试创建一个单独的摘要 table 以显示每门课程的分配对象,例如:
Lead tutor | Tutor | Tutor | Tutor | |
---|---|---|---|---|
training1 | john | bob | alice | tim |
training2 | alice | bob | jane | tim |
training3 | gus | bob | jane | tim |
我知道我需要类似 index/match/small/if/column/row 的东西,但是在我在网上找到的所有示例中,我就是无法让它工作...
我最接近它工作的是:
{=IFERROR(INDEX($A$2:$A$14,SMALL(IF(G$2=$B$2:$C$14,ROW($B$2:$C$14)-1,"未分配"),COLUMNS($F$3:F3))),"")}
它没有给我错误消息,但也没有给我正确的结果...!
我已经在 GoogleDrive 上上传了我的尝试 - 如果有人可以阐明我做错了什么,我将不胜感激(我只在 youtube 上了解数组和 index/aggregate/match 但就是不能让我的脑袋转过来...!)
https://drive.google.com/file/d/1YKhKppAevNGrU_XFGe3IVNFOXynoKFiS/view?usp=sharing
提前致谢
我选择了 2 公式方法。拥有一个公式并将其复制到整个 table 会好得多,但我认为这种努力是不值得的。因此,我有以下公式来提取首席导师。 (183)
=INDEX(Table1[Teacher],MATCH(B,INDIRECT("Table1["&$A12&"]"),0))
为此,我将您的第一个 table 转换为覆盖范围 A1:D7 的 Excel table (Table1
)。这是您 table 的精确副本。因此 headers 是“Teacher”、“Training1”、“Training2”和“Training3”。因此 Table1[Teacher]
等同于 A2:A7。您可以将一种语法替换为另一种语法,但使用 table 将为您提供一个动态范围,否则您必须创建该动态范围。
你的输出 table 在 A11:E14 范围内。因此我在 A12:A14 中有“Training1”、“Training2”和“Training3”。因此,INDIRECT("Table1["&$A12&"]"
指的是这些名称的 table 列,因为公式被向下复制。该组件在以下公式中具有显着特征。
上面的公式在B12,然后复制到B13:14。观察它对 B11 的引用,它从那里获得“首席导师”。更改其对 A12 的引用以捕获包含“Training1”的行,该行必须与 table.
中的列标题相匹配这是单元格 C12 的公式。您可以像在 Office 365 中一样使用它,但在 Excel 的早期版本中它将是一个数组公式。数组公式需要通过 CTL + SHIFT + ENTER 确认。调整好后复制到C14:E14.
=INDEX(Table1[Teacher],SMALL(IF(INDIRECT("Table1["&$A12&"]")="Tutor",ROW(INDIRECT("Table1["&$A12&"]"))-ROW(INDEX(INDIRECT("Table1["&$A12&"]"),1))+1),COLUMN()-2))
此公式中存在不规则之处,我决定留给您修复。如您所见,它包含要在 table 中搜索的单词“导师”(不同于“首席导师”)。在我的测试 table 中,我在 C11:E11 中找到了这个词(从您的 table 设计中复制)并且应该从那里获取它,就像我在第一个涉及 B11 的公式中所做的那样。实际上,它将帮助您理解公式,但如果您是这样设置 table.
的,则可以将“导师”一词替换为C
有一个对 table 的“教师”栏的引用和对 A12 的 3 个引用,上面已经解释过了。我提请你注意 COLUMN()-2)
。当您在 C 列中输入此公式时,它将 return 1,并复制到右侧,它将计数为 2 和 3。这就是 SMALL 函数等级的定义方式。根据粘贴公式的列进行调整。
编辑
假设您不想将第一个 table 转换为 table,您可以通过分配的名称引用范围(并在该过程中动态化)。创建 4 个命名范围,如下所示:-
A2:A7 as "Teachers"
B2:B7 as "Training1"
C2:C7 as "Training2"
D2:D7 as "Training3"
观察到 3 个新命名范围的名称在 A12:A14 中。现在 B12 和 C12 的公式如下所示。
[B12] =INDEX(Teachers,MATCH(B,INDIRECT($A12),0))
[C12] = INDEX(Teachers,SMALL(IF(INDEX(INDIRECT($A12),,1)="Tutor",ROW(INDEX(INDIRECT($A12),,1))-ROW(INDEX(INDIRECT($A12),1))+1),COLUMN()-2))
我研究了一个要使用的公式。
在 G3 中使用以下内容:=LET(x,INDEX(Table24,,MATCH($F3,:,0)),IFERROR(INDEX(Table24[[name]:[name]],SMALL(IF(G=x,ROW(x)-1,""),COUNTIF($G:G,G))),""))
或者如果你有旧版本的 Excel 使用这个(避免 LET 函数):
=IFERROR(INDEX(Table24[[name]:[name]],SMALL(IF(G=INDEX(Table24,,MATCH($F3,:,0)),ROW(INDEX(Table24,,MATCH($F3,:,0)))-1,""),COUNTIF($G:G,G))),"")