在公式中使用索引、匹配和 row/column excel 函数来 return 一个仅包含文本单元格的子集数组,并排除空单元格
Use index, match, and row/column excel functions in a formula to return a subset array with just cells with text and exclude the empty ones
我有这种情况,我想在一行中提取一个范围的子集(最好使用索引、匹配和行函数)和 return 仅具有包含 [=53= 的单元格的较小过滤数组] 并排除空单元格 .. 我想使用这个过滤后的数组进行进一步处理
我想从中获取子集数组的输入二维数组是彩色的
The image shows the returned array size in last column
为用户提供了一个下拉菜单 select 所需的行(比如 A1:A6)。
用户编辑的 select 行确定从二维彩色范围(比如 B1:G6 )的哪一行中提取过滤后的数组
那么只有 text/data 的单元格是 return 从该行
编辑的
我尝试了以下代码
我可以使用
获得整个正确行(所有单元格)的数组
index(B1:G6, match(A1:A6,value_from_dropdown_menue,0),0)
然后我尝试应用 row() 函数从 returned 数组中过滤掉空元素.. 让我们将 returned_full_row_array 称为RFRA 可读性
index(RFRA, row(indirect("1:"& counta(RFRA))))
完整的公式如下所示(B8 是带有下拉列表的单元格)
=INDEX(INDEX(2D_Matrix,MATCH(B8,1D_Menue_List,0),0),ROW(indirect("1:"& counta(INDEX(2D_Matrix,MATCH(B8,1D_Menue_List,0),0)))))
但是 row() 函数不是 return 数组,因此我没有任何数组 returned ..我只得到第一个元素..即使我硬编码行(1:3) .. 我没有得到 3 元素数组......只有整行的第一个元素
有什么想法吗?
编辑:我可以使用索引匹配成功获取范围的整行
结果是固定大小的 1 x 6 数组,如下所示(示例第一行和第二行):
for 1st row >> {"M1-item1",0,0,0,0,0}
for 2nd row >> {"M2-item1","M2-item2","M2-item3","M2-item4",0,0}
然而,期望的输出应该是 可变长度数组 ,没有 empty/zero 元素:
for 1st row >> {"M1-item1"}
for 2nd row >> {"M2-item1","M2-item2","M2-item3","M2-item4"}
这是一个经典的、痛苦的问题。我喜欢通过首先将范围内的所有元素移动到一个列中来解决它,如下所示:
=LET(
InputArray,
B1:G8,
InputRowCount,
ROWS(InputArray),
TotalCellCount,
COLUMNS(InputArray)*InputRowCount,
LookupRow,
MOD(SEQUENCE(TotalCellCount,,0),InputRowCount),
LookupColumn,
(SEQUENCE(TotalCellCount,,0)-LookupRow)/InputRowCount,
RearrangedAsColumn,
INDEX(InputArray,LookupRow,LookupColumn),
RearrangedAsColumn_IsBlank,
INDEX(ISBLANK(InputArray),LookupRow,LookupColumn),
Result,
FILTER(RearrangedAsColumn,1-RearrangedAsColumn_IsBlank),
Result
)
这里我使用了一个LET函数,因为它允许我定义变量,并且使解释更清楚一些。
单步执行:
Name
What it does
InputArray
That's where the data comes from
InputRows
Count up the rows
InputColumns
Count up the columns
LookupRow
This uses division remainders to give us the row references
LookupColumn
This calculates our column lookup
RearrangedAsColumn
This restates InputArray into a single column
RearrangedAsColumn_IsBlank
Gives us a column that shows whether or not the cell is blank
Result
Finally, filter RearrangedAsColumn for non-blank cells
希望这就是您想要的!
鉴于原题变了,这道题简单多了。假设我们有一些命名范围:
Named Range
Formula
Comment
FullRange
=L15:Q22
The full range of the data
MenuList
=K15:K22
The list of menu items
DropdownSelection
?
The cell with the dropdown list
这将是完成这项工作的公式:
=INDEX(
FullRange,
XMATCH(DropdownSelection,MenuList,0),
XMATCH(
SEQUENCE(
,
MAX(
MMULT(
SEQUENCE(,ROWS(FullRange),1,0),
MMULT((1-ISBLANK(FullRange))*(DropdownSelection=MenuList),
(SEQUENCE(COLUMNS(FullRange))<=SEQUENCE(,COLUMNS(FullRange)))*1)
)
)
),
MMULT(
SEQUENCE(,ROWS(FullRange),1,0),
MMULT(
(1-ISBLANK(FullRange))*(DropdownSelection=MenuList),
(SEQUENCE(COLUMNS(FullRange))<=SEQUENCE(,COLUMNS(FullRange)))*1
)
),
0
)
)
抱歉中间太丑了。它使用 ISBLANK
查找使用了哪些单元格。
特别是这部分:
SEQUENCE(COLUMNS(FullRange))<=SEQUENCE(,COLUMNS(FullRange)))*1
生成上三角矩阵。
如果我们有一个包含以下内容的矩阵:
(1-ISBLANK(FullRange))*(DropdownSelection=MenuList)
它将只包含我们实际需要的单元格。
通过矩阵乘积,我们得到一个矩阵,除了我们之后的那一行之外,其他地方都是 0。在我们之后的行中,它在我们想要的第一个单元格到第二个单元格上有 1,在我们想要的第二个单元格上有 2 到第三个,依此类推。通过 XMATCH
从左边(向右),它只会匹配我们想要的那些单元格。
我有这种情况,我想在一行中提取一个范围的子集(最好使用索引、匹配和行函数)和 return 仅具有包含 [=53= 的单元格的较小过滤数组] 并排除空单元格 .. 我想使用这个过滤后的数组进行进一步处理
我想从中获取子集数组的输入二维数组是彩色的
The image shows the returned array size in last column
为用户提供了一个下拉菜单 select 所需的行(比如 A1:A6)。
用户编辑的 select 行确定从二维彩色范围(比如 B1:G6 )的哪一行中提取过滤后的数组 那么只有 text/data 的单元格是 return 从该行
编辑的我尝试了以下代码
我可以使用
获得整个正确行(所有单元格)的数组index(B1:G6, match(A1:A6,value_from_dropdown_menue,0),0)
然后我尝试应用 row() 函数从 returned 数组中过滤掉空元素.. 让我们将 returned_full_row_array 称为RFRA 可读性
index(RFRA, row(indirect("1:"& counta(RFRA))))
完整的公式如下所示(B8 是带有下拉列表的单元格)
=INDEX(INDEX(2D_Matrix,MATCH(B8,1D_Menue_List,0),0),ROW(indirect("1:"& counta(INDEX(2D_Matrix,MATCH(B8,1D_Menue_List,0),0)))))
但是 row() 函数不是 return 数组,因此我没有任何数组 returned ..我只得到第一个元素..即使我硬编码行(1:3) .. 我没有得到 3 元素数组......只有整行的第一个元素
有什么想法吗?
编辑:我可以使用索引匹配成功获取范围的整行 结果是固定大小的 1 x 6 数组,如下所示(示例第一行和第二行):
for 1st row >> {"M1-item1",0,0,0,0,0}
for 2nd row >> {"M2-item1","M2-item2","M2-item3","M2-item4",0,0}
然而,期望的输出应该是 可变长度数组 ,没有 empty/zero 元素:
for 1st row >> {"M1-item1"}
for 2nd row >> {"M2-item1","M2-item2","M2-item3","M2-item4"}
这是一个经典的、痛苦的问题。我喜欢通过首先将范围内的所有元素移动到一个列中来解决它,如下所示:
=LET(
InputArray,
B1:G8,
InputRowCount,
ROWS(InputArray),
TotalCellCount,
COLUMNS(InputArray)*InputRowCount,
LookupRow,
MOD(SEQUENCE(TotalCellCount,,0),InputRowCount),
LookupColumn,
(SEQUENCE(TotalCellCount,,0)-LookupRow)/InputRowCount,
RearrangedAsColumn,
INDEX(InputArray,LookupRow,LookupColumn),
RearrangedAsColumn_IsBlank,
INDEX(ISBLANK(InputArray),LookupRow,LookupColumn),
Result,
FILTER(RearrangedAsColumn,1-RearrangedAsColumn_IsBlank),
Result
)
这里我使用了一个LET函数,因为它允许我定义变量,并且使解释更清楚一些。
单步执行:
Name | What it does |
---|---|
InputArray |
That's where the data comes from |
InputRows |
Count up the rows |
InputColumns |
Count up the columns |
LookupRow |
This uses division remainders to give us the row references |
LookupColumn |
This calculates our column lookup |
RearrangedAsColumn |
This restates InputArray into a single column |
RearrangedAsColumn_IsBlank |
Gives us a column that shows whether or not the cell is blank |
Result |
Finally, filter RearrangedAsColumn for non-blank cells |
希望这就是您想要的!
鉴于原题变了,这道题简单多了。假设我们有一些命名范围:
Named Range | Formula | Comment |
---|---|---|
FullRange |
=L15:Q22 |
The full range of the data |
MenuList |
=K15:K22 |
The list of menu items |
DropdownSelection |
? | The cell with the dropdown list |
这将是完成这项工作的公式:
=INDEX(
FullRange,
XMATCH(DropdownSelection,MenuList,0),
XMATCH(
SEQUENCE(
,
MAX(
MMULT(
SEQUENCE(,ROWS(FullRange),1,0),
MMULT((1-ISBLANK(FullRange))*(DropdownSelection=MenuList),
(SEQUENCE(COLUMNS(FullRange))<=SEQUENCE(,COLUMNS(FullRange)))*1)
)
)
),
MMULT(
SEQUENCE(,ROWS(FullRange),1,0),
MMULT(
(1-ISBLANK(FullRange))*(DropdownSelection=MenuList),
(SEQUENCE(COLUMNS(FullRange))<=SEQUENCE(,COLUMNS(FullRange)))*1
)
),
0
)
)
抱歉中间太丑了。它使用 ISBLANK
查找使用了哪些单元格。
特别是这部分:
SEQUENCE(COLUMNS(FullRange))<=SEQUENCE(,COLUMNS(FullRange)))*1
生成上三角矩阵。
如果我们有一个包含以下内容的矩阵:
(1-ISBLANK(FullRange))*(DropdownSelection=MenuList)
它将只包含我们实际需要的单元格。
通过矩阵乘积,我们得到一个矩阵,除了我们之后的那一行之外,其他地方都是 0。在我们之后的行中,它在我们想要的第一个单元格到第二个单元格上有 1,在我们想要的第二个单元格上有 2 到第三个,依此类推。通过 XMATCH
从左边(向右),它只会匹配我们想要的那些单元格。