从一定范围的单元格中按特定顺序挑选值

我有一堆数字或文本在不同的单元格中,例如:

2 50 900 1000 6 10 10 30 

要么

 abcde 

我需要根据起始号码和分隔符对它们进行sorting。 例如,如果起始者是3,我将从第三个值开始,在上面的数字中将是900,并且在字母表中将是“c”

然后从起始者,我需要跳过每一个固定的数字,这是分频器。 例如,如果分频器是3,那么我将需要每第三个值。 在数字中select的下一个数字是10,在字母表中,下一个要select的数字是“a”。

当search到达范围的末尾时,需要从头开始,再从头开始。 如果之前select了该值,那么我必须select下一个尚未使用的值。

这里有更多的例子,使用上面的数字或字母顺序:

起动器:3 – 分配器:3

  • 900 10 2 1000 10 50 6 30
  • cadbe

起动器:2 – 分配器:2

  • 50 1000 10 30 900 6 10 2
  • bdace

请注意,在这里,30之后我会select50,但是因为我已经select了它,所以我select了下一个未使用的数字,在这种情况下是900.有时可能会发生之前使用两个或三个数字,所以selectalgorithm应该跳到第一个未使用的一个!

首发:4 – 分频器:2

  • 1000 10 30 50 6 10 2 900
  • daceb

无论如何,我不完全确定如何在Excel中做到这一点。 我试图使用偏移量,索引,查找,但失败。

数据types不重要,我只是想给出两个例子,所以我select了一个数字和一个文本,因为任何types的数据的规则应该是相同的。

有没有简单的方法来解决这个问题,还是我必须弄脏我的手,写一个macros?

有趣的小math练习:-)

举一个例子,我把值的范围放在第一行A1:E1

  ABCDE 1 aa bb cc dd ee 2 bb dd aa cc ee 

A2我把:

 =INDEX($A$1:$E$1,MOD((COLUMNS($A2:A2)-1)*divider+starter+INT((COLUMNS($A2:A2)-1)*GCD(COLUMNS($A$1:$E$1),divider)/COLUMNS($A$1:$E$1))-1,COLUMNS($A$1:$E$1))+1) 

然后把公式拖到右边 该示例显示了2的“启动器”和2的“分频器”。

几个关键点

我们使用索引来select范围的一个成员:

 =INDEX($A$1:$E$1, ... ) 

我们在哪一列(从零开始):

 COLUMNS($A2:A2)-1) 

范围中的列数(数组长度):

 COLUMNS($A$1:$E$1) 

索引是模数的列数,但是我们切换到INDEX函数的基于1的索引,因此减法和加法:

 MOD( ... -1,COLUMNS($A$1:$E$1))+1 

如果我们不担心重复数字(或者更确切地说,它是一个与所需索引模数相等的数字),那么这是索引的一部分,告诉我们该在哪里。

 (COLUMNS($A2:A2)-1)*divider+starter 

每当我们重复时,这个部分就加1。

 INT((COLUMNS($A2:A2)-1)*GCD(COLUMNS($A$1:$E$1),divider)/COLUMNS($A$1:$E$1)) 

最后一部分是因为数组长度的GCD和“divider”,就像您所称的那样,等于分割符mod的数组长度的数倍时存在的不重叠的重复序列。 (你一次只能在这些重复序列之一上。)所以,数组长度/ GCD是这样一个序列的长度,一旦你使用了这个数值,你需要跳过1去下一个重复序列。 我们只是将输出中的位置按重复序列current position / (array-length / GCD) = current position * GCD / array-length向下舍入(使用INT)的值的数量来划分,以查看有多less抵消我们需要的。

也可以看看:

模块化算术

GCD