[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『A列ソート』(みわ)
教えてください
お手数おかけしますがよろしくお願いします
A列ソートかけたいのですが
下記のようだと
.Range("A1").CurrentRegion.Sort .Range("A1")
数字部分において
近畿10 近畿11 近畿12 近畿13 近畿1 近畿2 近畿3 近畿4 という結果になります
これを下記のように小さい順に並び替える方法はどうしたらいいのでしょうか
近畿1 近畿2 近畿3 近畿4 近畿5 近畿6 近畿7 近畿8 近畿9 近畿10 近畿11 近畿12 近畿13
.Range("A1").CurrentRegion.Sort .Range("A1")
< 使用 Excel:Excel2010、使用 OS:Windows10 >
お薦めは(1)。それができなければ(2)かな。
(3)は面倒だし、たぶん使いこなせない(私も含め)。
ちなみに、
>近畿10 近畿11 近畿12 近畿13 近畿1 近畿2 近畿3 近畿4 という結果になります。
は間違いでしょう。近畿1が最初に来ますよ。
誤記修正及び追記:
作業列を使って、文字列部分と数値部分に分離したうえで、
ソートする方法もあるでしょうね。
(γ) 2020/02/09(日) 17:11
無事解決しました
(みわ) 2020/02/09(日) 17:33
メモ的なものを追記しておきます。(上記の方式(3)について補足)
なんでも、このソートは、「自然順」(natural sort order) と呼ばれているらしい。(Wikipediaによる) https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E9%A0%86
<通常の辞書式順序> <自然順> 近畿1 近畿1 近畿10 近畿2 近畿11 近畿3 近畿12 近畿4 近畿13 近畿5 近畿2 近畿6 近畿3 近畿7 近畿4 近畿8 近畿5 近畿9 近畿6 近畿10 近畿7 近畿11 近畿8 近畿12 近畿9 近畿13
エクスプローラーのファイル名の順序なんかではこれが使われる。 これを実現するのが StrCmpLogicalWという API。
これを、VBAで、二次元配列に適用する例を参考までに。 なお、以下のソートアルゴリズムは、最も単純なもので、 バカソートと俗称される(石畑本p.147)もの。 (大量データや、速度重視の場合は使われないが、なにせ単純なので使われることも多い)
==以下、参考コード例 ================================================= Option Explicit Private Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" ( _ ByVal lpStr1 As String, _ ByVal lpStr2 As String) As Long
Sub test() Dim body As Range Dim v As Variant
'見出しを除いたデータ本体部分のセル範囲 Set body = Sheet3.[A2].Resize(13, 2) '簡単な例
v = body.Value
Call バカソート(v, 1) '1列目をソートキーとする
'ソート結果を元の範囲に上書き body.Value = v
End Sub
' 二次元配列を、キー列を指定して、ソートする(ソートアルゴリズムは一番簡単なもの) Sub バカソート(ByRef ary As Variant, ByVal keyPos As Long) Dim tmp Dim i As Long Dim j As Long Dim k As Long For i = LBound(ary, 1) To UBound(ary, 1) - 1 For j = i + 1 To UBound(ary, 1) If StrCmpLogicalW(StrConv(ary(i, keyPos), vbUnicode), _ StrConv(ary(j, keyPos), vbUnicode)) > 0 Then For k = LBound(ary, 2) To UBound(ary, 2) tmp = ary(i, k) ary(i, k) = ary(j, k) ary(j, k) = tmp Next End If Next j Next i End Sub
(γ) 2020/02/09(日) 22:16
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.