伝説のアーキテクトが教える「ユーザー定義型(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は遅い」と嘆く前に、まずはデータを型で定義し、メモリを使いこなす。この感覚さえ掴めれば、あなたはもう初心者ではありません。さあ、次はどんなデータ構造を構築してみますか?
ここをクリアしたあなたなら、どんな複雑な業務要件も、エレガントなコードで解決できるはずです。応援していますよ。
