簡體   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