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

並び順を以下のようなルールで並び替えたいの思います。
数字(半角全角)→英字(半角全角)→ひらがな/漢字→カタカナ(半角全角)
※Unicodeに変換して上記の順に並び替えを行っていますが、
 ひらがな・漢字・カタカナ部分があいうえお順にならなく困っております。

【理想の並び替え】
1048キティ
2ワンピース
LOVE
きゃらえっぐ
宇宙人ST
仮面ライダー
アイミク
ポケモンキッス

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

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/03/03 23:29:41
  • 終了:2011/03/05 14:20:13

ベストアンサー

id:SALINGER No.6

SALINGER回答回数3454ベストアンサー獲得回数9692011/03/04 19:49:43

すいません先の回答は間違いがあります。

(回答後に風呂に入ってて気づきましたw)

Sub mySort()
    Application.ScreenUpdating = False
    Const key As Integer = 3
    Dim i As Long
    Dim j As Long
    Dim lastRow As Long
    Dim sc As Long
    Dim sr As Long
    
    If Selection.Columns.Count < key Then
        MsgBox "キー列が不正です"
        Exit Sub
    End If
    
    sc = Selection.Column
    sr = Selection.Row
    
    Selection.Sort key1:=Cells(sr, sc + key - 1), order1:=xlAscending
    If Cells(sr + Selection.Rows.Count - 1, sc + key - 1).Value <> "" Then
        lastRow = sr + Selection.Rows.Count - 1
    Else
        lastRow = Cells(sr + Selection.Rows.Count - 1, sc + key - 1).End(xlUp).Row
    End If
    
    j = sr
    For i = sr To lastRow
        If Left(Cells(j, sc + key - 1).Value, 1) Like "[ア-ン]" Or Left(Cells(j, sc + key - 1).Value, 1) Like "[ア-ン]" Then
            Range(Cells(lastRow + 1, sc), Cells(lastRow + 1, sc + Selection.Columns.Count - 1)).Insert Shift:=xlDown
            Range(Cells(j, sc), Cells(j, sc + Selection.Columns.Count - 1)).Copy Cells(lastRow + 1, sc)
            Range(Cells(j, sc), Cells(j, sc + Selection.Columns.Count - 1)).Delete Shift:=xlUp
        Else
            j = j + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub
id:anim130M

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

2文字目以降の並びが、

数字(半角全角)→英字(半角全角)→ひらがな/漢字→カタカナ(半角全角)にすることは難しいのですね。

2011/03/05 14:18:05

その他の回答(5件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/03/04 00:40:50

ポイント55pt

この場合、並び替え用に キーを作ってあげればいいです。

たとえば 数字の場合は 頭に 0をつける。

アルファベットは 1

ひらがなは 2

漢字は 3

カタカナは 4

というように。

↓こんな感じです。

01048キティ

02ワンピース

1LOVE

2きゃらえっぐ

3宇宙人ST

3仮面ライダー

4アイミク

4ポケモンキッス

id:anim130M

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

2文字目以降の並びが、

数字(半角全角)→英字(半角全角)→ひらがな/漢字→カタカナ(半角全角)にすることは難しいのですね。

2011/03/05 14:18:19
id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/03/04 09:26:42

このあとよくよく考えてみたのですが、最初の回答は 暫定的なもので 最初の一文字にしか対応できないものとしてください。

2文字目以降は 同じルールでは 並び替えられません。

id:SALINGER No.3

SALINGER回答回数3454ベストアンサー獲得回数9692011/03/04 12:50:22

ポイント55pt

あらかじめ選択した範囲を、質問文の条件でソートするマクロです。

(複数列を選択した場合は一番左側の列がソートされます)

Sub mySort()
    Application.ScreenUpdating = False
    Dim i As Long
    Dim j As Long
    Dim lastRow As Long
    Dim sc As Long
    Dim sr As Long
    
    sc = Selection.Column
    sr = Selection.Row
    
    Selection.Sort key1:=Cells(sr, sc), order1:=xlAscending
    lastRow = Cells(sr + Selection.Rows.Count - 1, sc).End(xlUp).Row
    
    j = sr
    For i = sr To lastRow
        If Left(Cells(j, sc).Value, 1) Like "[ア-ン]" Or Left(Cells(j, sc).Value, 1) Like "[ア-ン]" Then
            Cells(lastRow + 1, sc).Insert Shift:=xlDown
            Cells(lastRow + 1, sc).Value = Cells(j, sc).Value
            Cells(j, sc).Delete Shift:=xlUp
        Else
            j = j + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub
id:anim130M

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

A列からO列まで範囲があり、D列を基準にソート対象であった場合、

どの部分を変更すればよろしいでしょうか?

2011/03/04 16:16:53
id:taknt No.4

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/03/04 17:12:34

SALINGERさんのプログラムで

Selection.Sort key1:=Cells(sr, sc), order1:=xlAscending

Selection.Sort Key1:=Cells(sr, 4), Order1:=xlAscending

に変えると D列になりますが

あ1048キティ

あ2ワンピース

あLOVE

あきゃらえっぐ

あ宇宙人ST

あ仮面ライダー

あアイミク

あポケモンキッス

とかいう場合は、2文字目では ソートされません。

id:anim130M

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

この部分は、

Range("○○:○○").Sort key1:=Range("○○"), order1:=xlAscending で対応いたしました。

2011/03/04 17:42:36
id:SALINGER No.5

SALINGER回答回数3454ベストアンサー獲得回数9692011/03/04 19:01:13

私の回答をわかっていない他の人が、できないと回答するという状況がいまいちよくわかりませんが、

それは置いておいて、私の回答は(複数列を選択した場合は一番左側の列がソートされます)と

書いてあるように1列だけのソートです。


それは複数列にするとキーとなる列をどうするかとか問題となるので簡略化した為ですが、

ご要望に答えて複数列で任意のキー列でソートするようにしてみます。

最初の方のkeyという値が選択範囲の何列目をキーとするかという値です。


>A列からO列まで範囲があり、D列を基準にソート対象であった場合

A列からO列を選択して、keyの値を4にしてください。


Sub mySort()
    Application.ScreenUpdating = False
    Const key As Integer = 4
    Dim i As Long
    Dim j As Long
    Dim lastRow As Long
    Dim sc As Long
    Dim sr As Long
    
    If Selection.Columns.Count < key Then
        MsgBox "キー列が不正です"
        Exit Sub
    End If
    
    sc = Selection.Column
    sr = Selection.Row
    
    Selection.Sort key1:=Cells(sr, sc + key - 1), order1:=xlAscending
    lastRow = Cells(sr + Selection.Rows.Count - 1, sc).End(xlUp).Row
    
    j = sr
    For i = sr To lastRow
        If Left(Cells(j, sc).Value, 1) Like "[ア-ン]" Or Left(Cells(j, sc).Value, 1) Like "[ア-ン]" Then
            Range(Cells(lastRow + 1, sc), Cells(lastRow + 1, sc + Selection.Columns.Count - 1)).Insert Shift:=xlDown
            Range(Cells(j, sc), Cells(j, sc + Selection.Columns.Count - 1)).Copy Cells(lastRow + 1, sc)
            Range(Cells(j, sc), Cells(j, sc + Selection.Columns.Count - 1)).Delete Shift:=xlUp
        Else
            j = j + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub
id:anim130M

2文字目以降の並びが、

数字(半角全角)→英字(半角全角)→ひらがな/漢字→カタカナ(半角全角)にならないのですね。。

データには、こんなのが複雑に入っていて、下のような並びにしたいです。

※ちなみにUnicodeにすると、並び替えられます。

2ARASHI

2Angel

2D-STYLE

2DB改

2011/03/04 20:18:05
id:SALINGER No.6

SALINGER回答回数3454ベストアンサー獲得回数9692011/03/04 19:49:43ここでベストアンサー

すいません先の回答は間違いがあります。

(回答後に風呂に入ってて気づきましたw)

Sub mySort()
    Application.ScreenUpdating = False
    Const key As Integer = 3
    Dim i As Long
    Dim j As Long
    Dim lastRow As Long
    Dim sc As Long
    Dim sr As Long
    
    If Selection.Columns.Count < key Then
        MsgBox "キー列が不正です"
        Exit Sub
    End If
    
    sc = Selection.Column
    sr = Selection.Row
    
    Selection.Sort key1:=Cells(sr, sc + key - 1), order1:=xlAscending
    If Cells(sr + Selection.Rows.Count - 1, sc + key - 1).Value <> "" Then
        lastRow = sr + Selection.Rows.Count - 1
    Else
        lastRow = Cells(sr + Selection.Rows.Count - 1, sc + key - 1).End(xlUp).Row
    End If
    
    j = sr
    For i = sr To lastRow
        If Left(Cells(j, sc + key - 1).Value, 1) Like "[ア-ン]" Or Left(Cells(j, sc + key - 1).Value, 1) Like "[ア-ン]" Then
            Range(Cells(lastRow + 1, sc), Cells(lastRow + 1, sc + Selection.Columns.Count - 1)).Insert Shift:=xlDown
            Range(Cells(j, sc), Cells(j, sc + Selection.Columns.Count - 1)).Copy Cells(lastRow + 1, sc)
            Range(Cells(j, sc), Cells(j, sc + Selection.Columns.Count - 1)).Delete Shift:=xlUp
        Else
            j = j + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub
id:anim130M

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

2文字目以降の並びが、

数字(半角全角)→英字(半角全角)→ひらがな/漢字→カタカナ(半角全角)にすることは難しいのですね。

2011/03/05 14:18:05
  • id:taknt
    >私の回答をわかっていない他の人が、できないと回答するという状況がいまいちよくわかりませんが

    もうちょっと わかりやすく 書いてもらえたらいいですね。
  • id:SALINGER
    不完全な回答でいるか賞ありがとうございます。
    罪滅ぼしのため2文字目以降もソートされる物をアップしておきます。
    http://d.hatena.ne.jp/SALINGER/20110307
     
    >もうちょっと わかりやすく 書いてもらえたらいいですね。
    >Selection.Sort Key1:=Cells(sr, 4), Order1:=xlAscending
    >に変えると D列になりますが
    なりません。以上です。
  • id:taknt
    D列には なるけど、その後の不具合の部分は 手を入れてなかっただけです。
  • id:SALINGER
    >D列には なるけど
    そこだけ変えてもD列をキーにすることはできません。やっぱりわかってなかったのですね。
    わからない人が書きこんでも質問者が混乱するだけです。
  • id:taknt
    Selection.Sort Key1:=Cells(sr, 4), Order1:=xlAscending

    これで D列が ソートされない???

    ま、バグがあるところは 直しようがないけど。
  • id:SALINGER
    >D列が ソートされない???
    そもそもそのD列というのは、質問者の
    >A列からO列まで範囲があり、D列を基準にソート対象であった場合、
    というのしか出てきてませんが、ここでいうD列は基準(キー列)であって、ソート対象はA列からO列ですよね。
    D列をソートする話をしてるのはたぶんあなただけですw
    そしてD列をソートするのなら、そもそもscを4とする意味が無いのです。
    どっちにしろわかっていないということにw
  • id:taknt
    ああ表現の違いのことを言ってるのか。
    Selection.だから 範囲は 指定したところだけで 当然、その範囲が 並び替えられる。
    ま、D列は ソートキーってことで 言うまでも無く、選択範囲が ソートされるのは 当然のこと。

  • id:SALINGER
    あのね、今更わかっている振りしても駄目なんだわ。
    scを4にしている時点で。
    そもそも私のコードはソートしてから入替してるわけ。
    先のソートのキーを変えただけでは後の入れ替えができないのは当たり前。
    Selection.Sort key1:=Cells(sr, sc), order1:=xlAscending
    これだけで質問者の意図するソートができるんだったら苦労はしない。
    4の回答の、「だからできない」の「だから」という前提が間違ってるから
    「できない」の何の証明にもならないということさ。
    ここまで、言わせるなよ恥ずかしい。
  • id:taknt
    一文字目だけで ソートしても できないってことを 言ってるだけさ。
  • id:SALINGER
    それを言うには前提が間違ってるって言ってるだけさ。

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

トラックバック

  • SALINGERの日記 2011-03-04 19:44:19
    http://q.hatena.ne.jp/1299162578 回答した内容が間違っていたようなので修正。 Sub mySort() Application.ScreenUpdating = False Const key As Integer = 3 Dim i As Long Dim j As Long Dim lastRow As Long Dim sc As Long Dim sr As Long If Sel
  • SALINGERの日記 2011-03-07 22:32:02
    http://q.hatena.ne.jp/1299162578 ソートの質問で意外と難題で他にいい方法もありそうだけど、 とりあえずある程度の物はできたので置いておきます。 Sub mySort() Application.ScreenUpdating = False Const key As
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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