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

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

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

2   50  900 1000    6   10  10     30

或者
a   b   c   d   e

我需要根据起始编号和分隔符对它们进行排序。例如,如果 starter 是 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 中执行此操作。我尝试使用偏移、索引、查找
    但失败了。

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

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

    最佳答案

    有趣的小数学练习:-)

    例如,我将值的范围放在第一行 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/

    相关文章:

    excel - CSV 文件必须保存两次

    Excel公式: Minimum value of an array containing strings

    excel - 索引/匹配多张纸中的多个结果

    vba - 使 Excel 图表上的 X 轴和 Y 轴比例相等

    vba - 自动填充只读 Excel 2010 xlsm 另存为文件名框

    sql - 将excel导入sql db表

    c# - 如何在不涉及VBA代码的情况下通过C#使用Application.OnKey?

    excel - 使用excel vba过滤掉多个条件

    excel - 如何在一张纸上获取文件中所有工作表的列表?

    java - Excel数据变化,Java没有注意到