「アルゴリズム的な高速処理」として 頻度解析 や ランキング処理 を Excel VBA + 配列 + Dictionary で最適化する具体的なパターンを整理しました。これは大量データを扱うときに非常に強力です。
頻度解析(Frequency Analysis)
目的
- データ列の「値ごとの出現回数」を高速に集計
- ピボットテーブル不要で一瞬に結果を得られる
コード例
Sub FrequencyAnalysis()
Dim ws As Worksheet, arr As Variant, dict As Object
Dim i As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
arr = ws.Range("A1:A10000").Value ' データ列を一括読み込み
Set dict = CreateObject("Scripting.Dictionary")
' 頻度カウント
For i = 1 To UBound(arr, 1)
If dict.Exists(arr(i, 1)) Then
dict(arr(i, 1)) = dict(arr(i, 1)) + 1
Else
dict(arr(i, 1)) = 1
End If
Next
' 結果出力(値と頻度)
ws.Range("C1").Resize(dict.Count, 1).Value = Application.Transpose(dict.Keys)
ws.Range("D1").Resize(dict.Count, 1).Value = Application.Transpose(dict.Items)
End Sub
VB👉 ポイント
- 配列で走査 → Dictionaryでカウント
- 数万行でも一瞬で集計可能
ランキング処理(Ranking)
目的
- 頻度やスコアを基にランキングを作成
- ソートを組み合わせて順位付け
コード例
Sub RankingProcess()
Dim ws As Worksheet, arr As Variant, dict As Object
Dim i As Long, keys As Variant, items As Variant
Dim tmpArr() As Variant
Set ws = ThisWorkbook.Sheets("Sheet1")
arr = ws.Range("A1:A10000").Value ' データ列
Set dict = CreateObject("Scripting.Dictionary")
' 頻度カウント
For i = 1 To UBound(arr, 1)
If dict.Exists(arr(i, 1)) Then
dict(arr(i, 1)) = dict(arr(i, 1)) + 1
Else
dict(arr(i, 1)) = 1
End If
Next
' キーと値を配列化
keys = dict.Keys
items = dict.Items
ReDim tmpArr(1 To dict.Count, 1 To 2)
For i = 0 To dict.Count - 1
tmpArr(i + 1, 1) = keys(i)
tmpArr(i + 1, 2) = items(i)
Next
' 頻度でソート(降順)
Dim j As Long, k As Long, tmpKey As Variant, tmpVal As Variant
For j = 1 To UBound(tmpArr, 1) - 1
For k = j + 1 To UBound(tmpArr, 1)
If tmpArr(j, 2) < tmpArr(k, 2) Then
tmpKey = tmpArr(j, 1): tmpVal = tmpArr(j, 2)
tmpArr(j, 1) = tmpArr(k, 1): tmpArr(j, 2) = tmpArr(k, 2)
tmpArr(k, 1) = tmpKey: tmpArr(k, 2) = tmpVal
End If
Next k
Next j
' 結果出力(ランキング)
ws.Range("C1").Resize(UBound(tmpArr, 1), 2).Value = tmpArr
End Sub
VB👉 ポイント
- Dictionaryで頻度集計
- 配列に変換してソート
- 順位付きランキングを出力
応用アイデア
- 複数列をキーにする → 「社員ID+日付」で勤怠集計
- ランキング上位のみ抽出 → 上位10件だけ出力
- スコア計算 → 点数や売上を合計してランキング化
まとめ
- 頻度解析 → Dictionaryでカウント
- ランキング → 配列に変換してソート
- 高速化の鉄則 → 「配列で一括処理」「Dictionaryで検索・集計」「結果を配列で一括書き込み」
💡 次に深掘りするなら「ランキング上位だけ抽出(Top N)」や「複数条件でランキング(例: 売上と利益の複合スコア)」が面白いです。


