繁体   English   中英

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

[英]pick value in a specific order from a range of cells

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

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
  • cadbe

起动器:2 - 分频器:2

  • 50 1000 10 30 900 6 10 2
  • bdace

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

起动器:4 - 分频器:2

  • 1000 10 30 50 6 10 2 900
  • daceb

无论如何,我不完全确定如何在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和“分频器”(如你所说)等于在你添加分频器的多个数组长度时存在的非重叠的重复序列的数量。 (你一次只能在其中一个重复序列上。)所以,数组长度/ GCD是这样一个序列的长度,一旦你使用了这个数量的值,你就需要跳过1到达下一个重复序列。 我们只是将输出中的位置除以重复序列current position / (array-length / GCD)的值数current position / (array-length / GCD) = current position * GCD / array-length ,向下舍入(使用INT),以查看多少抵消我们需要。

也可以看看:

模数运算

GCD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM