Excel 匹配多个条件查找数组:查找包含列表中所有值的列和 return 列在数组中的位置
Excel Match Multiple Criteria Lookup Array: Find columns that contains all values from a list and return the columns position in the array
我似乎无法解决这个可能很简单的 excel 函数问题(不是 VBA)。
在 Microsoft Excel 数组中:我想找到一个列,其中包含列表中的所有值(数字)和 return 该列在数组中的位置(数值)。
Col1
Col2
Col3
Col4
Col5
4
8
4
7
4
1
4
2
9
10
9
3
2
8
8
10
3
2
6
10
10
5
8
4
9
5
9
1
9
5
5
5
5
6
4
4
1
5
1
2
值列表:
val1
val2
val3
val4
1
4
6
9
有效列#: 4
数组(Table):
arrayTable1
公式(函数)测试使用(CTR+SHIFT+ENTER):
{=SMALL(IF(($A:$E)*($A:$A),COLUMN($A:$E)-COLUMN($A)+1),ROWS(:))}
生成的公式:#N/A
在此先感谢您的帮助。
编辑以阐明公式 requirements/additional 信息:
1: Using Microsoft Excel 2010 version. Some newer functions not available.
2: Can use functions like: v/h/lookup,small/large,index,match,countif/countifs,sumproduct,mode,mmult,transpose,aggregate,indirect,etc.
3: Actual data set for array (table) is hundreds of columns and growing. This means I need a formula that can check the whole array AND return columns# (4,etc.) that matches (contains) all the values in the list (criteria).
4: Brainstorming
我看到其他一些答案有基本的查找概念,但它们不包括同时搜索整个 table 数组。
公式概念1:
{=SMALL(IF(INDEX(IFERROR(--($A:$E=$A:$A),0),,),COLUMN($A:$E)-COLUMN($A)+1),ROW(:))}
生成的公式:incorrect results (possibly first value column location only)
公式概念2:
{=IFERROR(MODE.MULT(IF((INDEX((((($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E)))),,)<>0),COLUMN($A:$E))),"")}
生成的公式:4
*This formula is not a solution to original problem and will only work under specific instances to solve a specific problem. I will explain more in an answer below.
Possible relevant links to other answers?:
Ref: can-match-function-in-an-array-formula-to-return-multiple-matches
Ref: excel-match-multiple-criteria
Ref: match-function-to-match-multiple-values
Ref: how-do-you-extract-a-subarray-from-an-array-in-a-worksheet-function
编辑:For our purposes @EEM solution is currently the easiest to implement, validate, and maintain. Thanks for all responses.
在Office 365中我们可以通过一些数组公式,结合IFS语句来实现(这里数据在A1:C9,数组在H1:K1):
=IFS(MIN(--COUNTIFS(A1:A9,H1:K1)),"Col1",
MIN(--COUNTIFS(B1:B9,H1:K1)),"Col2",
MIN(--COUNTIFS(C1:C9,H1:K1)),"Col3",
MIN(--COUNTIFS(D1:D9,H1:K1)),"Col4",
MIN(--COUNTIFS(E1:E9,H1:K1)),"Col5",
TRUE, "None")
其工作方式是计算第一列的 COUNTIFS,然后将其转换为布尔值(0 或 1),并找到最小值以检查它们是否都存在。如果不是,则检查第二列,依此类推。
亲切的问候
MTwem
这不是我正在寻找的解决方案,但此解决方案可能会帮助其他人或可能会引导其他人为原始问题提供解决方案。我在研究中通过反复试验发现。
公式:
{=IFERROR(MODE.MULT(IF((INDEX((((($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E)))),,)<>0),COLUMN($A:$E))),"")}
生成的公式:4 *Formula works under certain instances.
注意事项:
1: Need unique values in columns for this solution (no duplicates in columns).
2: This formula provides column positions that has the max modal matches (partial list matches & complete list matches can result per column).
在测试中,这意味着如果这些列与每列的最大匹配匹配,则每列会产生部分匹配。
3: If duplicates in columns this can result in the duplicate values being counted towards the max match per column.
因此,如果列中有 [4,2,2,2] 并且列表中有 [2,4],那么该列将产生 4 个匹配项。因此,如果您的用例需要这样的结果,那么这可能适合您。
如果其他人可以解释为什么这有效或提出适合原始问题的解决方案,请这样做。
谢谢,
尚德1
我很接近,但不确定如何过滤掉 non-matches。
使用 tables 简化公式并命名数据 table 范围。
- 突出显示所有数据 table,包括 header 行,然后 插入 - Table.
- 如果您的光标位于 table 中,那么您应该会在功能区上看到一个新的“Table”选项卡。用它来命名 table“DataTable”。
- 对“ValuesList”中的值行执行相同操作。
- 现在您必须创建一个新的 table,其列标题与 ValuesList 相同,外加一个名为“MatchCols”的附加列。现在只做一行 将其命名为“ResultsTable”。
- 假设新“结果Table”table 的第一列标题为“val1”,该列的数据单元格应为:
=MATCH(OFFSET(ValuesList,0,COLUMN()-Column(ResultsTable),1,1),OFFSET(DataTable,0,ROW()-ROW([val1]),ROWS(DataTable),1),0)
- Drag-copy 将公式添加到 val2 到 val6 的数据单元格。 (您应该看到值 2、1、#N/A 和 3.
- 只需在紧靠最后一列右侧的结果Table 数据行的单元格中键入此公式即可添加新列:
=IF(ISNA(SUM(ResultsTable[@[val1]:[val4]])),"",ROW()-ROW(ResultsTable)+1)
- 将 auto-created 列 header 的值替换为“MatchCols”以命名您的列。
- Drag-copy table 向下,使其变大,行数至少与 table 中的列数一样多。如果您向 table 添加列,没问题,只需在结果 Table.
中添加行
好的,现在 ResultsTable[MatchCols]
是一个数组,每列一个值,如果该列不完全匹配,则每个值是“”,如果它确实包含所有值,则为列号在值列表中!在您的示例中,ResultsTable[MatchCols]
应该是 {"","","",4,"","","",""}
对于其他人,@suntech1 尝试了这个并贡献了它的图像。
如果要匹配的值数量可变,那很好,但您需要在 table 中创建足够的列。列名称不必在 ValuesList 和 ResultsTable 之间匹配。 (事实上,ValuesList 可能只是一个数组而不是 table。)此外,您可以更改 MatchCols 列公式以对 COUNT(ValuesList)
敏感,以便在 Results[=79= 时抛出错误] 没有足够的列,如果 ResultsTable 的列太多,则忽略额外的列。
您提到了一个 要匹配的值列表。如果您需要匹配任意数量的值列表,那么......好吧......你应该在你的问题中提到这一点。 :-P
这个没有给你的是你所要求的,因为DataTable[MatchCols]
是你要求的,在数组中散布着""
值。
这是否让您足够接近?
有没有人知道 in Excel 2010 如何获取数组 DataTable[MatchCols]
,即数字和 ""
,以及过滤器输出空字符串,使其 returns 只有数字?
此解决方案使用帮助细胞和 TEXTJOIN function。
假设 Data
和值列表分别位于 [D2:H10]
和 [B13:B17]
。
此公式验证每列中值的存在,输入 D14
和
复制到 [D14:H17]
:
= IFERROR( MATCH( $B14, D:D, 0 )^0, "" )
此公式验证所有值都存在的列,输入 D18
并复制到 [D18:H18]
:
= IF( SUM(D14:D17)=COUNT($B:$B), COLUMNS($D:D), "" )
这个公式合并了列的结果,在[D20]
中输入
= TEXTJOIN( ",",TRUE, $D:$H )
此方法仅 returns 包含至少一次列表中每个值的列。
编辑 - 结合第一个和第二个公式的公式数组
此 FormulaArray
验证每列中值的存在,returns 列中所有值的存在,输入 D18
并复制到 [D18:H18]
:
= IF( SUM( IFERROR( MATCH( $B:$B, D:D, 0 )^0, 0 ) )
= COUNT($B:$B), COLUMNS($D:N), "" )
FormulaArray
按住ctrl+shift+enter 同时,如果输入正确,公式将包含在 {
和 }
中。
编辑 - Excel 2010 公式仅显示符合条件的列 (每列在一个单独的单元格中)
在[D22]
中输入这个公式然后复制到[E22:N22]
:
= IFERROR( INDEX( $D:$N,
AGGREGATE( 15, 6, COLUMN(:) / ( $D:$N <> "" ),
COLUMNS($D:D) ) ), TEXT(,) )
我似乎无法解决这个可能很简单的 excel 函数问题(不是 VBA)。 在 Microsoft Excel 数组中:我想找到一个列,其中包含列表中的所有值(数字)和 return 该列在数组中的位置(数值)。
Col1 | Col2 | Col3 | Col4 | Col5 |
---|---|---|---|---|
4 | 8 | 4 | 7 | 4 |
1 | 4 | 2 | 9 | 10 |
9 | 3 | 2 | 8 | 8 |
10 | 3 | 2 | 6 | 10 |
10 | 5 | 8 | 4 | 9 |
5 | 9 | 1 | 9 | 5 |
5 | 5 | 5 | 6 | 4 |
4 | 1 | 5 | 1 | 2 |
值列表:
val1 | val2 | val3 | val4 |
---|---|---|---|
1 | 4 | 6 | 9 |
有效列#: 4
数组(Table): arrayTable1
公式(函数)测试使用(CTR+SHIFT+ENTER):
{=SMALL(IF(($A:$E)*($A:$A),COLUMN($A:$E)-COLUMN($A)+1),ROWS(:))}
生成的公式:#N/A
在此先感谢您的帮助。
编辑以阐明公式 requirements/additional 信息:
1: Using Microsoft Excel 2010 version. Some newer functions not available.
2: Can use functions like: v/h/lookup,small/large,index,match,countif/countifs,sumproduct,mode,mmult,transpose,aggregate,indirect,etc.
3: Actual data set for array (table) is hundreds of columns and growing. This means I need a formula that can check the whole array AND return columns# (4,etc.) that matches (contains) all the values in the list (criteria).
4: Brainstorming
我看到其他一些答案有基本的查找概念,但它们不包括同时搜索整个 table 数组。
公式概念1:
{=SMALL(IF(INDEX(IFERROR(--($A:$E=$A:$A),0),,),COLUMN($A:$E)-COLUMN($A)+1),ROW(:))}
生成的公式:incorrect results (possibly first value column location only)
公式概念2:
{=IFERROR(MODE.MULT(IF((INDEX((((($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E)))),,)<>0),COLUMN($A:$E))),"")}
生成的公式:4
*This formula is not a solution to original problem and will only work under specific instances to solve a specific problem. I will explain more in an answer below.
Possible relevant links to other answers?:
Ref: can-match-function-in-an-array-formula-to-return-multiple-matches
Ref: excel-match-multiple-criteria
Ref: match-function-to-match-multiple-values
Ref: how-do-you-extract-a-subarray-from-an-array-in-a-worksheet-function
编辑:For our purposes @EEM solution is currently the easiest to implement, validate, and maintain. Thanks for all responses.
在Office 365中我们可以通过一些数组公式,结合IFS语句来实现(这里数据在A1:C9,数组在H1:K1):
=IFS(MIN(--COUNTIFS(A1:A9,H1:K1)),"Col1",
MIN(--COUNTIFS(B1:B9,H1:K1)),"Col2",
MIN(--COUNTIFS(C1:C9,H1:K1)),"Col3",
MIN(--COUNTIFS(D1:D9,H1:K1)),"Col4",
MIN(--COUNTIFS(E1:E9,H1:K1)),"Col5",
TRUE, "None")
其工作方式是计算第一列的 COUNTIFS,然后将其转换为布尔值(0 或 1),并找到最小值以检查它们是否都存在。如果不是,则检查第二列,依此类推。
亲切的问候
MTwem
这不是我正在寻找的解决方案,但此解决方案可能会帮助其他人或可能会引导其他人为原始问题提供解决方案。我在研究中通过反复试验发现。
公式:
{=IFERROR(MODE.MULT(IF((INDEX((((($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E))+(($A:$E=$A)*COLUMN($A:$E)))),,)<>0),COLUMN($A:$E))),"")}
生成的公式:4 *Formula works under certain instances.
注意事项:
1: Need unique values in columns for this solution (no duplicates in columns).
2: This formula provides column positions that has the max modal matches (partial list matches & complete list matches can result per column).
在测试中,这意味着如果这些列与每列的最大匹配匹配,则每列会产生部分匹配。
3: If duplicates in columns this can result in the duplicate values being counted towards the max match per column.
因此,如果列中有 [4,2,2,2] 并且列表中有 [2,4],那么该列将产生 4 个匹配项。因此,如果您的用例需要这样的结果,那么这可能适合您。
如果其他人可以解释为什么这有效或提出适合原始问题的解决方案,请这样做。
谢谢, 尚德1
我很接近,但不确定如何过滤掉 non-matches。
使用 tables 简化公式并命名数据 table 范围。
- 突出显示所有数据 table,包括 header 行,然后 插入 - Table.
- 如果您的光标位于 table 中,那么您应该会在功能区上看到一个新的“Table”选项卡。用它来命名 table“DataTable”。
- 对“ValuesList”中的值行执行相同操作。
- 现在您必须创建一个新的 table,其列标题与 ValuesList 相同,外加一个名为“MatchCols”的附加列。现在只做一行 将其命名为“ResultsTable”。
- 假设新“结果Table”table 的第一列标题为“val1”,该列的数据单元格应为:
=MATCH(OFFSET(ValuesList,0,COLUMN()-Column(ResultsTable),1,1),OFFSET(DataTable,0,ROW()-ROW([val1]),ROWS(DataTable),1),0)
- Drag-copy 将公式添加到 val2 到 val6 的数据单元格。 (您应该看到值 2、1、#N/A 和 3.
- 只需在紧靠最后一列右侧的结果Table 数据行的单元格中键入此公式即可添加新列:
=IF(ISNA(SUM(ResultsTable[@[val1]:[val4]])),"",ROW()-ROW(ResultsTable)+1)
- 将 auto-created 列 header 的值替换为“MatchCols”以命名您的列。
- Drag-copy table 向下,使其变大,行数至少与 table 中的列数一样多。如果您向 table 添加列,没问题,只需在结果 Table. 中添加行
好的,现在 ResultsTable[MatchCols]
是一个数组,每列一个值,如果该列不完全匹配,则每个值是“”,如果它确实包含所有值,则为列号在值列表中!在您的示例中,ResultsTable[MatchCols]
应该是 {"","","",4,"","","",""}
对于其他人,@suntech1 尝试了这个并贡献了它的图像。
如果要匹配的值数量可变,那很好,但您需要在 table 中创建足够的列。列名称不必在 ValuesList 和 ResultsTable 之间匹配。 (事实上,ValuesList 可能只是一个数组而不是 table。)此外,您可以更改 MatchCols 列公式以对 COUNT(ValuesList)
敏感,以便在 Results[=79= 时抛出错误] 没有足够的列,如果 ResultsTable 的列太多,则忽略额外的列。
您提到了一个 要匹配的值列表。如果您需要匹配任意数量的值列表,那么......好吧......你应该在你的问题中提到这一点。 :-P
这个没有给你的是你所要求的,因为DataTable[MatchCols]
是你要求的,在数组中散布着""
值。
这是否让您足够接近?
有没有人知道 in Excel 2010 如何获取数组 DataTable[MatchCols]
,即数字和 ""
,以及过滤器输出空字符串,使其 returns 只有数字?
此解决方案使用帮助细胞和 TEXTJOIN function。
假设 Data
和值列表分别位于 [D2:H10]
和 [B13:B17]
。
此公式验证每列中值的存在,输入 D14
和
复制到 [D14:H17]
:
= IFERROR( MATCH( $B14, D:D, 0 )^0, "" )
此公式验证所有值都存在的列,输入 D18
并复制到 [D18:H18]
:
= IF( SUM(D14:D17)=COUNT($B:$B), COLUMNS($D:D), "" )
这个公式合并了列的结果,在[D20]
= TEXTJOIN( ",",TRUE, $D:$H )
此方法仅 returns 包含至少一次列表中每个值的列。
编辑 - 结合第一个和第二个公式的公式数组
此 FormulaArray
验证每列中值的存在,returns 列中所有值的存在,输入 D18
并复制到 [D18:H18]
:
= IF( SUM( IFERROR( MATCH( $B:$B, D:D, 0 )^0, 0 ) )
= COUNT($B:$B), COLUMNS($D:N), "" )
FormulaArray
按住ctrl+shift+enter 同时,如果输入正确,公式将包含在 {
和 }
中。
编辑 - Excel 2010 公式仅显示符合条件的列 (每列在一个单独的单元格中)
在[D22]
中输入这个公式然后复制到[E22:N22]
:
= IFERROR( INDEX( $D:$N,
AGGREGATE( 15, 6, COLUMN(:) / ( $D:$N <> "" ),
COLUMNS($D:D) ) ), TEXT(,) )