[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『文字、数値の混在データのソート』(たまりん)
いつも大変お世話になっています
今回特殊なソートを行いたいのですがお知恵を拝借できないでしょうか
A列に
AAAA
AAA1
BB1C
AA1CC
BA3A
BBBC
とあったとします
普通に昇順をかけると
AA1CC
AAA1
AAAA
BA3A
BB1C
BBBC
となりますが
AAAA
AAA1
AA1CC
BA3A
BBBC
BB1C
という結果を出したいのです。
どのようにすればよいでしょうか。
間に数値が入る場合、普通に昇順をかけると文字列よりも数字が優先順位が上に来ています。
ここを文字列を上にそのあと数値としたいのです。
いい方法はないでしょうか。
前提条件として
1) 2文字目までは必ずアルファベット
2) 3文字目以降に数字が入ることがある
3) 文字は3文字以上上限なし
今回の例題は1列ですが、実際には複数列あり、
A列をキーにすべての行を連動させて並べ替えを行いたいのです。
宜しくお願いいたします。
< 使用 Excel:Office365、使用 OS:unknown >
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE( A2,"0","ア") ,"1","イ") ,"2","ウ") ,"3","エ") ,"4","オ") ,"5","カ") ,"6","キ") ,"7","ク") ,"8","ケ") ,"9","コ")
などという作業列を基準にして並べ替える。というのは... やっぱダメすかね? ^^;
(白茶) 2022/08/26(金) 16:47
(たまりん) 2022/08/26(金) 16:59
MicroSoft365なら、これだけでスピル出来そう。
B1セル =SORTBY(A1:A6,BYROW(A1:A6,LAMBDA(a,TEXTJOIN("",TRUE,LET(c,MID(a,SEQUENCE(1,LEN(a)),1),IF(ISNUMBER(c*1),CHAR(9505+c),c))))))
行 __A__ __B__ 1 AAAA AAAA 2 AAA1 AAA1 3 BB1C AA1CC 4 AA1CC BA3A 5 BA3A BBBC 6 BBBC BB1C
(半平太) 2022/08/26(金) 19:42
後正直恥ずかしながら、関数の内容が私には高度すぎて理解ができないです。
もしよろしければ、ご教授いただけないでしょうか。
宜しくお願いいたします。
(たまりん) 2022/08/29(月) 09:15
>高度すぎて理解ができないです。 数式の検証というのがあるのでそれを実行してみると分かりますよ。 (?) 2022/08/29(月) 09:26
> 1) 2文字目までは必ずアルファベット > 2) 3文字目以降に数字が入ることがある
「2文字目まで」と「3文字目以降」の作業列を
作って並べ替えてみてはどうでしょうか?
並べ替えは、B列を昇順、C列を降順。
=LEFT(A1,2) =REPLACE(A1,1,2,"") ↓ ↓ A列 B列 C列 AAAA AA AA AAA1 AA A1 AA1CC AA 1CC BA3A BA 3A BBBC BB BC BB1C BB 1C
(renka) 2022/08/29(月) 10:10
>ただ、使用可能バージョンが「16.0.14729.20260」となっていました >当方のバージョンは「16.0.13127.21490」となっています
これは有難い情報です。 MicroSoft365なのに、使える人と、使えない人がいるので戸惑っている所です。
新関数をふんだんに使ったので、どれが使えて、どれが使えないか教えていただけませんか? SORTBY、BYROW、LAMBDA、LET、SEQUENCE
例えば =s とすればSortbyとかSequenceとか候補が出て来るので、使える関数かどうか判定できます。
>関数の内容 方針だけですけど。。
Midで一文字ずつ分解する それに1を掛ける 文字はエラーになるので、そのまま使う エラーにならない数字には9505を加算する。 するとカタカナの文字コードになるので、 それをChar関数を使って、ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォに変換する 以上が完了したら、Textjoinを使って文字を再度結合する Sortbyを使って、再結合された文字順を基準に元データを並び変える
(半平太) 2022/08/29(月) 10:15
仮にB,C列が
KA AA
KA 1A
KA 2A
KA BB
KA CA
となった場合不具合が生じます
書き方が半端で申し訳ありませんでした
半平太さん
コメントありがとうございました
関数の使用可否ですが以下の通りでした
SORTBY OK
BYROW NO
LAMBDA NO
LET NO
SEQUENCE OK
でした
>関数の内容 解説頂きありがとうございました 当方で使えない関数の為実際の動きを見ての検証ができないので まだよく理解できていませんが やろうとしていることは理解できました ありがとうございました (たまりん) 2022/08/29(月) 11:38
> C列を降順、この方法だと
では、先頭に1文字追加して、
並べ替えは、B列を昇順、C列を昇順。
=LEFT(A1,2) =IF(CODE(MID(A1,3,1))>57,"a","Z")&REPLACE(A1,1,2,"") ↓ ↓ A列 B列 C列 KAAA KA aAA KABB KA aBB KACA KA aCA KA1A KA Z1A KA2A KA Z2A
ご希望の並びなのかは不明ですが。
(renka) 2022/08/29(月) 12:58
同じバージョンじゃないのでワークする分かりませんが、新関数を使わないで、 B列に基準となるデータを出してみますので、それを基準に並べ替えが出来るかトライしてみてください。
B1セル =TEXTJOIN("",TRUE,IFERROR(CHAR(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1)+9505),MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1))) 下にコピー
その後、B列を基準に並び替え(手動で)
<並替え後の図> 行 __A__ ___B___ 1 AAAA AAAA 2 AAA1 AAAア 3 AA1CC AAアCC 4 BA3A BAイA 5 BBBC BBBC 6 BB1C BBアC
(半平太) 2022/08/29(月) 14:57
9→j
に変換してソートした後
a→0
b→1
c→2
j→9
に戻すとできます。
(昔同じオーダーを受けたときの臨時策ですが)
(ん) 2022/08/30(火) 17:35
半平太さん
理想の形で処理ができそうです。
この方法を使わせていただきます。
ありがとうございました、感謝いたします。
renkaさん、んさん
コメントありがとうございます。
テキスト内に数字が複数入る場合や、テキスト数が3文字以上5文字6文字と増えていく可能性が今後出てくることから、
半平太さん案を採用させていただきました。
ご助言いただき、大変ありがとうございました。
(たまりん) 2022/09/08(木) 11:38
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.