Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列のバブルソートを理解するためのExcelマクロ

配列のバブルソートを理解するためのExcelマクロ

対象:Excel2007, Excel2010, Excel2013

「excelvba 分かりやすい バブルソート」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気づきました。

並び替え・ソーティングを行うアルゴリズムの一つ、バブルソートの処理内容を理解しやすいExcelマクロ・VBA(Visual Basic for Applications)のコードを探している方による検索でしょうか。

[スポンサードリンク]

1次元配列をバブルソートするサンプルマクロ

私は、以下のようなマクロが、バブルソートを理解しやすいと感じています。

Sub 一次元配列をバブルソートする()

 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

Stop
End Sub

上記のマクロを実行すると、End Subの直前のStopステートメントでステップ実行モードになります。この状態でVBE(Visual Basic Editor)のメニュー[表示]-[ローカルウィンドウ]からローカルウィンドウを表示すると、配列変数・arrに格納されていた、
 arr(1) = 100
 arr(2) = 25
 arr(3) = 75
 arr(4) = 50
が、下図のように昇順で並び替えられていることを確認できます。

配列のバブルソートを理解するためのExcelマクロ

バブルソートのロジックが理解できないなら変数名を変えましょう

プログラミングに慣れた方の中には、For~Nextループで使うカウンター変数を無自覚に「i」「j」にする方がいらっしゃいますが、バブルソートのロジックを理解できないという方は、まず、この変数名をやめましょう。

アルファベットの「i」と「j」は形状が似ているために、理解しようとするときに混乱してしまいがちです。

子供の頃「シ」と「ツ」、「ソ」と「ン」の見分けがつけられるようになるために苦労したことを思い出しましょう。

ヒトは文字の形状を認識するために、想像以上に脳のパワーを使います。
バブルソートが理解できないという方は、ロジックを理解するために脳のパワーを使うべきで、その妨げになる脳の無駄使いはできるだけ避けましょう。変数名を自分のわかりやすいものにするのはその第一歩です。

私はこのロジックについては「x1」「x2」で見分けがつきやすいと感じるので、上記のマクロでは、
 Dim x1 As Long, x2 As Long
としていますが、もしもあなたが「x1」「x2」でも混乱するようならば、例えば「前」「後」といった日本語の変数名を試してみる価値はあるはずです。

1次元配列のバブルソートを理解するためのサンプルマクロ

また、バブルソートについての解説をいきなり読むよりも、データが入れ替わっていく様子を、Excelのワークシート上に可視化すると、バブルソートを理解しやすくなるのではないかと思っています。

先のマクロを、そんな形に修正してみました。

Sub 一次元配列のバブルソートを理解するためのサンプル()

 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

End Sub

基本のロジックは先ほどのマクロと同じですが、ワークシート上に配列のデータを出力したりセルに色をつけたりするコードを追加しています。(インデントを行っていない行が、Excelに配列のデータを出力したり、セルを色付けしたりするために追加したコードです。)

まず、配列にデータを代入した直後の、
 n = 1
 Range(Cells(n, LBound(arr)), Cells(n, UBound(arr))).Value = arr
 Stop
で、アクティブシートの1行目に、スタート時点の配列のデータを書き出しています。

配列のバブルソートを理解するためのExcelマクロ

次に、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)のセルを青色にしています。

配列のバブルソートを理解するためのExcelマクロ

そして、データの入れ替えを行った後の、
 n = n + 1
 Range(Cells(n, LBound(arr)), Cells(n, UBound(arr))).Value = arr
 Stop
で、1回目の入れ替えを行った直後の配列のデータを、ワークシートの2行目に書き出しています。

配列のバブルソートを理解するためのExcelマクロ

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文で比較を行うデータのセルが色付けされます。

配列のバブルソートを理解するためのExcelマクロ

あとは同じことの繰り返しです。

ワークシート上に出力されるデータ、緑色と青色のセルが表している比較するデータ、VBE上の実行される行を確認しながら上記のマクロを動かしてみると、バブルソートで行われている動きが見え、理解しやすくなるのではないでしょうか。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列のバブルソートを理解するためのExcelマクロ

「配列」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.