让我们考虑一个序列:1,2,3,4,5....这显然很容易在 Excel 中创建。但是如何创建一个派生序列,其中原始序列的每个成员都连续出现 N 次?
对于 N=3 1,1,1,2,2,2,3,3,3,4,4,4,... 等。
我最终使用选择性粘贴添加功能复制了 1 的列,每轮向下滑动 N 行。但这远非好的解决方案。
感谢您的想法。
答案1
对此最简单的解决方案是使用常规 Excel 公式。
如果从 A1 开始,请放入此公式,然后将其复制下来:
=ROUNDUP(ROWS(A$1:A1)/3,0)
围捕将数字四舍五入为n小数位。在本例中,n设置为 0,因此 Excel 将四舍五入到最接近的整数。
行计算范围内的行数。根据您的起始位置调整范围引用。复制/粘贴时,Excel 将处理其他单元格的调整。
注意:这里的美元符号是重要的. 它锁定范围的开始的参考,以便它将总是位于范围的起始行(或者更确切地说,是公式所在的第一个单元格的行 - 因此从范围的第一行开始),无论您如何复制/粘贴公式。如果没有这个,公式在复制时会中断。因此,根据第一个单元格的位置更改字母和数字,但将美元符号保留在那里。
/3用于将行数除以三。由于这是在 ROUNDUP 函数中,并且设置为 0 个小数位,因此所有结果都将四舍五入为最接近的整数。一旦公式填满列的其余部分,这将导致每个数字重复 3 次。要获得不同的重复率,请将 3 更改为不同的数字。
如果你想这样做穿过A排, 代替向下A柱子(例如:在 A1、B1、C1、... 而不是 A1、A2、A3、... 中)您需要使用 COLUMNS 函数而不是 ROWS,并调整范围引用以便锁定起始列而不是起始行。
例子:
=ROUNDUP(COLUMNS($A1:A1)/3,0)
对于连续起作用的公式或者列布局,您可以使用类似下面的布局,但最好根据您实际使用的布局选择上述布局之一。如果您的范围跨越多行,这也会产生可能不理想的结果和多列。
=ROUNDUP(COLUMNS($A1:A1)*ROWS(A$1:A1)/3,0)
对于非连续和/或非数字的内容,您需要留出一个范围作为源列表。假设您的源值列表在 B 列,从 B1 开始。为此,要在 A 列中重复 3 次这些值,您可以在 A1 中使用以下内容并向下复制:
=INDIRECT(CONCATENATE("B",ROUNDUP(ROWS(A$1:A1)/3,0)))
注意:这不会根据源列的移动进行调整。如果源列移动,您必须手动修复公式,更改"B"
以匹配新位置。如果您的源数据从第 1 行以外的行开始,您需要稍微调整公式以添加偏移量。
如果您想要调整重复率,请使用除数的参考单元格。下面的示例从上一个公式开始,并假设除数在 C1 中。
=INDIRECT(CONCATENATE("B",ROUNDUP(ROWS(A$1:A1)/C1,0)))
答案2
我发现一个适用于动态数组的方法:
=ROUNDDOWN(SEQUENCE(count*repeats,,1,1/repeats),0)
例如,count=2,repeats=3
=ROUNDDOWN(SEQUENCE(6,,1,1/3),0)
生成:
1,1,1,2,2,2
答案3
为了灵活且可重复用于其他情况(包括将结果放在行或列、不同的工作簿等功能),最好的方法是使用 Excel 的宏语言 (VBA)。为了快速开始,您可以在宏中记录要自动化的大致步骤,然后编辑该宏以进行微调和自定义。例如,以下是一些 vba 代码,用于将第一列的每个单元格复制到第三列:
Sub triplicate()
iDestCol = 3
nCopy = 3
rowEnd = ThisWorkbook.ActiveSheet.Range("a" & Rows.Count).End(xlUp).Row
nIndex = 0
With ThisWorkbook.ActiveSheet
For i = 1 To rowEnd
For j = 1 To nCopy
Cells((nIndex + j), iDestCol) = Cells(i, 1)
Next j
nIndex = nIndex + nCopy
Next i
End With
End Sub