我在这里看到以下关于重复值的问题: List number of lessons including half lessons based on Number of lessons and lesson name
这个问题需要较旧的 Excel 版本,我喜欢问题陈述,并且喜欢搜索包含新 Excel 公式的解决方案。
我们有以下数据:
这个想法是将 B 列的值重复 A 列中提到的次数。
挑战在于 A 列还可能包含非整数(仅 0.5
-值)。
如果 0.5
使用 -value 时,它应该重复 B 列中的值 A 中的整数个数并显示 0.5
文本值与 0.5
堆叠在一起以及下一个文本值。
在这种情况下,预期结果是:
我设法在 Office 365 中获得有效的解决方案:
=LET(
data,A1:B5,
A,INDEX(data,,1),
B,INDEX(data,,2),
s,SCAN(0,A,LAMBDA(a,b,a+b)),
si,INT(s),
sr,ROUNDUP(s,0),
sm,SEQUENCE(MAX(sr)),
mr,XMATCH(sm,sr,1),
mi,XMATCH(sm,si,1),
IFERROR(
IF(mr=mi,
INDEX(B,mr,),
"0.5 "&INDEX(B,mr,)&", 0.5 "&INDEX(B,mi)),
"0.5 "&INDEX(B,mr,)))
托尼使用 FILTERXML 得到了一个非常接近原始问题的答案:
=FILTERXML(REPLACE(CONCAT(REPT("</c><c>" & B2:B6,FLOOR(A2:A6,1)) & IF(A2:A6-INT(A2:A6)>0,"</c><c>" & A2:A6-INT(A2:A6) & B2:B6,"")),2,2,"p")&"</c></p>","//c")
这可以在 Excel 2013 中实现吗?
最佳答案
我确实已经不再接触以前版本的 Excel 中这些令人畏惧的公式了。因此,不幸的是 CONCAT()
不可用。不管怎样,我认为以下方法可能有效:
C2
中的公式:
=IF(COUNTIF(C$1:C1,INDEX(B$1:B$5,IFERROR(MATCH(ROW(A1)-1,MMULT(IF(ROW(A$1:A$5)>=TRANSPOSE(ROW(A$1:A$5))=TRUE,1,0),ROUND(A$1:A$5,0)))+1,1)))+0.5=INDEX(A$1:A$5,MATCH(INDEX(B$1:B$5,IFERROR(MATCH(ROW(A1)-1,MMULT(IF(ROW(A$1:A$5)>=TRANSPOSE(ROW(A$1:A$5))=TRUE,1,0),ROUND(A$1:A$5,0)))+1,1)),B$1:B$5,0)),"0.5 ","")&INDEX(B$1:B$5,IFERROR(MATCH(ROW(A1)-1,MMULT(IF(ROW(A$1:A$5)>=TRANSPOSE(ROW(A$1:A$5))=TRUE,1,0),ROUND(A$1:A$5,0)))+1,1))
显然上面是数组输入的公式,需要往下拖。
对于 ms365 用户,请尝试:
=DROP(REDUCE(0,REPT(B1:B5&"|",A1:A5)&REPT("0.5 "&B1:B5,MOD(A1:A5,1)>0),LAMBDA(a,b,VSTACK(a,TEXTSPLIT(b,,"|",1)))),1)
基于运行REDUCE()
时堆栈输出的小技巧。请参阅here
关于excel - 重复值 n 次,其中 n 也可以是 0.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74169638/