web-dev-qa-db-ja.com

文字と数字で値を並べ替えるにはどうすればよいですか?

これらのような値を持つ列があります

A1
A-3 // reads: A (minus 3)
J24
J-2
A24
...

次に、最初の文字で並べ替えたいと思います。その後、次の番号で。しかし、Excelはマイナスをダッシュ​​として読み取り、そのように並べ替えます

A1
A2
A3
..
A-1

末尾の文字がある特別な機会があります

F2B
F-2B

A-Zソートをどのようにしたいか

A-3
A-2
A-1
A0
A1
..
Z-3
Z-2
Z-1
Z0
Z1
Z2
..

VBAなしでこれを解決する方法はありますか?

2
user1005339

Example operation

xを3つの部分に分割できます。

  • 接頭辞部分=LEFT(x)
  • その他の=RIGHT(x, LEN(x)-1)。これは以下ではyと呼ばれ、を含みます。
    • 番号部分=IFERROR(VALUE(y), VALUE(LEFT(y, LEN(y)-1)))および
    • サフィックス部分=RIGHT(y, LEN(y)-LEN(number_part)))

並べ替えるだけです。

1
Arnie97

以下のアルゴリズムに基づくExcelの実装例

文字列を個々のコンポーネントに分割してカスタムソートすることはできますが、列形式の指定がないと、推測のみを提供できます。

まず、以下のようにスプレッドシートを設定します(列名は必要ありませんが、並べ替えダイアログに追加するために追加されました)。この例では、文字列は最大6文字であると想定しています。

Spreadsheet Layout to Sort Columns

次のように数式をコピーします。

  1. =MID(A2, 1, 1)を列B2に入力します。
  2. =IF(MID(A2, 2, 1) = "-", IF(MID(A2, 3, 1) = "", "", "-" & MID(A2, 3, 1)), MID(A2, 2, 1))を列C2に入力します。
  3. =IF(MID(A2, 2, 1) = "-", IF(MID(A2, 4, 1) = "", "", "-" & MID(A2, 4, 1)), MID(A2, 3, 1))を列D2に入力します。
  4. =IF(MID(A2, 2, 1) = "-", IF(MID(A2, 5, 1) = "", "", "-" & MID(A2, 5, 1)), MID(A2, 4, 1))を列E2に入力します。
  5. =IF(MID(A2, 2, 1) = "-", IF(MID(A2, 6, 1) = "", "", "-" & MID(A2, 6, 1)), MID(A2, 5, 1))をF2列に挿入します。
  6. 列B2からF2を選択し、数式を最後の行にコピーします。結果は上記のスクリーンショットのようになります。
  7. 列A1からF10を選択し、右クリックしてSortを選択し、次にCustom Sort ...。このポップアップが表示されます。

Sort Dialog

  1. カスタムリストを使用して、以下に示す並べ替え順序を指定しました。カスタムリストにコピーします。カスタムリストは、Orderドロップダウンリストから指定できます。次に、画像のように列を並べ替え、[〜#〜] ok [〜#〜]を選択して並べ替えます。並べ替えの警告が表示される場合があります。「数字とテキストとして個別に保存された数字を並べ替える」を選択しました(重要かどうかはわかりません)。

    -9、-8、-7、-6、-5、-4、-3、-2、-1、-0、-Z、-Y、-X、-W、-V、-U、-T 、-S、-R、-Q、-P、-O、-N、-M、-L、-K、-J、-I、-H、-G、-F、-E、-D、- C、-B、-A、A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、 V、W、X、Y、Z、0、1、2、3、4、5、6、7、8、9

  2. これが私の最終結果です。いくつかの観察:

    • マイナス値はマイナスでない値の前に来ます。
    • 負の値の場合、大きい数は小さい数よりも前に来ます(例:J-24およびJ-2)
    • マイナスではない値の場合、大きい数は小さい数の後に続きます(例:A1とA24)。
    • 以下のアルゴリズムの並べ替えリストのカスタマイズをカスタマイズして、必要に応じて値を任意の順序で並べ替えることができます。

Final Sorted Results

Excel関数の説明

最初の文字を区切るために、私は式を使いました

=MID(A2, 1, 1)

後続の文字を抽出するために、次の式を使用しました。

=IF(MID(A2, 2, 1) = "-", IF(MID(A2, N, 1) = "", "", "-" & MID(A2, N, 1)), MID(A2, N-1, 1))`

Where character `N` applies to characters 3, 4, 5, and 6.  The `Else` part of the first `IF` function will take care of character 2 for a non-minus sort. 

擬似コードでは、式はこれを行います:

If character 2 is a minus then prep our current character N for sorting
  If character N is blank then
    Return a blank because we have no character to sort by
  Else
    Return a "-" prepended to character N
    (e.g. `-5`, `-B`, which is understood by custom sort list)
  End If
Else character 2 is not a minus
  Return character N-1 for sorting
  (-1 because minus doesn't exist for non-minus values)
End If

仮定を伴うアルゴリズム

MID関数とIF関数を組み合わせて文字列を分割し、カスタムソートを適用して最終結果を達成しました。私は以下の仮定をすることによっていくつかの自由をとっています:

  1. 最初の列は残りの文字列とは別に扱われ、常に最初にアルファベットの昇順でソートされます(例:A, B, Y, Z)。
  2. 列2から最後まで、マイナス-の値は、値のない値の前に来るようにソートされます(例:-24B, -24A, -2B, -2A, -1, 1, 2A, 2B, 24A, 24B、この順序で)。さらに:
    • マイナス-が前に付いている値の場合、並べ替え順は数値の降順とアルファベットの降順ですが、数値はアルファベットの前にきます。例:
      • 降順の数値:-24-2より前に来るため、-24A-2Aより前に来ます。
      • 降順のアルファ:BAの前にあり、BAはそれぞれ-B-Aのように扱われるため、-2B-2Aより前に来ます。
      • アルファベットの前の数値:4Bの前にあるため、-24B-2Bの前にあります。
    • 前にマイナスがない値の場合、並べ替え順序は昇順の数値と昇順のアルファですが、数値の前にアルファがあります。例:
      • 昇順の数値:224より前に来るため、2A24Aより前に来ます。
      • 昇順のアルファベット:ABより前に来るため、2A2Bより前に来ます。
      • 数字の前の英字:A4の前にあるため、2A24Aの前にあります。

ルールは、列のフォーマット方法によって大きく異なります。

カスタムソートリスト

並べ替えの概要は、カスタム並べ替えリストに以下の順序で記載されています。負の数字とアルファベット文字は、アルファベットの前に来る数字の降順でリストされます。正の数字と英字は、数字の前に来る英字で昇順にリストされます。

-9,-8,-7,-6,-5,-4,-3,-2,-1,-0,-Z,-Y,-X,-W,-V,-U,-T,-S,-R,-Q,-P,-O,-N,-M,-L,-K,-J,-I,-H,-G,-F,-E,-D,-C,-B,-A,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9

ソートリストは、望ましい結果を得るのに必要な任意の方法で順序付けできることに注意してください。下記は用例です。

  • マイナスアルファオーダーの昇順が必要な場合は、-Z to -A-A to -Zに並べ替えます(たとえば、A-2AA-2Bの前に来ます)。
  • -9 to -0の後ろに-Z to -Aを移動して、数値の前にマイナスアルファを取得します(例:J-2FJ-24の前に来る)。
  • AからZの前に09に移動して、英字の前にマイナスでない数値を取得します(例:F21F2Aの前に来る)。

このカスタムソートリストは、左の列から右の列に向かって各文字に個別に適用され、最終的なソート結果が得られます。

0
user9525052

あなたの問題はいくつかのヘルパー列を使用して解決できます:

enter image description here

仕組み:

  • ソートされていないデータ範囲は_B2:B13_です。
  • _C2_の数式。 =Left(B2,1)、記入してください。
  • _D2_の数式。 =VALUE(RIGHT(B2,LEN(B2)-1))、記入してください。
  • ソートするデータを選択します。
  • HOMEタブからSortアイコンをクリックしてカスタムソート
  • スクリーンショットに示すようにColumn、_Sort ON_&Orderを設定し、Okで終了します。
  • 最後にSort Warning Dialogueselect _Second Option_&hitOkから最後に終わる。

N.B。

  • 列A(赤い色)に並べ替えられていないデータの元の順序を含めて、並べ替えられたデータと比較しました。
  • データがソートされた後、両方のヘルパー列を非表示にすることができます。
  • 必要に応じて、数式のセル参照を調整します。
0
Rajesh S