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


2

让我们考虑一个序列:1、2、3、4、5...。这显然很容易在Excel中创建。但是,您将如何创建一个派生序列,其中原始序列的每个成员都连续存在N次?

对于N = 3 1,1,1,2,2,2,3,3,3,4,4,4,...等

我最后用粘贴特殊添加功能复制1s列,每轮向下滑动N行。但是,这远非一个好的解决方案。

感谢您的想法。


这是行还是列?
Bob Vale 2014年

列中,但是既然我们可以随时进行转置-有关系吗?
NeverStopLearning 2014年

取决于您是否使用行功能.....
Bob Vale 2014年

@NeverStopLearning如果您要使用某些根据范围大小进行数学运算的函数,那可能很重要。如果您使用的功能依赖于垂直排列,然后转置为水平,则会产生不良效果。解决方法是先复制,然后粘贴值,然后再进行转置,但是最好是第一次使用正确的公式。
Iszi 2014年

Answers:


4

最简单的解决方案是使用常规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)))

确实是我的建议,但是用户想要专栏,在发布之前,我一直在等待评论的答案
Bob Vale 2014年

@BobVale也为此投入了一些东西。谢谢。
Iszi 2014年

...还有一个包罗万象的东西。我对没有CELLS函数来汇总整个范围感到有些失望-我在Google上找到的Microsoft文章说这样做是ROWS * COLUMNS。
Iszi 2014年

此解决方案无需考虑输入序列即可生成唯一的值列。在给定特定序列的情况下,问题是否会生成派生序列?例如,如果输入序列不是连续和连续的(例如:1、3、2等),则此解决方案将失败。
jdh 2014年

@jdh问题的标题和正文非常明确地以从1开始的升序列出了自然数序列。尽管正文中确实使用了一些广义的词,但没有明确的迹象表明OP正在要求输入可以普遍适用于任何顺序的序列的解决方案。但是,通过添加一些其他功能,在我的解决方案中使用的相同逻辑对于解决广义问题也仍然有用。
Iszi 2014年

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

不利的一面是,如果您在某行或某列中使用了此方法,然后在中间插入一行,则必须重新运行宏,而基于公式的解决方案只会更新
Bob Vale

宏可以写为加载项,然后用作自定义公式,这样,如果输入参数的值发生更改,宏(即加载项公式)将自动重新评估。在这种情况下,输入序列的位置将是triplicate()的参数。对于像这样的简单事情,编写用于处理外接程序协议的工作量超过手动重新运行宏的工作量。
jdh 2014年

谢谢,这回答了另一种解释。我知道使用宏可以执行任何操作,但是我对基于非宏公式的解决方案非常感兴趣。抱歉,下次我将在说明中明确提及。
NeverStopLearning
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.