Excelの並べ替えについてお願いいたします。


今、文字列(ここでは、アルファベットとします)があり、A列とB列に、
CK、D
C、G
AH、AF
CK、X
BI、CK
AF、AZ
A、C
みたいに入っています。

これを並べ替えで、
A、C
C、G
AH、AF
AF、AZ
BI、CK
CK、D
CK、X
となるようにしたいです。

つまり、B列の値とA列の値を見て、同じになるものを、順に並べるのです。
よいやり方が思いつきません。
どうぞ宜しくお願い致します。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2015/08/05 06:15:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:TipsMemo No.1

回答回数5ベストアンサー獲得回数3

ポイント100pt

AからZの次に,AA,AB,・・・AZ,BA,・・・となっている並びをソートしたい
ということですね。

ちょっと手間はかかりますが方法はあります。
アルファベットを数値に変換するのです。

・C列に,並び替え用のカラムを設ける。
・A列とB列のアルファベットを,数字に変換してC列に格納する。
・C列でソートする。

という流れです。

アルファベットを数字に変換する際には,1文字につき,下記の対応があると思ってください。
A:01
B:02
・・・
Z:26
これが対応表1です。

文字を指定した数字に変換excelでアルファベットを指定した数... - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10141547780


で,いまデータとして存在するのはアルファベットが2文字まで並んでいるわけですから,
上記の対応表を2文字分にくっつけます。

A:0001
B:0002
・・・
Z:0026
AA:0101
AB:0102
・・・
AZ:0126
BA:0201
BB:0202
・・・

という具合です。
これが対応表2です。
対応表2を手動で作るのは大変ですから,文字列の置換などして関数で作りましょう。

で,列Aと列Bであわせて最大4文字のアルファベットがあるわけですから
その4文字を数字に変換するために,VLOOKUPを使い
対応表2を参照するのです。

列AにAA,列BにZと入力されていれば
列Cには 01010026 という数字が入るわけです。
前半4桁が列A,後半4桁が列Bを表しているのです。

これができたら,列Cでソートします。

結果として,希望する並び替え結果が得られます。

いかがでしょうか。ちょっと複雑ですが。。。

他6件のコメントを見る
id:miku1973

D,X
C,D
B,C
です。

2015/07/29 11:44:15
id:bnn

C,D
B,C
D,X
C,X
B,D

このケースはどうでしょうか

2015/07/29 13:37:38
id:miku1973

並び替え結果が間違ってました。


C、G

A、C

AF、AZ

AH、AF

CK、D

CK、X

BI、CK

が正解でした。

id:gong1971 No.2

回答回数451ベストアンサー獲得回数70

ポイント100pt
Sub Macro1()
    
    Sheets.Add After:=Sheets(ActiveSheet.Index)
    ResSht = ActiveSheet.Name
    ActiveSheet.Previous.Select
    
    j = 1
    For i = 1 To Range("A1").End(xlDown).Row
        If Cells(i, 1) <> "" Then
            KeyStr = Cells(i, 2).Value
            Set Rng = Range("A:A").Find(What:=KeyStr)
            If Rng Is Nothing Then
                KeyStr = Cells(i, 1).Value
                Rows(i).Cut
                Sheets(ResSht).Rows(j).Insert Shift:=xlDown
                j = j + 1
                Do
                    Set Rng = Range("A:A").Find(What:=KeyStr)
                    If Not Rng Is Nothing Then
                        Rows(Rng.Row).Cut
                        Sheets(ResSht).Rows(j).Insert Shift:=xlDown
                        j = j + 1
                    Else
                        Exit Do
                    End If
                Loop
                Do
                    Set Rng = Range("B:B").Find(What:=KeyStr)
                    If Not Rng Is Nothing Then
                        Rows(Rng.Row).Cut
                        Sheets(ResSht).Rows(j).Insert Shift:=xlDown
                        j = j + 1
                    Else
                        Exit Do
                    End If
                Loop
            End If
        End If
    Next
    
End Sub

※並べ替え時に元のデータを消してしまいます。
 必ずバックアップを取って実行してください。

1. 結果用のシートを挿入
2. B1の値がA列に無ければ結果用シートに移動
3. 2.で移動が行われた場合、A1の値がA列の別の行にあれば結果用シートに移動
4. 2.で移動が行われた場合、A1の値がB列にあれば結果用シートに移動
5. 2.~4.を2行目以降、最終行まで実行

こんな感じでいかがでしょうか?
処理が正しくない場合、コメント欄をご参照の上、詳細を教えてください。

id:gong1971

ちなみに上記マクロでの並べ替え結果は下記の通りです。

CK、D
CK、X
BI、CK
C、G
A、C
AF、AZ
AH、AF

2015/07/29 18:23:05
  • id:bnn
    >つまり、B列の値とA列の値を見て、同じになるものを、順に並べるのです。
    もう少し説明できないでしょうか。
  • id:gong1971
    かなり難しい気がしますが、いくつか不明な点を確認させてください。

    ■1.B列のデータは重複していませんか?

    A列にあるデータが、B列に存在する場合、個数は1個のみですか?
    質問文の例でいうと、「EJ、CK」というデータが存在する可能性はゼロですか?

    もし「EJ、CK」というデータが存在する場合、並べ替え結果はどうなりますか?


    ■2.ループではなく連続する可能性はありますか?

    質問文の例でいうと、下記のパターンはありますか?

    CK、D
    C、G
    AH、AF
    CK、X
    G、CK
    AF、AZ
    A、C
    ※「BI、CK」を「G、CK」に変えました


    ■3.上記1.と2.が混在し、分岐する可能性はありませんか?

    質問文の例でいうと、「G、CK」「AZ、CK」という2つのデータが
    存在する可能性はゼロですか?

    もし存在する場合、並べ替え結果はどうなりますか?


    ■4.並べ替え結果の先頭はどのように決まりますか?

    提示された並べ替え結果ですが、

    ◇パターン1
    C、G
    A、C
    CK、D
    CK、X
    BI、CK
    AF、AZ
    AH、AF

    ◇パターン2
    AF、AZ
    AH、AF
    C、G
    A、C
    CK、D
    CK、X
    BI、CK

    などでも正しい気がしますが、これらの結果でも問題ないですか?
    問題がある場合、どのような理由でしょうか?


    ■5.A列のデータに重複があった場合の並べ替え結果

    提示された並べ替え結果の最後3行について、

    ◇パターン1
    CK、D
    CK、X
    BI、CK

    ◇パターン2
    CK、X
    CK、D
    BI、CK

    どちらも正しい気がしますが、これらの結果でも問題ないですか?
    問題がある場合、どのような理由でしょうか?


    ※おそらくVBAを使わないと無理かと思います。
     過去の質問履歴を確認しましたが、VBAの基本的な設定などは大丈夫ですよね?

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

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

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

回答リクエストを送信したユーザーはいません