「excelvba 分かりやすい バブルソート」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気づきました。
並び替え・ソーティングを行うアルゴリズムの一つ、バブルソートの処理内容を理解しやすいExcelマクロ・VBA(Visual Basic for Applications)のコードを探している方による検索でしょうか。
1次元配列をバブルソートするサンプルマクロ
私は、以下のようなマクロが、バブルソートを理解しやすいと感じています。
Dim arr(1 To 4) As Long
Dim x1 As Long, x2 As Long
Dim tmp As Long
arr(1) = 100
arr(2) = 25
arr(3) = 75
arr(4) = 50
For x1 = LBound(arr) To UBound(arr) - 1
For x2 = x1 + 1 To UBound(arr)
If arr(x1) > arr(x2) Then
tmp = arr(x1)
arr(x1) = arr(x2)
arr(x2) = tmp
End If
Next x2
Next x1
End Sub
上記のマクロを実行すると、End Subの直前のStopステートメントでステップ実行モードになります。この状態でVBE(Visual Basic Editor)のメニュー[表示]-[ローカルウィンドウ]からローカルウィンドウを表示すると、配列変数・arrに格納されていた、
arr(1) = 100
arr(2) = 25
arr(3) = 75
arr(4) = 50
が、下図のように昇順で並び替えられていることを確認できます。
バブルソートのロジックが理解できないなら変数名を変えましょう
プログラミングに慣れた方の中には、For~Nextループで使うカウンター変数を無自覚に「i」「j」にする方がいらっしゃいますが、バブルソートのロジックを理解できないという方は、まず、この変数名をやめましょう。
アルファベットの「i」と「j」は形状が似ているために、理解しようとするときに混乱してしまいがちです。
子供の頃「シ」と「ツ」、「ソ」と「ン」の見分けがつけられるようになるために苦労したことを思い出しましょう。
ヒトは文字の形状を認識するために、想像以上に脳のパワーを使います。
バブルソートが理解できないという方は、ロジックを理解するために脳のパワーを使うべきで、その妨げになる脳の無駄使いはできるだけ避けましょう。変数名を自分のわかりやすいものにするのはその第一歩です。
私はこのロジックについては「x1」「x2」で見分けがつきやすいと感じるので、上記のマクロでは、
Dim x1 As Long, x2 As Long
としていますが、もしもあなたが「x1」「x2」でも混乱するようならば、例えば「前」「後」といった日本語の変数名を試してみる価値はあるはずです。
1次元配列のバブルソートを理解するためのサンプルマクロ
また、バブルソートについての解説をいきなり読むよりも、データが入れ替わっていく様子を、Excelのワークシート上に可視化すると、バブルソートを理解しやすくなるのではないかと思っています。
先のマクロを、そんな形に修正してみました。
Dim arr(1 To 4) As Long
Dim x1 As Long, x2 As Long
Dim tmp As Long
Dim n As Long
arr(1) = 100
arr(2) = 25
arr(3) = 75
arr(4) = 50
n = 1
Range(Cells(n, LBound(arr)), Cells(n, UBound(arr))).Value = arr
Stop
For x1 = LBound(arr) To UBound(arr) - 1
For x2 = x1 + 1 To UBound(arr)
Cells(n, x1).Interior.Color = RGB(0, 255, 0)
Cells(n, x2).Interior.Color = RGB(0, 0, 255)
Stop
If arr(x1) > arr(x2) Then
tmp = arr(x1)
arr(x1) = arr(x2)
arr(x2) = tmp
End If
n = n + 1
Range(Cells(n, LBound(arr)), Cells(n, UBound(arr))).Value = arr
Stop
Next x2
Next x1
基本のロジックは先ほどのマクロと同じですが、ワークシート上に配列のデータを出力したりセルに色をつけたりするコードを追加しています。(インデントを行っていない行が、Excelに配列のデータを出力したり、セルを色付けしたりするために追加したコードです。)
まず、配列にデータを代入した直後の、
n = 1
Range(Cells(n, LBound(arr)), Cells(n, UBound(arr))).Value = arr
Stop
で、アクティブシートの1行目に、スタート時点の配列のデータを書き出しています。
次に、2重ループに入った後の、
Cells(n, x1).Interior.Color = RGB(0, 255, 0)
Cells(n, x2).Interior.Color = RGB(0, 0, 255)
Stop
で、この直後のIf文で比較を行うデータのセルを目立つように色付けしています。
配列・arr(x1)のセルを緑色に、arr(x2)のセルを青色にしています。
そして、データの入れ替えを行った後の、
n = n + 1
Range(Cells(n, LBound(arr)), Cells(n, UBound(arr))).Value = arr
Stop
で、1回目の入れ替えを行った直後の配列のデータを、ワークシートの2行目に書き出しています。
1行目で色の付いているデータが、2行目では入れ替わっていることを確認できます。
勿論、データを入れ替える、
If arr(x1) > arr(x2) Then
tmp = arr(x1)
arr(x1) = arr(x2)
arr(x2) = tmp
End If
の処理が行われたからです。
内側のループが元に戻って、再度、
Cells(n, x1).Interior.Color = RGB(0, 255, 0)
Cells(n, x2).Interior.Color = RGB(0, 0, 255)
Stop
が実行され、この直後にIf文で比較を行うデータのセルが色付けされます。
あとは同じことの繰り返しです。
ワークシート上に出力されるデータ、緑色と青色のセルが表している比較するデータ、VBE上の実行される行を確認しながら上記のマクロを動かしてみると、バブルソートで行われている動きが見え、理解しやすくなるのではないでしょうか。
- Newer:1ケ月間のフォローアップが手厚かった
- Older:図形・オ-トシェイプのグループ化解除を行うWordマクロ
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列のバブルソートを理解するためのExcelマクロ