Excel VBA:シェルソートで配列をソートする|間隔の決め方

シェルソートを使い配列をソートするVBAのコードを掲載しています。



Homeに戻る > Excel プログラムのTipsへ

シェルソートとは、比較的低速だがコードはシンプルだと言われているソート方法です。

低速と言っても大量データでないかぎり差はありません。

シェルソートの方法は、比較するデータの間隔を決めソートを行い、しだいにその間隔を狭めていき最後に隣同士を比較します。

最初の間隔の決め方は下のExSortプロシージャを参照してください。

ここでは分かり易いように番号付きの文字列を配列にセットし、ソートを行います。

関連する記事として、Sortメソッドを使った「家計簿ソフトを作ってみよう Step 10 日付と費目でソートする」を掲載していますので参照してください。



Excel VBAでシェルソートを使い配列をソートするコードの解説

■ コマンドボタン1のクリックイベント

  1. インデックスが4の配列を宣言します。
  2. 配列に番号付きの文字列を格納します。
  3. Forループを使用し、ソート前の配列のデータをセルに表示します。
  4. 引数に配列をセットしExSortを呼び出します。
  5. Forループを使用し、ソート後の配列のデータをセルに表示します。

■ ExSortプロシージャ

  1. 配列の最小インデックスを間隔hにセットします。
  2. Forループで配列の最大インデックスまでループします。
  3. 間隔は、「h×3+1」で加算します。
  4. Doループでソートを実行します。
  5. 間隔hを3で割ります。
  6. Forループの開始値を間隔+配列の最小インデックス、終了値を配列の最大インデックスにしループします。
  7. Doループ配列データを比較します。
  8. 比較し配列データが小さければデータを交換します。
  9. これを繰り返し、間隔がインデックスの最小値になれば完了です。

シェルソートで使い配列をソートするコード

Option Explicit

'Excel VBAで配列のソート
Private Sub ExSort(sary() As String)
    Dim i As Long
    Dim j As Long
    Dim h As Long
    Dim temp As String

    '交換処理の間隔を決める
    h = LBound(sary())
    For i = 1 To UBound(sary()) - 1
         h = h * 3 + 1
    Next

    Do
        h = h / 3
        For i = h + LBound(sary()) To UBound(sary())
            temp = sary(i)
            j = i
            '交換
            Do While sary(j - h) > temp
                sary(j) = sary(j - h)
                j = j - h
                If j < h Then
                    Exit Do
                End If
            Loop
            sary(j) = temp
        Next
    Loop Until h = LBound(sary())

End Sub
 
Private Sub CommandButton1_Click()
    Dim jyuutaku(4) As String
    Dim i As Integer
    
    jyuutaku(0) = "3:床"
    jyuutaku(1) = "1:天井"
    jyuutaku(2) = "4:玄関"
    jyuutaku(3) = "2:窓"
    jyuutaku(4) = "5:水まわり"
    'ソート前の表示
    For i = 0 To UBound(jyuutaku)
        Cells(7 + i, 2) = jyuutaku(i)
    Next
        
    ExSort jyuutaku
    
    'ソート結果の表示
    For i = 0 To UBound(jyuutaku)
        Cells(7 + i, 4) = jyuutaku(i)
    Next
End Sub

実行結果のExcelシート

B列がソート前、D列がソート結果です。


Homeに戻る > Excel プログラムのTipsへ

■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します


Copyright (c) Excel-Excel ! All rights reserved