是否有非 VBA Excel 溢出公式来创建和处理数组数组?

问题描述 投票:0回答:2

我在 Excel 365 中有一张工作表,其中包含 A 列和 B 列,如下所示,我想使用一些公式(不是 VBA!)获取 C 列和 D 列。也就是说,我想将每个 Title 重复 Count 次,并为其添加一个流水号。

A B C D
1 标题 运行标题 流水号
2 安娜 3 安娜 1
3 2 安娜 2
4 安娜 3
5 1
6 2

对于运行标题,我发现了一个有点神秘的公式,看起来有些不稳定(依赖于字符串处理)。它基本上使用以下公式创建一个数组,该数组是

{2,2,2,3,3}
XLOOKUP
以获得标题。

=XLOOKUP(
   IFERROR(
      FILTERXML(
        "<a><b>"&
        SUBSTITUTE(TRIM(TEXTJOIN(" ",TRUE,REPT(ROW($A$2:$A$100)&" ",$B$2:$B$100)))," ","</b><b>")&
        "</b></a>",
        "//b"
      ),
   ""),
   ROW($A$2:$A$100),
   A2:A100
)

这可行,但如果能看到一些不那么不完整的公式(即不依赖于 Excel 如何处理字符串的细节)来达到目的,那就太好了。

对于运行数字,我可以在单元格D2中使用类似

=IF($A2<>"",IF($C1=$C2,$D1+1,1),"")
的公式,并通过向下拖动右下角来向下扩展它。这可行,但我希望看到一个只需要在 D2 中定义而无需在其他地方定义的spilling公式。

总而言之,有没有一种方法可以在上面的示例中创建列 C 和 D,而无需定义输出的大小(就像我通过手动扩展公式区域所做的那样),并且无需诉诸依赖于内部工作原理的函数Excel 中的字符串?

excel excel-formula office365
2个回答
3
投票

您可以使用以下任一公式:


使用
TEXTSPLIT()
TEXTJOIN()
REPT()

=TEXTSPLIT(TEXTJOIN("-",,REPT(A2:A3&"|",B2:B3)),"-","|",1)

或者,

使用
LAMBDA()

创建具有友好名称的自定义公式

• 单元格中使用的公式

C2

=REPEAT.NTIMES(A2:A3,B2:B3)

Excel

LAMBDA()
函数为我们提供了一种创建自定义函数的方法,这些函数可以在整个工作簿中重复使用,而无需使用
VBA
,而是使用
friendly name

名称管理器中使用的公式如下所示,带有测试语法

=LAMBDA(values,num_repeat,
XLOOKUP(SEQUENCE(SUM(num_repeat)),
VSTACK(1,SCAN(1,num_repeat,LAMBDA(a,b,a+b))),
VSTACK(values,""),,-1))(A2:A3,B2:B3)

复制上面的公式,不包括最后的测试参数,按CTRL+F3,这会打开名称管理器,点击新建

新名称对话框中,输入名称REPEAT.NTIMES,将范围设置为工作簿,然后将复制的公式粘贴到“引用”输入区域,按确定

现在

LAMBDA()
公式有了名称,它可以像任何其他函数一样在工作簿中使用。


最后要获取运行号码,我们可以使用

COUNTIF()
函数,

• 单元格中使用的公式

D2

=COUNTIF(C$2:C2,C2)

编辑: 2024 年 3 月 28 日

• 不使用任何

LAMBDA()
辅助函数:


• 单元格中使用的公式 G2

=LET(
     α, SEQUENCE(,MAX(F2:F3)),
     δ, TOCOL(IFS(α<=F2:F3,E2:E3&"|"&α),2),
     HSTACK(TEXTBEFORE(δ,"|"),TEXTAFTER(δ,"|")))


2
投票

你可以尝试:

D1
中的公式:

=REDUCE("Running "&{"Title","Number"},A2:B3,LAMBDA(a,b,IF(COLUMN(b)=1,LET(x,OFFSET(b,,1,1),VSTACK(a,HSTACK(INDEX(b,SEQUENCE(x,,,0)),SEQUENCE(x)))),a)))

或者:

=REDUCE("Running "&{"Title","Number"},A2:A3&"|"&B2:B3,LAMBDA(a,b,LET(x,TEXTBEFORE(b,"|"),y,--TEXTAFTER(b,"|"),VSTACK(a,HSTACK(INDEX(x,SEQUENCE(y,,,0)),SEQUENCE(y))))))

或者:

=HSTACK(REDUCE("Running Title",REPT(A2:A3&"|",B2:B3),LAMBDA(a,b,VSTACK(a,TEXTSPLIT(b,,"|",1)))),REDUCE("Running Number",B2:B3,LAMBDA(a,b,VSTACK(a,SEQUENCE(b)))))
© www.soinside.com 2019 - 2024. All rights reserved.