• 締切済み

Excelで英数字を昇順で並び替えたい

Excelで、A列に下記のようなデータが入力されています。 A10B10 A1B1 A1B5 A2B1 A10B1 A2B5 B1A5 A1B13 B1A10 B10A2 B4A3 B1A1 ・・・ これを、下記のように「記号順と記号の後ろの数字を昇順」にして並べ替えたいです。 A1B1 A1B5 A1B13 A2B1 A2B5 A10B1 A10B10 B1A1 B1A5 B1A10 B4A3 B10A2 単に昇順化するとA10B1などが先に来てしまい理想通りになりません。 隣の列にSUBSTITUTE関数などで英字を数字化させたり消して並び替えてもうまくいきません。 アドバイスをいただければと思います。

みんなの回答

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.9

[No.1] です. 条件の後出しは,あなたのデータ処理能力が疑われるだけですよ. あなたはデータ処理をする立場にあるのですから,そのデータの範囲を知っていることは最低条件です. > アルファベットはAとB、数字は1桁または2桁という前提です。 これが私があなたの例から読み取った条件です. あなたの追加条件は,Bに-がある場合もあるということですね. おそらくAにも-があるのではないかと推測します. ABだけでCはないのか? -の後ろは1桁だけなのか? アルファベットは1文字だけなのか? -以外の文字はないのか? 条件を提示してください.

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.8

No.3です まだ回答が付いていないようなので、試しにStrCmpLogicalWを使ったコードを組んでみました。 基準セルを変更すれば、元データの位置及びソート後のデータを出力する位置を変更できます(現在は同じ場所に上書きするようになっています)。 Option Explicit Private Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" ( _           ByVal lpStr1 As Long, _           ByVal lpStr2 As Long) As Long Sub test()  Dim i As Long, j As Long, cnt As Long, tmp As Variant  Dim SourceRange As Range  Dim SortCell As Range  Dim Ary() As String  '基準セルを設定  Set SourceRange = Cells(1, 1)  Set SortCell = Cells(1, 1)    '元データを取得  Set SourceRange = Range(SourceRange, SourceRange.End(xlDown))  cnt = SourceRange.Count  ReDim Ary(1 To cnt)  For i = 1 To cnt   Ary(i) = SourceRange(i)  Next i  'バブルソート  For i = 1 To cnt - 1   For j = i + 1 To cnt    If StrCmpLogicalW(StrPtr(Ary(j)), _         StrPtr(Ary(i))) < 0 Then     tmp = Ary(i)     Ary(i) = Ary(j)     Ary(j) = tmp    End If   Next  Next  '出力  SortCell.Resize(cnt, 1).Value = WorksheetFunction.Transpose(Ary) End Sub

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.7

A1からデータがあるとして B1に =CONCAT(IFERROR(TEXT(FILTERXML("<a><b>"&CONCAT(MID(A1,SEQUENCE(LEN(A1)),1)&IF(ISNUMBER(-MID(A1,SEQUENCE(LEN(A1)),1))*ISERR(-MID(A1,SEQUENCE(LEN(A1),,2),1))+ISERR(-MID(A1,SEQUENCE(LEN(A1)),1))*ISNUMBER(-MID(A1,SEQUENCE(LEN(A1),,2),1)),"</b><b>",""))&"</b></a>","//b"),"000"),"")) データ最終行までコピーして B列を基準にソート

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.6

B1: =LEFT(A1,1) C1: =MID(A1,2,5) D1: =LOOKUP(10^17,LEFT(C1,COLUMN($1:$1))*1) E1: =TEXT(D1,"00") F1: =SUBSTITUTE(A1,B1&D1,"") G1: =LEFT(F1,1) H1: =SUBSTITUTE(F1,G1,"")*1 I1: =TEXT(H1,"00") J1: =B1&E1&G1&I1 範囲 B1:J1 を下方にオートフィル⇒範囲 A:J 選択⇒J列をキーにして[昇順]に[並べ替え] 【お断り】過去に登場された回答者が考案された数式を無断借用しています。m(_._)m

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

#4です。 参考に読んでください。 VBAで、私製関数を作ってみました。 標準モジュールというところへ、下記をコピペ。 Function keymk(x As Range) s = "" n = 0 fstchr = "y" For i = 1 To Len(x) y = Mid(x, i, 1) If Asc(y) >= 48 And Asc(y) <= 57 Then '数字文字 n = n * 10 + Val(y) Else '文字列 If fstchr = "y" Then GoTo P1 s = s & Format(n, "00") fstchr = "y" n = 0 P1: fstchr = "n" s = s & y End If Next i s = s & Format(n, "00") keymk = s End Function ==== シートのA列に下記データを入れる。 B2に、式を =keymk(A2) と入れて、下方向に式を複写。 結果は下記。 A1:A14のセル範囲に A列   B列 原データ 変換後 A1B1 A01B01 A1B5 A01B05 A1B13 A01B13 A2B1 A02B01 A2B5 A02B05 A10B1 A10B01 A10B10 A10B10 B1A1 B01A01 B1A5 B01A05 B1A10 B01A10 B4A3 B04A03 B10A2 B10A02 C12A3 C12A03 色々な場合でエラーが出ないかテスト必要。 (注)数字部分は2桁以下に限る。 数字は半角に限る。 もっと簡単なVBAコードにならないかと思いつつ、力不測で・・。関数の難しい式の組み合わせと変わらない?

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

・全体的には文字列のデータです。>英数字を昇順、というのは本件に関しては内容を表してません。 ・文字の何番目かの1文字を左番目から比較していくのが、コンユーターの大小比較の根底にあります。 ・だから数字の部分は、現れる最大桁数を考慮して、修正ソートキーを作らなければならない。エクセルでは別列に作らざるを得ない。 (ただし、アルファベット(本件ではAやB)などの出現位置は、各データで一定で、連なりの文字数の長さも一定でないとこういう議論はできません。) ・修正ソートキーを、1列に作る方法と、本件では4列を使う方法があります。 ・1列に修正ソートキーを作るなら、(最大2桁しか数字が表れないとして)、1桁数字は、01のように変換しなければなりません。 ーー ・文字列の数字部分と文字部分の分離は、結構、関数で出すのは、技巧的な方法しかなく、初心者は何日考えても思いつかないものです。 「数字と文字を分ける エクセル」でGoogle照会せよ。 ・だからVBAででもやって、関数化し、まる写ししなければしようがないだろう。 ・入力の段階から、1は01と入力するよう、設計して、入力者に徹底すべきなんだ。データベース設計の、コード設計などは似たことを考えるもの。 とりあえず、考え方のみ。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.3

VBAとAPIが使用できるなら、エクスプローラー順に並べ替えるという方法もあります。 参考URL:https://blog.goo.ne.jp/end-u/e/cdd7ec993d294636981b90cd407a2f97 ファイル名に上記の記号を入れて試してみましたが、エクスプローラではご希望通りの順番に並んでいました。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.2

>隣の列にSUBSTITUTE関数などで英字を数字化させたり消して並び替えてもうまくいきません。 英字より数字の桁合わせをする方が良いでしょう。 先頭の英字に続く数字が1桁のとき英字の次に"0"を付加して2桁数字に合わせ、中間の英字の右側も同様に2桁に合わせてすべての文字列を6桁に合わせる必要があります。 中間の英字の位置をC列へ抽出すると並べ替え用のデータをB列へ設定し易くなります。 C1=MIN(INDEX(FIND({"A";"B"},A1&"AB",2),0)) B1=LEFT(A1,1)&TEXT(MID(A1,2,C1-2),"00")&MID(A1,C1,1)&TEXT(MID(A1,C1+1,2),"00") C1とB1を下へ必要数コピーしてBを基準に並べ替えをしてください。

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.1

アルファベットはAとB、数字は1桁または2桁という前提です。 以下の数式を各セルに入力 入力した数式を下までコピー F列とG列で昇順に並べる セルB1 =FIND("A",A1) セルC1 =FIND("B",A1) セルD1 =IF(B1<C1,LEFT(A1,C1-1),LEFT(A1,B1-1)) セルE1 =IF(B1<C1,MID(A1,C1,3),MID(A1,B1,3)) セルF1 =LEFT(D1,1) & RIGHT("0" & MID(D1,2,2),2) セルG1 =LEFT(E1,1) & RIGHT("0" & MID(E1,2,2),2)

oldold_d
質問者

補足

かなり理想的な動きをしてくれました。ご回答ありがとうございます。 数字が2桁のデータでは問題なく機能しました。 ただ、こちらの想定外だったこととして、ハイフン交じりの3桁・4桁のデータが存在したため、対応に難儀しています。 例:A2B5-2、A10B10-1等

関連するQ&A

  • EXCELで昇順

    EXCELでナンバー(A1列)と枚数(B2列)を連動しながら昇順する方法がどうしてもうまくいきません。 枚数の少ないものからA1を連動させて並べ変えたいのです できたら、同じ枚数の中でも0のNo.のものも昇順で並べ替えたい のです。gooの中でも色々とあったのですが、やり方が間違って いるのかうまく出来ません。 言葉足りずにわかりにくいとは思いますがよろしくお願いいたします。  A1列    B2列 No.      枚数  350000 |  200 011111 |  200 400000 |  100    200001 |   50 010000 |  200

  • エクセルの関数についての質問です。

    エクセルの関数についての質問です。 画像のように横に1、2、3…(100くらいまで続きます)縦にA、B、Cの行があります(端が切れちゃってますが、A2にA、A3にB、A4にCです) B2から横の列にはそれぞれ☆や○等いろいろな記号が入ります。 そしてこの記号には特定の値が決められています。☆=10、○=5、△=3 B3から横には、B2の記号にそった数字が入ります。(10やら5等) そこまではIF関数で式を作ったのですが、ここからが問題でして… B2から横に1から100まで、記号(B3から横に数字)を入力していった時のB3列の合計が仮に212とします。 合計した値が200を越えてしまった場合、B4からの列に数字を入力するようにしたいのです。 (200ギリギリ前くらいまではB3の列で、それを越える時からB4の列に入力します。その際、B3列に入る数字は消えます) なおかつ可能であれば、このB4からの列に入るのはランダムにできるといいのですが…(画像では○の数字を下ろしていますが、☆の数字をおろしても良いし、△の数字をおろしても良い) ●計算式によって入力された数字(B3列)を特定の数字を越えた場合、別の枠(B4列)に移す関数はありますでしょうか?? ●また、それをランダム(関数)で選ぶことは可能でしょうか?? よろしくお願いします。

  • 昇順に並べ替え

    セルA1に50.1、セルB1にB、セルA2に49.9、セルB2にAと入力されています。 A列は、小数点第一位を四捨五入するので両方とも50と表示されています。 A列が同じ(この場合は50)時は、B列は昇順に並べたいです。 VBAで並び替えすると、数字は50.1と49.9なので1行目と2行目が入れ替わりません。 セルに表示されている数字での並び替えはどうしたら良いのでしょうか?

  • Excel 関数で上から順に数字を整列させる

    Excelで、下記表(例)に入力された数字を上から順に関数を用いて隣のB列に整列させたいです。 ・例 A1:A60の表があります。 ※以下A列に入力された数字とします 1 空白 2 20 3 空白 4 15 5 25 ・(省略、この間空白と考えて下さい) ・ ・ 59 10 60 空白 上記表(例)は、A2に20,A4に15,A5に25,A59に10それ以外は空白を表します。 上記表のセル内数字は全て手入力とします。 全てのセルが空白の場合もあります。 B列はB1:B5の5行です。 この入力された数字を関数を用いて、B列に上から順にB1に20,B2に15,B3に25,B4に10,B5は空白となるように整列させたいです。 B列セル結果は他シートに参照されますのでセルはロックを掛けています。 上記のことからデータの並べ替えも使えませんし昇降順でもありません。 上から順に整列させた数字を、B1:B5の5行内で上位5まで表示させます。 A列の行数が多いのでif関数も使えません。 なお、上記質問内に不明な点がありましたら補足させて頂きます。 以上、宜しくお願いします。

  • EXCEL セルの文字列の文字種の判別

    エクセルでセルの文字列が下記のいずれかを判断するにはどうすればよいでしょうか? セルの文字列は英字数字記号が前提で、漢字かな等は入っていません。 ・数字のみ ・英字のみ ・記号のみ ・英字と数字 ・英字と記号 ・数字と記号 ・英字と数字と記号

  • エクセル【昇順・降順で並べ替え】について

    エクセル【昇順・降順で並べ替え】について 下記のようにエクセル表に入力したものを23日→4日に並べ替えをしたいのです。 昇順をしてみたら、番号が狂ってしまいます。 日付け順に狂いなく並べ替えができる方法を教えてください。 どうぞ宜しくお願いします。 日付け 番号 ランク 1月4日 101 A 1月5日 102 C 1月9日 103 B 1月9日 104 A 1月19日 105 C 1月23日 106 A 1月23日 107 C 1月23日 108 C

  • セルの数字を昇順に並び替えて重複削除する方法

    いつも大変お世話になっております。 どなたかご存じの方がお見えでしたら回答頂けると幸いです。 【質問】  添付図のとおり、2列×20行の数字が【入力値2列】欄に入っています。  この数字を昇順に並び替えて重複数字を削除したものを【重複チェック済2列】に  出力します。また、【入力値2列】欄の数字を【入力値1列】に縦1列にして数字 を昇順に並び替えて重複数字を削除したものを【重複チェック済1列】に出力しま す。具体的には下記(1)~(4)の手順です。質問は2列×20行での場合ですが、  2列×200行の場合でも上記のことができるようにしたいです。    *********************************** (1)入力値2列(A列・B列)に2つの値をセットします。 (2)入力値2列(A列・B列)の値を重複チェック済2列(D列・E列)に並べて昇順に並び替えて重複数字を削除します。 (3)入力値2列(A列・B列)の値を入力値1列(G列)に1列にセットします。 (4)入力値1列(G列)の値を重複チェック済1列(I列)に並べて昇順に並び替えて重複数字を削除します。 以上、よろしくお願いします。

  • エクセルの「昇順」での並べ替えについて質問いたします。

    エクセルの「昇順」での並べ替えについて質問いたします。 (例) 行に左からセルに現場、名前、成績(数字)、地域(東京等)が入力されていて、各々列をなしているシートがあります。地域を昇順にし、その内訳の中で現場を昇順 さらにその内で名前を昇順にしたいのですがフィルターの簡単な操作でできますか。 エクセルの初心者ですがフィルターには列の左右関係、文字と数字の優劣などがあるのでしょうか。フィルターについてご存知の方教えて下さい。

  • エクセルの昇順降順について

    質問させて下さい。 セル内に111,112,113と順に入力していって、 途中112Aと入力するとします。 このセル全体を昇順・降順すると111から始まる数字群は順になるのですが 112Aは別ものとして扱われ一番上か下に表示されてしまいます。 これを112と113の間に表示させる方法はないものでしょうか? どなたかご存じの方、詳しい方おられましたら教えて頂けますようお願いします。

  • エクセル イレギュラーなSUM関数

    会社で使うエクセル表を作っていますが困っています。 A列B列があり A5にはA1~A4の合計のSUM関数が入っています。 B5にもSUM関数を入れたいのですが B1~B4はイレギュラーな事があった場合のみ数字を入力し B5にはB1~B4に入力された数字の合計と B列に何も入力されていない隣のA列の合計を表示させたいのです。 例えるなら A1~A4に3を入力 A5はSUM関数がはいっているので12が表示されているとして B列はB1~B3は未入力 B4に7が入力された場合 B5にはA1~A3とB4の合計の16が表示されるようにしたいのです。 B4に7を入力したので隣のA4の3は合計しないという事です。 どうぞ宜しくお願い致します。

専門家に質問してみよう