如何在 Excel 中生成 1,2,3,... 序列,其中每个成员重复 N 次

如何在 Excel 中生成 1,2,3,... 序列,其中每个成员重复 N 次

让我们考虑一个序列: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

相关内容