从一系列单元格中按特定顺序选择值

时间:2014-01-26 23:20:12

标签: excel excel-2007 excel-formula excel-2010

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

2   50  900 1000    6   10  10     30

a   b   c   d   e

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

然后从初学者我需要每次跳过一个固定的数字,这是分频器。例如,如果分频器为3,那么我将需要每三个值。在数字中,下一个要挑选的数字是10,而在字母表中,下一个要挑选的数字是“a”。

当搜索到达范围的末尾时,它需要从头开始,从头开始。 如果之前已经选择了该值,那么我必须选择下一个尚未使用的值。

以下是更多示例,使用上面的数字或字母序列:

起动器:3 - 分频器:3

  • 900 10 2 1000 10 50 6 30
  • c a d b e

起动器:2 - 分频器:2

  • 50 1000 10 30 900 6 10 2
  • b d a c e

请注意,在30之后,我会选择50,但因为我已经选择了它,我选择下一个未使用的数字,在本例中为900.有时可能会发生之前使用过两个或三个数字,所以选择算法应跳转到第一个未使用的算法!

起动器:4 - 分频器:2

  • 1000 10 30 50 6 10 2 900
  • d a c e b

无论如何,我不完全确定如何在Excel中执行此操作。我试图使用偏移量,索引,查找 但失败了。

数据类型并不重要,我只是想举两个例子,所以我选择给一个数字和一个文本,因为任何类型数据的规则都应该相同。

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

1 个答案:

答案 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),以查看我们需要多少偏移量。

另见:

Modular Arithmetic

GCD