excel 我如何创建一个新列,插入其他列的单元格,但模式是从第一列3,然后从第二列3,然后...?

gcuhipw9  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(132)

所以在这个例子中,我有3列9个单元格每个。(这只是一个例子,在现实生活中,它可能是100列1000个单元格每个)。
色谱柱:

  • 苹果
  • 香蕉
  • 葡萄

我想创建第4列,其中前3个单元格来自苹果,然后3个单元格来自香蕉,然后3个单元格来自葡萄,然后又3个单元格来自苹果,依此类推...

所以我试着给单元格一个顺序,然后把顺序拖到单词下面,希望Excel能得到我想要的模式。然后我想到把所有3列复制到一列中,并把顺序从小到大排序,但Excel没有得到我想要的模式。
你们知道其他可能的解决方案吗?或者我如何让Excel在向下拖动时获得我的模式?

vmjh9lq9

vmjh9lq91#

=LET(a,A3:A11,
     d,D3:ED11,
     h,H3:H11,
     shift,3,
     join,HSTACK(a,d,h),
     rw,ROWS(join),
     col,COLUMNS(join),
     sq,SEQUENCE(rw*col,,0),
INDEX(join,      
      (MOD(sq,shift)+1)+shift*INT(sq/(col*shift)), 
      MOD(INT(SEQUENCE(rw*col,,shift)/shift)-1,col)+1))

它堆叠范围并索引它。序列引用正确的行/列。
如果您添加了一个范围,只要您将其添加到join,公式仍然有效
第一个(行)序列((MOD(sq,shift)+1)+shift*INT(sq/(col*shift)))使用MOD中包含的行 * 列的序列以及您要用作移位的行数作为除数来创建计数器1、2、3、1、2、3等。这将继续引用前三行,但在我们到达每列的第三行后,我们需要移动到下一个行序列。shift*INT(sq/(col*shift)用于此;总序列的整数除以列数乘以移位创建计数器,该计数器从0开始每9行加1,因此计数器1、2、3、1、2、3等将对前9行加上列数乘以0(3 * 0 = 0);然后对于接下来的九行3 * 1 = 3等等。
第二(列)序列MOD(INT(SEQUENCE(rw*col,,shift)/shift)-1,col)+1)计算行 * 列的序列的整数(+行移位的数目)除以行移位的数目(-1)。这导致从0开始每三行加1的数字的重复;因此0,0,0,1,1,1,2,2,2等,直到达到行数-1。用列数作为除数将其 Package 在MOD中导致相同的计数器(这次从1开始),但是每次计数器超过列数时,其重置为1;所以1,1,1,2,2,2,3,3,1,1,1,2,2,2,3,3,3,等等。

gcmastyq

gcmastyq2#

假设输入的总行数可以被3整除,那么可以在单元格H2(* 公式1 *)中尝试:

=DROP(REDUCE("", SEQUENCE(ROWS(A2:A10)/3,,0,3), LAMBDA(ac,cnt, LET(ss, 
  SEQUENCE(3)+cnt, VSTACK(ac, CHOOSEROWS(A2:B10,ss), CHOOSEROWS(C2:D10,ss), 
  CHOOSEROWS(E2:F10,ss))))),1)

如果不想在输出中生成Seq列,则调整CHOOSEROWS中的范围。在这种情况下,由于返回的是一列,因此可以将CHOOSEROWS替换为INDEX
顺便说一下,如果序列数据是要考虑的输入的一部分,那么解决方案更简单:

=SORTBY(VSTACK(A2:A10, C2:C10,E2:E10), VSTACK(B2:B10, D2:D10, F2:F10))

或者,序列列值可按如下方式生成(byArr),并产生与上一公式相同的输出:

=LET(n,3,m,ROWS(A2:A10),seq, WRAPCOLS(SEQUENCE(n*m),n), byArr, DROP(REDUCE("",
  SEQUENCE(m/n,,0,n), LAMBDA(ac,it,VSTACK(ac,CHOOSECOLS(seq,SEQUENCE(n)+it)))),
  1), SORTBY(VSTACK(A2:A10, C2:C10, E2:E10), TOCOL(byArr,,TRUE)))

下面是 * 公式1 * 的输出:

解释(* 公式1 *)

我们使用REDUCE连接每次迭代的VSTACK输出,迭代次数由ROWS(A2:A10)/3定义,每次迭代通过CHOOSEROWS选择的行由下式确定:一米一米一。
数组(其中REDUCE中的每个元素都由cnt表示):

SEQUENCE(ROWS(A2:A10)/3,,0,3)

表示我们在每次迭代中应用的偏移量:0,3,6,....
DROP用于删除第一行,因为我们没有合适的值来初始化累加器(ac)。您可以使用头初始化它,如果您想生成它,则不需要DROP函数。例如,将REDUCE(""替换为:REDUCE({"Cells", "Ordered Sequence"}

相关问题