作りながら学ぶVBAプログラミング

並び替え(ソート) 、よく使うサブルーチンライブラリ

Sortsub.bas
データの並び替え(ソート)は、案外使う場面が多いわけですが、設定が案外面倒で頭の中に入らない。

基本は、シート状の並び替えですが、シートとは、関係なく配列の並び替えも案外出てきます。

そこで並び替えのサブルーチンを作りました。


配列の並び替え

並び替えのサブルーチンで問題になるのが、配列の数です。

できれば、配列に入っているデータの数まで指定したくない。単に面倒というだけですが。

その場合、動的な配列を使用します。

動的な配列を使用する場合、配列の数を求める必要が出てきます。

その場合は、On Error を積極的に活用するのが一つの方法です。


配列の数を求める DimSub.bas

配列の数を求めるサブルーチン DimSub は、処理速度がかかってしまうのは仕方ない。

配列にデータをいれているところで数えればいいわけで、わざわざ数えさせるなって話です。

でも、可搬性や修正頻度を考慮しないといけないプログラムの場合、いちいち配列の定数を書き直したりするのは面倒ですし、バグのもとになりやすくなります。

配列の数を数えるサブルーチンのソースプログラム

Function Max(dimbox())
'dim dimBox(120),dim dimCnt,dimMax
'
"Dim Max
'dimMax = DimSub.Max(DelMarkWord_Val)
'
"Dim Clear
'dimCnt = DimSub.Clr(DelMarkWord_Val, "")
'
Dim i
Dim errflg
Dim keepi
i = 0
keepi = i
Max = keepi
errflg = 0
Do While (1)
DoEvents
On Error GoTo rsm
dimbox(i) = dimbox(i)
On Error GoTo 0
If errflg = 1 Then
Max = keepi
Exit Do
End If
keepi = i
i = i + 1
Loop
Exit Function
rsm:
errflg = 1
Resume Next
End Function


エラーが出るまでループを回してしまうという実に非効率な方法です。

ついでに配列のクリアもサブルーチン化しておきます。


配列をクリアするサブルーチン


配列をクリアするサブルーチンのソースプログラム
Function Clr(dimbox(), inival)
'dim dimBox(120),dim dimCnt,dimMax
'
"Dim Max
'dimMax = DimSub.Max(DelMarkWord_Val)
'
"Dim Clear
'dimCnt = DimSub.clr(DelMarkWord_Val, "")
'
Dim cntval, maxval
maxval = Max(dimbox)
For cntval = 0 To maxval
dimbox(cntval) = inival
Next cntval
Clr = 0
End Function



シートを並び替えるサブルーチン SortSub.bas

単一キーソート (データ行の継続が key cell の場合)

書式 Sub Easy(ssht, kc, asmdsm, sr, sc, ec) ‘ssht:ソート対象シート
‘kc:連続検査カラム
‘asmdsm:ソート方向 asm / dsm
‘sr:ソート開始行
‘sc:ソート開始カラム
‘ec:ソート終了カラム

呼出し引数からわかるように、このサブルーチンは、ソートの最終行を指定しません。
つまり、サブルーチン内で算出してソートを行うようにしてあります。

このサブルーチンは、Key1Easy の名前の付け替えサブルーチンです。

使用例、
Call SortSub.Easy(ssht,1,"asm",1,1,20)



単一キーソート (データ行の継続が key cell の場合)

書式 Sub Key1Easy(ssht, kc, asmdsm, sr, sc, ec) ‘ssht:ソート対象シート
‘kc:連続検査カラム
‘asmdsm:ソート方向 asm / dsm
‘sr:ソート開始行
‘sc:ソート開始カラム
‘ec:ソート終了カラム

使用例、
call sortsub.Key1Easy(ssht,1,"dsm",1,1,20)




複数キーソート (データ行の継続が key cell の場合)

書式 Sub KeysEasy(ssht, kp, kx, kc() As Integer, asmdsm() As String, sr, sc, ec) ‘ssht:ソート対象シート
‘kp:連続検査カラム
‘kx:キーの数
‘kc():キーカラム配列
‘asmdsm:ソート方向 asm:昇順 dsm:降順
‘sr:ソート開始行
‘sc:ソート開始カラム
‘ec:ソート終了カラム

使用例、
'— 検索、ライバル、サイト数ソート —
Dim keys(3) As Integer 'ソートキーセル番号
Dim asmdsm(3) As String 'ソート方向
Dim keycnt 'キー数
Dim ssht 'ソート対象シート
dim kp 'データの連続検査カラム
Dim sr, sc, er, ec 'ソート対象セル範囲
Dim rr 'ソート範囲検査行用ワーク
Set ssht = ActiveSheet
'————–
'— SORT KEY
'————–
keycnt = 0
'— 検索数
keys(keycnt) = 4: asmdsm(keycnt) = "dsm": keycnt = keycnt + 1
'— ライバル数
keys(keycnt) = 18: asmdsm(keycnt) = "asm": keycnt = keycnt + 1
'— サイト数
keys(keycnt) = 3: asmdsm(keycnt) = "asm": keycnt = keycnt + 1
'————–
'— SORT RANGE
'————–
kp = 2 'continue check cpu,m
sr = 4
sc = 1
ec = 30
'————–
'— SORT
'————–
Call SortSub.keysEasy(ssht, kp,keycnt, keys(), asmdsm(), sr, sc, ec)
'————–



複数キーソート (データ行の継続が key cell ではない場合)

書式 Sub keys(ssht, kx, kc() As Integer, asmdsm() As String, sr, sc, er, ec) ‘ssht:ソート対象シート
‘kp:連続検査カラム
‘kx:キーの数
‘kc():キーカラム配列
‘asmdsm:ソート方向 asm:昇順 dsm:降順
‘sr:ソート開始行
‘sc:ソート開始カラム
‘er:ソート終了行
‘ec:ソート終了カラム

使用例、
'— 検索、ライバル、サイト数ソート —
Dim keys(3) As Integer 'ソートキーセル番号
Dim asmdsm(3) As String 'ソート方向
Dim keycnt 'キー数
Dim ssht 'ソート対象シート
Dim sr, sc, er, ec 'ソート対象セル範囲
Dim rr 'ソート範囲検査行用ワーク
Dim cc_pos 'データ継続検査セル
Set ssht = ActiveSheet
'————–
'— SORT KEY
'————–
keycnt = 0
'— 検索数
keys(keycnt) = 4: asmdsm(keycnt) = "dsm": keycnt = keycnt + 1
'— ライバル数
keys(keycnt) = 18: asmdsm(keycnt) = "asm": keycnt = keycnt + 1
'— サイト数
keys(keycnt) = 3: asmdsm(keycnt) = "asm": keycnt = keycnt + 1
'————–
'— SORT RANGE
'————–
sr = 4
sc = 1
er = sr
ec = 30
cc_pos = 2
'
rr = sr
Do While ssht.Cells(rr, cc_pos) <> ""
er = rr
rr = rr + 1
Loop
'————–
'— SORT
'————–
Call SortSub.keys(ssht, keycnt, keys(), asmdsm(), sr, sc, er, ec)
'————–



シートのデータの並び替え SortSub.bas ダウンロード





  • このエントリーをはてなブックマークに追加

関連記事

ゆずまる・ゆぅべぇ

システムエンジニア/プログラマ歴数十年のゆずまるです。

バナーにもあるように変体的な犬マニアで生まれてからこのかた犬のいない日は経験していません。
中でもコッカースパニエルとラブラドールが死ぬほど好き!

そんなゆずまるは、20数種類の様々な言語を使用してシステム開発をおこなってきました。

そこで使ってきた各言語の自作ライブラリ中のVBAのライブラリを公開しています。

※姉妹サイトに C,PHP などのサイトもネット上に浮遊させております。そちらでもお役にたてましたら無上の喜びw

あなたの一助になれば幸いです。