我在不同的单元格中有一堆数字或文本,例如:
2 50 900 1000 6 10 10 30
或者
a b c d e
我需要根据起始编号和分隔符对它们进行排序。例如,如果 starter 是 3,我将从第三个值开始,在上面的数字中是 900,在字母表中是“c”
然后从一开始我每次都需要跳过一个固定的数字,即除法器。例如,如果除数是 3,那么我将需要每三个值。在数字中,下一个要选择的数字是 10,在字母表中,下一个要选择的值是“a”。
当搜索到达范围的末尾时,它需要从头开始,然后从头开始。
如果之前已经选择过该值,那么我必须选择下一个尚未使用的值。
以下是更多示例,使用上面的数字或字母序列:
启动器:3 - 分频器:3
启动器:2 - 分频器:2
注意这里,30之后我会选择50,但是因为我已经选择了它,所以我选择下一个未使用的数字,在本例中为900。有时可能会发生之前使用了两个或三个数字,所以选择算法应该跳到第一个未使用的!
启动器:4 - 分频器:2
无论如何,我不完全确定如何在 Excel 中执行此操作。我尝试使用偏移、索引、查找
但失败了。
数据类型无所谓,我只是想举两个例子,所以我选择了一个数字和一个文本,因为任何类型的数据的规则都应该是相同的。
有什么简单的方法可以解决这个问题,还是我必须弄脏手并编写一个宏?
最佳答案
有趣的小数学练习:-)
例如,我将值的范围放在第一行 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 和您所说的“分隔符”等于您添加分隔符的倍数时存在的非重叠重复序列的数量 mod 数组长度。 (您一次只能在这些重复序列中的一个上。)因此,数组长度/GCD 是此类序列的长度,一旦您使用了该数量的值,您将需要跳过 1进入下一个重复序列。我们只需将输出中的位置除以重复序列中的值数
current position / (array-length / GCD)
= current position * GCD / array-length
,四舍五入(使用 INT),看看我们需要多少偏移量。也可以看看:
Modular Arithmetic
GCD
关于excel - 从一系列单元格中按特定顺序选择值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370591/