从一定范围的单元格中按特定顺序挑选值
我有一堆数字或文本在不同的单元格中,例如:
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