【入門編】ユーザー定義型(Type)の配列をソートする:クイックソートの実装と型安全性 – Excel VBA解析バイブル

スポンサーリンク

伝説のアーキテクトが教える「ユーザー定義型(UDT)配列」の極限ソート術

こんにちは。現場で「動けばいい」コードから脱却し、メンテナンス性とパフォーマンスを両立させたいと願うあなたへ。

Excel VBAで複雑なデータを扱うとき、`Cells(i, 1)` や `Cells(i, 2)` といったセル操作を繰り返していませんか?それは、CPUを酷使し、コードを読みづらくする「VBAの初心者が陥る罠」です。

今日は、複数の属性を持つデータをメモリ上で構造化し、クイックソートで爆速で並び替える「ユーザー定義型(UDT)」の極意を伝授します。ここをマスターすれば、あなたのマクロは「動く」から「美しい」へと進化します。

1. なぜ「ユーザー定義型(Type)」を使うのか?

例えば、「氏名」「年齢」「売上」という3つの属性を持つデータを扱うとしましょう。
これをバラバラの配列やセルで管理すると、並び替えのたびに全列を連動させる必要があり、コードは複雑怪奇になります。

ユーザー定義型は、これらをひとつの箱(レコード)として定義します。

‘ 標準モジュールの一番上に記述
Public Type EmployeeRecord
Name As String
Age As Integer
Sales As Long
End Type

この定義により、`EmployeeRecord` という新しいデータ型が誕生しました。これを使えば、データは「ひと塊」としてメモリに保持され、ソート時の交換コストも劇的に下がります。

2. 現場で使えるクイックソートの実装

配列の並び替えといえば「バブルソート」が有名ですが、データ量が増えると途端に重くなります。プロの現場では、再帰を用いたクイックソートを採用します。

以下のコードをそのままモジュールに貼り付けてみてください。

‘ ユーザー定義型配列をソートするクイックソート
Public Sub QuickSort(arr() As EmployeeRecord, ByVal Low As Long, ByVal High As Long)
Dim Pivot As Long, i As Long, j As Long
Dim Temp As EmployeeRecord

If Low >= High Then Exit Sub

Pivot = arr((Low + High) \ 2).Sales ‘ 売上を基準にソート
i = Low
j = High

Do
Do While arr(i).Sales > Pivot: i = i + 1: Loop ‘ 降順ソート
Do While arr(j).Sales < Pivot: j = j - 1: Loop If i <= j Then ' レコードごとの入れ替え(UDTは代入演算子で一括コピー可能) Temp = arr(i) arr(i) = arr(j) arr(j) = Temp i = i + 1: j = j - 1 End If Loop Until i > j

‘ 再帰的に分割してソート
If Low < j Then QuickSort arr, Low, j If i < High Then QuickSort arr, i, High End Sub

ここが極限のポイント:

  • UDTの一括代入: `Temp = arr(i)` と書くだけで、構造体の中身がまるごとコピーされます。VBAは内部でメモリコピーを最適化しているため、個別のメンバを代入するより圧倒的に高速です。
  • メモリの有効活用: 配列を値渡しではなく参照渡し(`arr()`)にすることで、巨大なデータでもメモリ消費を抑えています。

3. 初学者が陥りやすい3つの罠

コードを書いていてエラーが出る場合、以下のどれかに当てはまっていないか確認してください。

1. 「Typeはモジュールをまたげない」問題
`Private Type` を使うと、そのモジュール内でしか使えません。他のモジュールからも呼び出したい場合は、必ず `Public Type` を使い、標準モジュールに記述してください。
2. 配列の初期化忘れ
`Dim data() As EmployeeRecord` と宣言しただけでは中身は空です。必ず `ReDim data(1 to 100)` のようにサイズを確定させてから操作しましょう。
3. 型の不一致
ソート基準を `Name` (文字列) に変えるときは、比較演算子を工夫する必要があります。`If arr(i).Name > Pivot` と書けば、辞書順ソートも可能です。

4. まとめ:エンジニアとしての一歩先へ

今回紹介した「ユーザー定義型」と「クイックソート」の組み合わせは、VBAにおけるデータ処理の最強の布陣のひとつです。

  • データを整理する(Type)
  • メモリ上で処理する(配列)
  • アルゴリズムで最適化する(クイックソート)

このプロセスを意識するだけで、あなたのコードは「ただの自動化ツール」から「堅牢なソフトウェア」へと姿を変えます。

「VBAは遅い」と嘆く前に、まずはデータを型で定義し、メモリを使いこなす。この感覚さえ掴めれば、あなたはもう初心者ではありません。さあ、次はどんなデータ構造を構築してみますか?

ここをクリアしたあなたなら、どんな複雑な業務要件も、エレガントなコードで解決できるはずです。応援していますよ。

タイトルとURLをコピーしました