让我们考虑一个序列:1、2、3、4、5...。这显然很容易在Excel中创建。但是,您将如何创建一个派生序列,其中原始序列的每个成员都连续存在N次?
对于N = 3 1,1,1,2,2,2,3,3,3,4,4,4,...等
我最后用粘贴特殊添加功能复制1s列,每轮向下滑动N行。但是,这远非一个好的解决方案。
感谢您的想法。
让我们考虑一个序列:1、2、3、4、5...。这显然很容易在Excel中创建。但是,您将如何创建一个派生序列,其中原始序列的每个成员都连续存在N次?
对于N = 3 1,1,1,2,2,2,3,3,3,4,4,4,...等
我最后用粘贴特殊添加功能复制1s列,每轮向下滑动N行。但是,这远非一个好的解决方案。
感谢您的想法。
Answers:
最简单的解决方案是使用常规Excel公式。
如果您从A1开始,请放下此公式,然后将其复制下来:
=ROUNDUP(ROWS(A$1:A1)/3,0)
ROUNDUP将数字四舍五入至n位小数。在这种情况下,n设置为0,因此Excel将四舍五入到最接近的整数。
ROWS计算范围内的行数。根据您的起始位置调整范围参考。复制/粘贴时,Excel将处理其他单元格的调整。
注意:这里的美元符号很重要。它将引用锁定为范围的开始,以便它始终位于范围的开始行中(或更准确地说,是将公式放入其中的第一个单元格的行-因此,请从第一行开始范围内),无论您如何复制/粘贴公式。没有这个,您的公式将在您复制下来时中断。因此,根据您的第一个单元格所在的位置更改字母和数字,但在此处保留该美元符号。
/ 3可以将ROWS计数除以三。由于这在ROUNDUP函数内部,并且设置为0小数位,因此所有结果将四舍五入到最接近的整数。将公式填充到该列的其余部分后,这将导致每个数字重复3次。要获得不同的重复率,请将3更改为其他数字。
如果您正在寻找这样做跨一排,而不是向下一列(如:在A1,B1,C1的,...相反A1,A2,A3,...),你需要使用的列函数而不是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)))
为了在其他情况下具有灵活性和可重用性(包括将结果放入行或列,不同的工作簿等功能),最好的方法是使用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