如何在Excel中将两个垂直数字列表合并为一个长垂直列表?
How to merge two vertical number lists into one long vertical list in Excel?
我有几列数字,我想知道如何制作一个包含所有数字的动态组合列表?我知道合并在理论上可行,但我的列表发生了变化,我认为合并不是动态的。右边的'Combines List'是我希望完成的。我想要所有重复项,但我不想要任何空格,因为例如 C 列可以很容易地从 3 个数字变为 5 个数字。此外,对列表进行排序将是一个超级奖励,因为这是我的最终目标,所以如果我能以另一种方式解决这个问题,请告诉我。
由于您使用的是 Office 365,请尝试这个用户定义的小函数:
Public Function stackum(rng As Range)
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
Dim arr, i As Long, brr, b
ReDim arr(1 To wf.CountA(rng), 1 To 1)
brr = rng
i = 1
For Each b In brr
If b <> "" Then
arr(i, 1) = b
i = i + 1
End If
Next b
stackum = arr
End Function
如您所见,它是动态溢出的。
如果您想要公式而不是 UDF,请尝试:
=LET(z,INDEX($C:$F,MOD(SEQUENCE(4*9)-1,9)+1,ROUNDUP(SEQUENCE(4*9)/9,0)),FILTER(z,z<>""))
它也溢出来了。我不喜欢这个公式。它依赖于“幻数”9,即输入的高度 table.
编辑#1:
要消除两个幻数(4, 9),我们可以使用:
=LET(tb,$C:$F,cl,COLUMNS(tb),rw,ROWS(tb),z,INDEX(tb,MOD(SEQUENCE(cl*rw)-1,9)+1,ROUNDUP(SEQUENCE(cl*rw)/rw,0)),FILTER(z,z<>""))
试试,用 O365:
=FILTERXML("<t><s>" & TEXTJOIN("</s><s>",TRUE,TRANSPOSE(numBers)) & "</s></t>","//s")
如果您希望列表排序,则:
=SORT(FILTERXML("<t><s>" & TEXTJOIN("</s><s>",TRUE,TRANSPOSE(numBers)) & "</s></t>","//s"))
EDIT 如果您 运行正在 MAC 或在线 Excel,您没有FILTERXML
函数。您可以改用以下公式:
=SORT(--TRIM(MID(TEXTJOIN(REPT(" ",99),TRUE,TRANSPOSE(C10:F29)),(SEQUENCE(COUNT(numBers))-1)*99+1,99)))
此公式适用于 300 多个字符(数字),之后您将 运行 进入 TEXTJOIN
的 32,767 个字符限制。第一个公式的数字限制为 3,000 多一点。如果你有更多,你应该看看 VBA 解决方案
numBers
是一个比您需要的更大的命名范围。空白将被忽略。在这种情况下,我使用 c10:f100
,但您可以增加大小以适应。
带排序
所有Excel版本的公式解决方案
1] H10
中的“组合列表与排序”,公式复制下来:
=IFERROR(SMALL($C:$F,ROW(A1)),"")
2] I10
中的“组合列表与排序并删除重复项”,向下复制的公式:
=IF(ROW(A1)<=SUMPRODUCT(($C:$F<>"")/COUNTIF($C:$F,$C:$F&"")),SMALL($C:$F,COUNTIF($C:$F,"<="&I9)+1),"")
我有几列数字,我想知道如何制作一个包含所有数字的动态组合列表?我知道合并在理论上可行,但我的列表发生了变化,我认为合并不是动态的。右边的'Combines List'是我希望完成的。我想要所有重复项,但我不想要任何空格,因为例如 C 列可以很容易地从 3 个数字变为 5 个数字。此外,对列表进行排序将是一个超级奖励,因为这是我的最终目标,所以如果我能以另一种方式解决这个问题,请告诉我。
由于您使用的是 Office 365,请尝试这个用户定义的小函数:
Public Function stackum(rng As Range)
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
Dim arr, i As Long, brr, b
ReDim arr(1 To wf.CountA(rng), 1 To 1)
brr = rng
i = 1
For Each b In brr
If b <> "" Then
arr(i, 1) = b
i = i + 1
End If
Next b
stackum = arr
End Function
如您所见,它是动态溢出的。
如果您想要公式而不是 UDF,请尝试:
=LET(z,INDEX($C:$F,MOD(SEQUENCE(4*9)-1,9)+1,ROUNDUP(SEQUENCE(4*9)/9,0)),FILTER(z,z<>""))
它也溢出来了。我不喜欢这个公式。它依赖于“幻数”9,即输入的高度 table.
编辑#1:
要消除两个幻数(4, 9),我们可以使用:
=LET(tb,$C:$F,cl,COLUMNS(tb),rw,ROWS(tb),z,INDEX(tb,MOD(SEQUENCE(cl*rw)-1,9)+1,ROUNDUP(SEQUENCE(cl*rw)/rw,0)),FILTER(z,z<>""))
试试,用 O365:
=FILTERXML("<t><s>" & TEXTJOIN("</s><s>",TRUE,TRANSPOSE(numBers)) & "</s></t>","//s")
如果您希望列表排序,则:
=SORT(FILTERXML("<t><s>" & TEXTJOIN("</s><s>",TRUE,TRANSPOSE(numBers)) & "</s></t>","//s"))
EDIT 如果您 运行正在 MAC 或在线 Excel,您没有FILTERXML
函数。您可以改用以下公式:
=SORT(--TRIM(MID(TEXTJOIN(REPT(" ",99),TRUE,TRANSPOSE(C10:F29)),(SEQUENCE(COUNT(numBers))-1)*99+1,99)))
此公式适用于 300 多个字符(数字),之后您将 运行 进入 TEXTJOIN
的 32,767 个字符限制。第一个公式的数字限制为 3,000 多一点。如果你有更多,你应该看看 VBA 解决方案
numBers
是一个比您需要的更大的命名范围。空白将被忽略。在这种情况下,我使用 c10:f100
,但您可以增加大小以适应。
带排序
所有Excel版本的公式解决方案
1] H10
中的“组合列表与排序”,公式复制下来:
=IFERROR(SMALL($C:$F,ROW(A1)),"")
2] I10
中的“组合列表与排序并删除重复项”,向下复制的公式:
=IF(ROW(A1)<=SUMPRODUCT(($C:$F<>"")/COUNTIF($C:$F,$C:$F&"")),SMALL($C:$F,COUNTIF($C:$F,"<="&I9)+1),"")