本記事は連想配列を使った重複内容を削除したデータ整理、カウントができる方法について解説を行っていきます。
Excelでデータを処理する際大量の重複データに困ったことありませんか?
重複内容がデータ対象に混じっていると分析の精度が落ち、通常よりも処理に時間が掛かるなどデメリットがどうしても生じてしまいがちです。
今回の方法を使う事で上記の問題を解消し、よりスマートなデータ整理が可能になります。
- 連想配列を使ったデータの重複削除ができる様になる。
- 重複データを削除する事でデータ整理・分析における手間を大幅に軽減し、作業の時間短縮・効率の向上へ繋がる。
また、関数で重複を削除しデータをカウントする方法について解説した記事もあります。興味のある方はこちらも参考にしてみて下さい!
サンプルの実行結果
本記事のサンプルを実行すると次の結果が得られます。
上記の表の内容を取り込み、重複を除いた形でデータの総数と各データを指定セルに表記します。
連想配列(Dictionary)
- 配列の添字(キー)を数字や文字列など好きに指定できる配列の一種。
- 各要素はキー(Key)とデータ(Item)のセットで登録でき、キーの重複はできない。
- メソッドを使う事でキーやデータの各一覧を配列の形で取得できる
- 連想リスト、辞書(Dictionary)とも呼ばれる
サンプルと各処理の解説
今回使用するExcel VBAのサンプルは以下の様になります。
Sub sample()
Dim Dict As Object
Dim keys As Variant
Dim i, j As Long 'ループ処理用の変数
Dim wData As String
Dim enRows As Long 'データ範囲の最終行取得
'①連想配列の設定と対象データの最終行を取得
Set Dict = CreateObject("Scripting.Dictionary") 'Dictを連想配列として設定
enRows = Cells(Rows.Count, 2).End(xlUp).Row 'B列の最終行を取得
'②連想配列に重複を除いたキーとデータを登録
For i = 4 To enRows 'セルB4から取得した最終行までをループ処理
wData = Cells(i, 2).Value 'セルの値を変数wDataに取り込み
If Not Dict.Exists(wData) Then '連想配列Dictに取り込んだセルの値が登録がされているか確認
Dict.Add wData, wData '登録が無ければ、セルの値を連想配列Dictにキー , データとして登録
End If
Next i
'③取得したデータの総数とデータを指定セルへ表記
Cells(4, 4) = Dict.Count '連想配列Dictのデータ総数(重複を削除したデータ数)を表記
keys = Dict.keys 'Dictのkey一覧を1次元配列にして取得
For j = LBound(keys) To UBound(keys) '1次元配列keysの添字の最小、最大の要素数を取得してループ
Cells(j + 4, 5) = keys(j) 'jは1次元配列keysの添字
Next j
Set Dict = Nothing
End Sub
この処理の流れは次の3ステップで実行されます。
- 連想配列の設定と対象データの最終行を取得
- 連想配列に重複を除いたキーとデータを登録
- 取得したデータの総数とデータを指定セルへ表記
連想配列の設定と対象データの最終行を取得
最初に連想配列の設定と対象データの最終行を取得していきます。
'①連想配列の設定と対象データの最終行を取得
Set Dict = CreateObject("Scripting.Dictionary") 'Dictを連想配列として設定
enRows = Cells(Rows.Count, 2).End(xlUp).Row 'B列の最終行を取得
ここで最終行を取得しておくことで、次項のデータ取得範囲を決めるのに役に立ちます。
連想配列に重複を除いたキーとデータを登録
開始セルB4から先程取得した最終行までの該当データが連想配列に登録が無い場合のみ登録していきます。
'②連想配列に重複を除いたキーとデータを登録
For i = 4 To enRows 'セルB4から取得した最終行までをループ処理
wData = Cells(i, 2).Value 'セルの値を変数wDataに取り込み
If Not Dict.Exists(wData) Then '連想配列Dictに取り込んだセルの値が登録がされているか確認
Dict.Add wData, wData '登録が無ければ、セルの値を連想配列Dictにキー , データとして登録
End If
Next i
次のメソッドを実行する事で連想配列(Dictionary)に対しての以下の処理が実行可能
- Dictionary.Exists(Key):連想配列の中に指定したキー(Key)が登録されているか確認
- Dictionary.Add Key , Item:連想配列にキー(Key)とデータ(Item)をセットで登録
ループ処理で該当範囲を指定する為に、最終行を取得していたんですね!
この形で記述する事で対象の数が変化しても毎回プログラムを書き換える必要が無く、柔軟に対応できます。
取得したデータの総数とデータを指定セルへ表記
連想配列より取得したデータの総数をセルD4、連想配列のkey一覧を1次元配列として取り込んでセルE4から順番に表記していきます。
'③取得したデータの総数とデータを指定セルへ表記
Cells(4, 4) = Dict.Count '連想配列Dictのデータ総数(重複を削除したデータ数)を表記
keys = Dict.keys 'Dictのkey一覧を1次元配列にして取得
For j = LBound(keys) To UBound(keys) '1次元配列keysの添字の最小、最大の要素数を取得してループ
Cells(j + 4, 5) = keys(j) 'jは1次元配列keysの添字
Next j
次のメソッドを実行する事で連想配列(Dictionary)に対しての以下の処理が実行可能
- Dictionary.Count:連想配列のデータ総数を返す
- Dictionary.keys:連想配列に登録されたキーの一覧を配列の形で返す
また、配列の添字の最小をLBound(配列)、最大をUBound(配列)でそれぞれ取得出来ます
この処理はローカルウィンドウで確認すると理解しやすいです。
ローカルウィンドウ?
簡単に言うと実行しているVBAの変数や配列の値を確認できるウィンドウでVBEのメニュー「表示」⇒「ローカルウィンドウ」で表示できます。
最初は何も表示が無い状態ですが、サンプルを「keys = Dict.keys」を実行した所でストップしローカルウィンドウを見ると次の様になります。
1次元配列Keysの添字やデータが見える!
中身を確認しながら進めていくとより理解が進み、コードのミスなども早期に発見しやすくなります。
終わりに
以上で今回の解説を終了します。
連想配列を使うことで数行でデータの重複削除ができ、特に大量のデータを整理やカウントする時に役立ちます。
面倒な作業はVBAに任せ、ストレスなくデータ分析を進められるよう積極的に活用していきましょう!
また本ブログでは今後もExcel VBAやExcelの知っていると便利な機能や使い方について情報発信していきますので、宜しければ参考にしてみて下さい。