生成AI活用研究Geminiと100本ノック 17本目:重複削除(ユニーク化)の極意
Excel VBAにおける「重複削除」は、データクレンジングの現場において最も頻繁に遭遇するタスクの一つです。リストからユニークな値のみを抽出する作業は、手動で行えば一瞬ですが、数万行規模のデータや、動的に変化するデータセットを扱う場合、VBAでの自動化は必須のスキルとなります。本稿では、生成AI「Gemini」をパートナーとして活用し、従来の「RemoveDuplicatesメソッド」だけでなく、Dictionaryオブジェクトやコレクション、さらには配列処理を組み合わせた高度な重複排除ロジックを深掘りします。
詳細解説:なぜ単なるメソッド呼び出しでは不十分なのか
ExcelのRangeオブジェクトには「RemoveDuplicates」という非常に強力なメソッドが存在します。しかし、実務においてこのメソッドだけでは解決できない課題が多々あります。
1. 処理対象がメモリ上の配列である場合:シート上にデータを書き出さずに処理を完結させたいケースでは、メソッドは使えません。
2. 重複を削除するのではなく「ユニークなリストを作成」したい場合:元のデータを保持しつつ、別の場所に一覧を作成するロジックが必要です。
3. パフォーマンスの限界:数百万件のデータに対してRemoveDuplicatesを実行すると、Excelの再計算や再描画がボトルネックとなり、処理時間が肥大化します。
そこで登場するのが、VBAにおける「連想配列(Scripting.Dictionary)」の活用です。Dictionaryの「Key」は一意であるという特性を利用することで、驚異的な速度で重複排除を実現できます。また、最近の生成AIであるGeminiは、こうしたアルゴリズムの最適化において、非常に高いコーディング精度を誇ります。
サンプルコード:Dictionaryを用いた高速ユニーク化手法
以下のコードは、指定した範囲のデータをメモリに取り込み、Dictionaryを用いて高速に重複を排除し、その結果を別の列に出力する一例です。
Option Explicit
' メモリ上で高速に重複排除を行うプロシージャ
Sub ExtractUniqueValuesWithPerformance()
Dim ws As Worksheet
Dim inputData As Variant
Dim dict As Object
Dim i As Long
Dim resultArr As Variant
Set ws = ThisWorkbook.Sheets("Sheet1")
Set dict = CreateObject("Scripting.Dictionary")
' A列のデータを配列として取得(高速化の第一歩)
inputData = ws.Range("A1:A" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row).Value
' Dictionaryに格納(Keyが重複している場合は無視される)
For i = 1 To UBound(inputData, 1)
If Not IsEmpty(inputData(i, 1)) Then
If Not dict.Exists(inputData(i, 1)) Then
dict.Add inputData(i, 1), Nothing
End If
End If
Next i
' 結果を配列に書き戻す
ReDim resultArr(1 To dict.Count, 1 To 1)
Dim key As Variant
i = 1
For Each key In dict.keys
resultArr(i, 1) = key
i = i + 1
Next key
' 結果をB列に出力
ws.Range("B1").Resize(dict.Count, 1).Value = resultArr
Set dict = Nothing
End Sub
このコードのポイントは、セルへの直接アクセスを最小限に抑え、配列とメモリ内のDictionaryで演算を完結させている点です。Geminiに依頼する際は、「この処理を数万行のデータに対して実行したい」とプロンプトに加えることで、よりメモリ効率を意識したコードを提案させることが可能です。
実務アドバイス:Geminiを「コードのレビュアー」として使う
生成AIを活用したVBA開発で最も重要なのは、「AIが書いたコードを鵜呑みにしない」ことです。特にVBAの場合、古い情報や非効率なオブジェクト操作(SelectやActivateの使用など)が混入することがあります。
1. プロンプトの具体性:単に「重複を削除して」と頼むのではなく、「Scripting.Dictionaryを使用して、配列ベースで処理してください。エラーハンドリングも含めてください」と指示しましょう。
2. 段階的リファクタリング:まず動くコードを生成させ、次に「このコードをより高速にするにはどうすればよいか?」と問いかけ、コードの最適化プロセスをAIと共に行います。
3. セキュリティへの配慮:機密データが含まれるシート名をそのままAIに渡さないよう注意してください。データ構造(例:A列にID、B列に名前)だけを伝えてコードを生成させるのがプロの作法です。
また、重複排除の際に「大文字・小文字を区別するか」「全角・半角の違いをどう扱うか」といったビジネスルールは、AIには判断できません。これらはコード内の「CompareMode」設定(vbTextCompareなど)で制御する必要があることを忘れないでください。
技術的補足:RemoveDuplicatesメソッドの活用シーン
もちろん、Dictionaryが万能というわけではありません。数千行程度のデータで、かつ書式設定やテーブル構造を維持したまま重複を削除したい場合は、素直に「Range.RemoveDuplicates」を使うべきです。
' テーブル構造を維持したまま重複削除
Sub SimpleRemoveDuplicates()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
' A:C列を対象に、A列の値が重複している行を削除
ws.Range("A1:C100").RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
このメソッドの利点は、コードが非常に短く、保守性が高いことです。複雑なロジックを自作してバグを埋め込むリスクを考慮すれば、標準メソッドで十分な場合は標準機能を使うのが、ベテランエンジニアの「引き出し」です。
まとめ:AI時代におけるVBAスキルの再定義
生成AIであるGeminiは、VBAのコーディング作業を劇的に効率化しました。しかし、重複削除という単純なタスク一つを取っても、それが「メモリ上で完結すべきか」「シート上で実行すべきか」「大文字小文字をどう扱うか」といった判断は、依然として人間(エンジニア)の役割です。
1. データの規模を把握する(Dictionaryか、メソッドか)。
2. プロンプトで「配列処理」を明示し、実行速度を担保する。
3. AIが生成したコードを、実務のビジネスロジックに合わせて微調整する。
この3ステップを繰り返すことで、あなたのVBAスキルは単なる「記録係」から「アーキテクト」へと進化します。17本目のノックである重複削除は、一見地味ですが、データ分析の基盤を支える非常に重要な技術です。ぜひ、Geminiと対話しながら、あなた自身の「最強の重複削除関数」を作り上げてください。VBAの可能性は、AIとの共創によってまだまだ広がります。
