プロが教えるわが家の防犯対策術!

1S101,1S102,~1S199,1S200,1T101,1T102~1T199,1T200,1B101,1B102~1B199,1B200,1C101,1C102~1C199,1C200というような番号がついているものがあります。
1S,1T,1B,1Cで始まるものがそれぞれ101から200まで100個あります(合計400個)。

番号はすべて5文字です。この番号をもとにいろいろな情報がついています。

番号を基にそのままソートすると、1B101,1B102~1B199,1B200,1C101,1C102~1C199,1C200,1S101,1S102,~1S199,1S200,1T101,1T102~1T199,1T200となってしまいます。ユーザー設定リストにB,C,S,Tと設定しましたが、結果は変わりませんでした。

VBAを用いてもいいので、先頭の2文字が1S→1T→1B→1Cとなり、残りの3文字の数字が昇順となるようにソートする方法はないでしょうか?

別の列に1~400までの連番を入れて、その連番を基にソートするしかないでしょうか?

A 回答 (3件)

No2です。



>やはり作業列を作るしかないようですね。
それが普通の方法だとは思いますけれど、「作業列」がかなり嫌そうな雰囲気なのでマクロで処理する例を以下に挙げておきます。

ご質問文ではセル位置などが不明なので、勝手に以下を仮定してあります。
(あくまでも例ですので。)
・1行目はタイトル行と仮定(ソート対象外とする)
・キーとなる「番号」は、A列に入力されているとする
・ソートは以下の順となるようにする
  ① 最初の2文字が(1S,1T,1B,1C)で始まる番号
  ② 上記以外の文字列
  ③ 空白文字列(=セルが空白の場合)
・ソートの対象範囲はA:D列の4列分とする

Sub Q13765542()
Dim n As Long, i As Long, j As Long
Dim s, str, v

str = Split("1S,1T,1B,1C,", ",")
n = Cells(Rows.Count, 1).End(xlUp).Row - 1
If n < 2 Then Exit Sub

v = Cells(2, 1).Resize(n).Value
For i = 1 To UBound(v)
s = Left(v(i, 1), 2)
For j = 0 To UBound(str)
If s = str(j) Then Exit For
Next j
If j = 4 Then j = 9
v(i, 1) = "A" & CStr(j) & Mid(v(i, 1), 3, 9)
Next i

Application.ScreenUpdating = False
Columns(1).Insert
Cells(2, 1).Resize(n).Value = v
Cells(2, 1).Resize(n, 5).Sort key1:=Cells(2, 1), Header:=xlNo
Columns(1).Delete
Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

返信遅くなり申し訳ありません。再度の回答ありがとうございました。

Splitを使って文字列を配列に入れると簡単になりますね。勉強になりました。おかげで希望通りソートできるようになりました。

お礼日時:2024/03/24 13:47

こんにちは



>ユーザー設定リストにB,C,S,Tと設定しましたが、
>結果は変わりませんでした。
順序をどのようにしたいのでしょう?
>先頭の2文字が1S→1T→1B→1Cとなり~
とあるので、そちらの順ではないのですか?
「B,C,S,T」はB,C,S,Tの順を意味します。
(=通常のアルファベット順ですので定義する意味がない)


ソートの機能を利用したいのなら、作業列を用いてソート用のキーを作成すれば良いでしょう。
一例として、作業列に =LEFT(元の番号,2) 等として最初の二文字を取り出しておきます。
この状態で、第一キーを作業列にし、ユーザ定義リストを使用
(もちろん、ユーザ定義リストは正しく設定しておきます)
第二キーは元の番号の列で昇順を指定すればご希望のようになります。
ソートが終わったら、作業列は削除しても良いですし、何度も利用するようであるのなら、あらかじめ式を入れておいて非表示列にしておいても宜しいかと。

作業列用の式を
 =VLOOKUP(MID(元の番号,2,1),{"B",3;"C",4;"S",1;"T",2},2,0)
などとして直接変換してしまえば、並べたい順にできるので、リストは不要になります。
あとは同様ですね。


>VBAを用いてもいいので、~~
単独で番号だけを並び替えるのなら、メモリ内で行っても良いですが、まとめて行の入れ替えを行いたいのだろうと想像しますので、その場合は、シートのソート機能を利用する方が便利でしょう。
ですので、手操作と同様に一時的なソート用のキー列を作成して、それでソートしてから削除するというような処理にしておくのが良いのではないでしょうか?
    • good
    • 0
この回答へのお礼

忙しい中、回答ありがとうございます。

「ユーザー設定リストにB,C,S,Tと設定しました」は「>ユーザー設定リストにS,T,B,Cと設定しました」の誤りです。すみません。

やはり作業列を作るしかないようですね。ありがとうございました。

お礼日時:2024/03/20 18:35

そもそも1S→1T→1B→1Cは順番じゃないので別の文字に置換してソート後、元に戻せばいいですよ。

    • good
    • 0
この回答へのお礼

忙しい中、回答ありがとうございます。

やはり配列にいったん入れて、replace関数で置換してソートして、もう一度、元に戻すように置換するのがいちばん速いし簡単でしょうか。

お礼日時:2024/03/20 16:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A