我在不同的单元格中有一堆数字或文字,例如:
2 50 900 1000 6 10 10 30
或
a b c d e
我需要根据起始编号和分隔符对它们进行排序。例如,如果起动器是3,我将从第三个值开始,在上面的数字中将是900,在字母表中将是“c”
然后从初学者我需要每次跳过一个固定的数字,这是分频器。例如,如果分频器为3,那么我将需要每三个值。在数字中,下一个要挑选的数字是10,而在字母表中,下一个要挑选的数字是“a”。
当搜索到达范围的末尾时,它需要从头开始,从头开始。 如果之前已经选择了该值,那么我必须选择下一个尚未使用的值。
以下是更多示例,使用上面的数字或字母序列:
起动器:3 - 分频器:3
起动器:2 - 分频器:2
请注意,在30之后,我会选择50,但因为我已经选择了它,我选择下一个未使用的数字,在本例中为900.有时可能会发生之前使用过两个或三个数字,所以选择算法应跳转到第一个未使用的算法!
起动器:4 - 分频器:2
无论如何,我不完全确定如何在Excel中执行此操作。我试图使用偏移量,索引,查找 但失败了。
数据类型并不重要,我只是想举两个例子,所以我选择给一个数字和一个文本,因为任何类型数据的规则都应该相同。
有没有简单的方法可以解决这个问题,还是我必须弄脏手写宏?
答案 0 :(得分:3)
有趣的小数学练习:-)
例如,我将值范围放在顶行A1:E1
:
A B C D E
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的“分隔符”。
几个要点
我们使用索引来选择范围中的一个成员:
=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等于你添加分频器的多个数组时存在的非重叠的重复序列的数量-长度。 (你一次只能在其中一个重复序列上。)所以,数组长度/ GCD是这样一个序列的长度,一旦你使用了这个数量的值,你就需要跳过1到达下一个重复序列。我们只是将输出中的位置除以重复序列current position / (array-length / GCD)
= current position * GCD / array-length
中的值的数量,向下舍入(使用INT),以查看我们需要多少偏移量。
另见: