読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

【ネタ】手作りソート

何やら「A1:A10に入力された数値データを昇順に並び変えてB1:B10に格納せよ」という学校の課題的なお題を頂いたので作ってみました。
もちろんソート機能は使用禁止です。
(つまり実務で使う意味は皆無のネタコードです)

Option Explicit

'ソート範囲
Const SORT_RANGE As String = "A1:A10"
Const RESULT_RANGE As String = "B1:B10"

'ソート個数
Const SORT_COUNT As Long = 10

'難しいことを考えるのは面倒なので、
'一番小さい数字を見つけたら一番上に入れて、
'残りの数字からさらに一番小さい数字を見つけたら…を繰り返すソートにします。
Public Sub Main()

    'ワークシートを定義
    Dim wsSheet As Worksheet
    Set wsSheet = ThisWorkbook.Sheets("Sheet1")

    'ソート範囲内の数字を配列にぶちこむ
    'この方法だと1列しかなくても二次元配列になる。
    '※(1,1)~(10,1)
    Dim lNumList As Variant
    lNumList = wsSheet.Range(SORT_RANGE)
    
    '一番小さい数字を見つけて並べ替えるのを繰り返す
    Dim i As Long
    Dim j As Long
    Dim lTmpNum As Long
    Dim lTmpAdd As Long
    For i = 1 To SORT_COUNT - 1
        '一番小さい数字を探す
        lTmpNum = lNumList(i, 1)    '仮数字に先頭の数字をセット
        lTmpAdd = i             '仮数字の座標をセット
        For j = i + 1 To SORT_COUNT
            If lNumList(j, 1) < lTmpNum Then
                '仮数字よりも小さいものを見つけたらそっちを仮数字に
                lTmpNum = lNumList(j, 1)
                '元の一番小さい数字と新しい一番小さい数字を入れ替える
                lNumList(j, 1) = lNumList(lTmpAdd, 1)
                lNumList(lTmpAdd, 1) = lTmpNum
            End If
        Next
        'この時点でlTmpNumに入っているものが一番小さい
        'それ以外でまた並べ替える
    Next
    
    ' 結果をワークシートに書き込む
    wsSheet.Range(RESULT_RANGE) = lNumList

End Sub