web-dev-qa-db-ja.com

関数/方程式のみを使用してテーブルをソートする方法

シート1のテーブルをどのように並べ替えることができますか

A B C D E
3 7 3 6 5

シート2の別のテーブルに

A C E D B
3 3 5 6 7

関数のみを使用して?

9
Season

これを行う非常に簡単な方法の1つは、ランクインデックスを用意し、HLOOKUPを使用して対応する値を見つけることです。

=RANK(A4,$A$4:$E$4,1)

Example 1

=IF(COUNTIF($A$1:A$1,A1)>1,RANK(A4,$A$4:$E$4,1)+COUNTIF($A$1:A$1,A1)-1,RANK(A4,$A$4:$E$4,1))

Example 2

=HLOOKUP(COLUMN(),$A$2:$E$4,2,FALSE)

Example 3

=HLOOKUP(COLUMN(),$A$2:$E$4,3,FALSE)

Example 4

11
Stepan1010

さて、ここに追加の一時的な列なしの「1つの式がすべてを実行する」ソリューションがあります。

enter image description here

A6の式:

 = INDEX($ A $ 2:$ E $ 2、MATCH(SMALL($ A $ 3:$ E $ 3 + COLUMN($ A $ 3:$ E $ 3)/ 100000000、COLUMN())、$ A $ 3: $ E $ 3 + COLUMN($ A $ 3:$ E $ 3)/ 100000000,0))

配列数式として入力します。つまり、 Ctrl-Shift-Enter。次に、隣接する列にコピーします。

数値も取得するには、A7でこの数式を使用します(これも配列数式として)。

 = ROUND(SMALL($ A $ 3:$ E $ 3 + COLUMN($ A $ 3:$ E $ 3)/ 100000000、COLUMN())、6)

両方の式は、重複の可能性も処理する必要があるため、少し肥大化しています。解決策は、並べ替え(SMALL関数)を適用する前に、列の非常に小さな部分を追加するだけです。その後、もう一度削除します...

11
Peter Albert

より簡単な解決策は、 "Large"関数を使用することだと思います: Excel screenshot

列関数は、5から1まで数える簡単な方法ですが、ヘルパー列の方が簡単な場合があります。

「小」機能でも同様の答えが得られます。

1
Eliyahu

私は「少数のテクニックを追加する」を使用しましたが、これはヘルパーの行/列にとって最もエレガントだと思います:

=RANK(B4,$B$4:$F$4,0) + COUNTIF($B$4:$F$4,B4)-1

(行の列を横切ってコピー)RANKはあなたを閉じ、COUNTIF部分はそのポイントまでのセルの重複の数を数えることによって重複を処理します。常に一致しているため(それ自体)、最終ランクとして1を引きます。この「ソート」は、出現順に結び付けます。空のセルは#N/Aおよび#Valuesとして文字データを生成することに注意してください。

1
DaveM

実行可能です! :-)

これが サンプルファイル です。

説明

データがSheet1の行1にあり、データを別のシートの列1からソートする必要があると仮定します。そうでない場合は、それに応じて調整します。

この数式をターゲットシートの列1、たとえば行2に配置します。

 = ROUND(SMALL(Sheet1!$ A $ 1:$ E $ 1 + COLUMN(Sheet1!$ A $ 1:$ E $ 1)/ 100000000、COLUMN())、6)

数式を配列数式として入力する必要があります。つまり、Ctrl-Shift-Enterを押します。

列1とは別の列に配置する場合は、COLUMN()COLUMN()-COLUMN($A$2)+1に置き換える必要があります。ここで、_$A$2_はセル自体への参照である必要があります。

この数式は、範囲内の最小の数値を返します。次の4列をコピーすると、注文番号のリストが表示されます。

これを列番号に戻すには、2つのステップを実行する必要があります。

  1. 列番号を把握する:
    これは次の式で行うことができます:
     = MATCH(SMALL(Sheet1!$ A $ 1:$ E $ 1 + COLUMN(Sheet1!$ A $ 1:$ E $ 1)/ 100000000、COLUMN())、Sheet1!$ A $ 1:$ E $ 1 + COLUMN(Sheet1!$ A $ 1:$ E $ 1)/ 100000000,0)
    
    -もう一度、配列数式として入力します。ソースデータが列Aで始まらない場合は、+COLUMN(Sheet1!$A$1)-1を追加する必要があります。$ A $ 1はソースデータの左端のセルに置き換える必要があります。
  2. 列番号を文字に変換します。
    ステップ1の列番号がセルA6にあると仮定すると、次の数式が機能します。
 = LEFT(ADDRESS(1、A6,2)、SEARCH( "$"、ADDRESS(1、A6,2))-1)

もちろん、ステップ1と2を組み合わせることもできます。これにより、このメガフォーミュラが生成されます。

 = LEFT(
 ADDRESS(
 1、
 MATCH(
 SMALL(Sheet1!$ A $ 1:$ E $ 1 + COLUMN(Sheet1! $ A $ 1:$ E $ 1)/ 100000000、COLUMN())、
 Sheet1!$ A $ 1:$ E $ 1 + COLUMN(Sheet1!$ A $ 1:$ E $ 1)/ 100000000、
 0)、
 2)、
 SEARCH(
 "$"、
 ADDRESS(
 1、
 MATCH(
 SMALL(Sheet1!$ A $ 1:$ E $ 1 + COLUMN(Sheet1!$ A $ 1:$ E $ 1)/ 100000000、COLUMN())、
 Sheet1!$ A $ 1:$ E $ 1 + COLUMN(Sheet1!$ A $ 1:$ E $ 1)/ 100000000,0)、
 2)
)-1 
)
0
Peter Albert