Excelの並び替えに関する質問です。良い回答は、200ポイント差し上げます。

並び順を以下のようなルールで並び替えたいの思います。
数字(半角全角)→英字(半角全角)→ひらがな/漢字→カタカナ(半角全角)

【理想の並び替え】
 A列      B列
1 012ディズニー  ーーー
2 2GODBABY  ーーー
3 2おいなり   ーーー
4 2豆しば    ーーー
5 2クロネミニノート   ーーー
6 BIG      ーーー
7 にゃんぱい   ーーー
8 仮面ライダー   ーーー
9 コアラのマーチ   ーーー

マクロでの回答は、ソースも記述願います。
どうか宜しくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2011/01/11 23:04:47
  • 終了:2011/01/12 12:55:50

ベストアンサー

id:ardarim No.1

ardarim回答回数892ベストアンサー獲得回数1422011/01/12 00:24:38

ポイント200pt

マクロでソート用の文字列を計算する関数を用意し、空いている列(例えばC列)に格納します。その上で、C列をキーにしてソートします。

マクロは、標準モジュールに追加してください。(VBAエディタで、ファイル名の上で右クリックし、挿入→標準モジュール)

Function SortIndex(ByVal src As String) As String

    Dim i As Long
    
    SortIndex = "_"

    For i = 1 To Len(src)
        SortIndex = SortIndex & Right$("000" & Hex$(AscW(StrConv(Mid$(src, i, 1), vbNarrow))), 4)
    Next i

End Function

Unicodeでのコード順が半角数字→半角英字→ひらがな→漢字→半角カタカナであることを利用してプログラムを簡略化しています。


★入力例(C列に数式を入力)

ABC
1012ディズニー---=SortIndex(A1)
22GODBABY---=SortIndex(A2)
32おいなり---=SortIndex(A3)
42豆しば---=SortIndex(A4)
52クロネミニノート---=SortIndex(A5)
6BIG---=SortIndex(A6)
7にゃんぱい---=SortIndex(A7)
8仮面ライダー---=SortIndex(A8)
9コアラのマーチ---=SortIndex(A9)

★実際の表示(数式の計算後。C列でソートします)

ABC
1012ディズニー---_003000310032FF83FF9EFF68FF7DFF9EFF86FF70
22GODBABY---_00320047004F00440042004100420059
32おいなり---_0032304A3044306A308A
42豆しば---_00328C4630573070
52クロネミニノート---_0032FF78FF9BFF88FF90FF86FF89FF70FF84
6BIG---_004200490047
7にゃんぱい---_306B3083309330713044
8仮面ライダー---_4EEE9762FF97FF72FF80FF9EFF70
9コアラのマーチ---_FF7AFF71FF97306EFF8FFF70FF81


同じ文字種内での半角と全角は順不同になります。例えば、半角数字と全角数字は同一視されます。半角数字→全角数字のような並び替えを期待する場合は、仕様が変わります。


また、ソート用の列を作らず全部マクロで行うことも可能ですが、プログラムは少し長くなります。ご要望があれば回答します。

id:anim130M

回答ありがとうございます。

表には3000行の計算式を入れているためか、A列が空であってもソートされてしまいました。

どのように回避すればよろしいでしょうか?

2011/01/12 09:28:19

その他の回答(1件)

id:ardarim No.1

ardarim回答回数892ベストアンサー獲得回数1422011/01/12 00:24:38ここでベストアンサー

ポイント200pt

マクロでソート用の文字列を計算する関数を用意し、空いている列(例えばC列)に格納します。その上で、C列をキーにしてソートします。

マクロは、標準モジュールに追加してください。(VBAエディタで、ファイル名の上で右クリックし、挿入→標準モジュール)

Function SortIndex(ByVal src As String) As String

    Dim i As Long
    
    SortIndex = "_"

    For i = 1 To Len(src)
        SortIndex = SortIndex & Right$("000" & Hex$(AscW(StrConv(Mid$(src, i, 1), vbNarrow))), 4)
    Next i

End Function

Unicodeでのコード順が半角数字→半角英字→ひらがな→漢字→半角カタカナであることを利用してプログラムを簡略化しています。


★入力例(C列に数式を入力)

ABC
1012ディズニー---=SortIndex(A1)
22GODBABY---=SortIndex(A2)
32おいなり---=SortIndex(A3)
42豆しば---=SortIndex(A4)
52クロネミニノート---=SortIndex(A5)
6BIG---=SortIndex(A6)
7にゃんぱい---=SortIndex(A7)
8仮面ライダー---=SortIndex(A8)
9コアラのマーチ---=SortIndex(A9)

★実際の表示(数式の計算後。C列でソートします)

ABC
1012ディズニー---_003000310032FF83FF9EFF68FF7DFF9EFF86FF70
22GODBABY---_00320047004F00440042004100420059
32おいなり---_0032304A3044306A308A
42豆しば---_00328C4630573070
52クロネミニノート---_0032FF78FF9BFF88FF90FF86FF89FF70FF84
6BIG---_004200490047
7にゃんぱい---_306B3083309330713044
8仮面ライダー---_4EEE9762FF97FF72FF80FF9EFF70
9コアラのマーチ---_FF7AFF71FF97306EFF8FFF70FF81


同じ文字種内での半角と全角は順不同になります。例えば、半角数字と全角数字は同一視されます。半角数字→全角数字のような並び替えを期待する場合は、仕様が変わります。


また、ソート用の列を作らず全部マクロで行うことも可能ですが、プログラムは少し長くなります。ご要望があれば回答します。

id:anim130M

回答ありがとうございます。

表には3000行の計算式を入れているためか、A列が空であってもソートされてしまいました。

どのように回避すればよろしいでしょうか?

2011/01/12 09:28:19
id:sumksm No.2

sk回答回数7ベストアンサー獲得回数02011/01/12 01:44:27

1 2豆しば

2 コアラのマーチ

3 012ディズニー

4 にゃんぱい

5 BIG

6 2GODBABY

7 2クロネミノート

8 仮面ライダー

9 2おいなり

  • id:ardarim
    データのある行だけに計算式を入れるのが好ましいですが、それが難しい場合は、マクロを少し変更することで回避はできます。
    SortIndex = "_"
    の行の後に、
    If src = "" Then SortIndex = "x": Exit Function
    という行を追加してください。

    この行を追加すると、空の行(データのない行)はデータのある行よりも後ろにソートされます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません