こんにちは、blueです。
前回はDictionaryオブジェクトの基本的な使い方について説明しました。
前回の記事はこちら
今回は「VBAのDictionaryオブジェクトの実践的な使い方とコード例」を紹介します。
✓この記事の内容
- Dictionaryオブジェクトの実践的な使い方3選
- Dictionaryオブジェクトのコード例
ちなみに今回の記事は和風スパゲティさん(@wafu_spaghetti)さんの以下の講座や関連記事を参考に作成しています。
非常にわかりやすく書いてくださっていて、私もそこで勉強したくらいなのでそちらを見ていただくだけで十分かと思います。ぜひご覧ください。
VBAのDictionaryについて
VBAにおけるDictionaryは、重複のない値をキーとして保存することができる、非常に便利なオブジェクトです。
次からDictionaryの実践的な使い方とコード例を3つ紹介します。
辞書として使用する
Dictionaryは、キーと値のペアを保存することができます。
キーは文字列型を中心に扱われ、値は任意のデータ型を保存することができます。
その為Dictionaryを利用することで、辞書としての機能を実現することができます。
例えば、以下の様な従業員コードと従業員名が書かれたテーブルについてDictionaryを使用することができます。
Sub 重複無しリストの登録()
Dim dic従業員リスト As New Dictionary
Dim ws As Worksheet
Dim tRow As Long
Set ws= ThisWorkbook.Worksheets("Sheet1")
tRow = 3
Do Until ws.Cells(tRow, 2) = ""
dic従業員リスト.Add ws.Cells(tRow, 2).Value, ws.Cells(tRow, 3).Value
tRow = tRow + 1
Loop
'0046の出力
Debug.Print dic従業員リスト("0046")
End Sub
この場合従業員コードがキーとなり、従業員名が値として保存されます。
マスターデータ(基本情報)に対してはこのようなデータ構造を作成することで、キーをもとにその値を素早く取得することができます。
重複のないリストを作成する
Dictionaryは、重複のないキーのみを保存することができます。
つまり、同じキーを持つ要素を複数持つことはできません。
この性質を利用することで、重複のないリストを作成することができます。
例えば以下の表に対して部門リストを出力するDictionaryを作成することができます。
Sub 重複無しリストの作成()
Dim dic部門リスト As New Dictionary
Dim ws As Worksheet
Dim tRow As Long
Set ws = ThisWorkbook.Worksheets("Sheet1")
tRow = 3
Do Until ws.Cells(tRow, 2) = ""
If dic部門リスト.Exists(ws.Cells(tRow, 4).Value) = False Then
dic部門リスト.Add ws.Cells(tRow, 4).Value, ""
End If
tRow = tRow + 1
Loop
'重複無しリストの出力
ws.Range("H3").Resize(dic部門リスト.Count) = WorksheetFunction.Transpose(dic部門リスト.Keys)
End Sub
以下のコードではExistsメソッドを使うことで重複の有無を判断し、重複していない場合のみを追加しています。
If dic部門リスト.Exists(ws.Cells(tRow, 4).Value) = False Then
dic部門リスト.Add ws.Cells(tRow, 4).Value, ""
End If
なお今回値は意味をなさないので””などにすればOKです。
このようなDictionaryを作成することで、重複のない商品名のリストを簡単に作成することができます。
キーをもとに集計をする
Dictionaryは、キーをもとに値を集計することができます。
例えば、顧客名とその購入金額を保存するDictionaryを作成する場合を考えます。
Sub データの集計()
Dim dic従業員コードリスト As New Dictionary
Dim dic従業員リスト As New Dictionary
Dim dic件数 As New Dictionary
Dim dic金額 As New Dictionary
Dim dic金額_件数 As New Dictionary
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim tRow As Long
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
Set ws2 = ThisWorkbook.Worksheets("Sheet2")
tRow = 3
Do Until ws1.Cells(tRow, 3).Value = ""
If dic従業員コードリスト.Exists(ws1.Cells(tRow, 3).Value) = False Then
'集計の際はまず代入する為の箱を作る必要がある 集計不要の場合は最初だけでいい
dic従業員コードリスト.Add ws1.Cells(tRow, 3).Value, ws1.Cells(tRow, 3).Value
dic従業員リスト.Add ws1.Cells(tRow, 3).Value, ws1.Cells(tRow, 4).Value
dic件数.Add ws1.Cells(tRow, 3).Value, 0
dic金額.Add ws1.Cells(tRow, 3).Value, 0
dic金額_件数.Add ws1.Cells(tRow, 3).Value, 0
End If
'件数と金額の集計
dic件数(ws1.Cells(tRow, 3).Value) = dic件数(ws1.Cells(tRow, 3).Value) + 1
dic金額(ws1.Cells(tRow, 3).Value) = dic金額(ws1.Cells(tRow, 3).Value) + ws1.Cells(tRow, 6)
'dicとdicの集計
dic金額_件数(ws1.Cells(tRow, 3).Value) = dic金額(ws1.Cells(tRow, 3).Value) / dic件数(ws1.Cells(tRow, 3).Value)
tRow = tRow + 1
'出力
With ws2
.Cells(3, 2).Resize(dic従業員コードリスト.Count).Value = WorksheetFunction.Transpose(dic従業員コードリスト.Items)
.Cells(3, 3).Resize(dic従業員リスト.Count).Value = WorksheetFunction.Transpose(dic従業員リスト.Items)
.Cells(3, 4).Resize(dic件数.Count).Value = WorksheetFunction.Transpose(dic件数.Items)
.Cells(3, 5).Resize(dic金額.Count).Value = WorksheetFunction.Transpose(dic金額.Items)
.Cells(3, 6).Resize(dic金額_件数.Count).Value = WorksheetFunction.Transpose(dic金額_件数.Items)
'並べ替え
.Range("B2").CurrentRegion.Offset(1, 0).Resize(.Range("B2").CurrentRegion.Rows.Count - 1).Sort (.Cells(3, 2))
End With
Loop
End Sub
この場合顧客名をキーとして、繰り返し処理を行うことで件数や合計を出すことができます。
以下のコードでは件数を出す場合は「1つ前の値に+1したものを代入」、合計の場合は「1つ前の値に今回の値を代入」しています。
'件数と金額の集計
dic件数(ws1.Cells(tRow, 3).Value) = dic件数(ws1.Cells(tRow, 3).Value) + 1
dic金額(ws1.Cells(tRow, 3).Value) = dic金額(ws1.Cells(tRow, 3).Value) + ws1.Cells(tRow, 6)
なお、集計用のDictionaryでは最初に登録する際の値には0を入れておいてください
'集計の際はまず代入する為の箱を作る必要がある 集計不要の場合は最初だけでいい
dic従業員コードリスト.Add ws1.Cells(tRow, 3).Value, ws1.Cells(tRow, 3).Value
dic従業員リスト.Add ws1.Cells(tRow, 3).Value, ws1.Cells(tRow, 4).Value
dic件数.Add ws1.Cells(tRow, 3).Value, 0
dic金額.Add ws1.Cells(tRow, 3).Value, 0
dic金額_件数.Add ws1.Cells(tRow, 3).Value, 0
このようなデータ構造を作成することで、従業員コードをキーにして、その顧客が何件分の受注をしたか、いくら売り上げたかを素早く集計することができます。
今回のまとめ
以上のように、Dictionaryはキーと値をペアで保存できることで、以下の様な3つの機能を実現することができます。
- 辞書として使用することができる
- 重複のないリストを作成することができる
- キーをもとに集計ができる
以下ではExcel VBAを扱った記事について解説しています。「こんなこともできるのか」という内容を揃えていますのでぜひ参考にしてください。
VBAに関連する記事はこちら
【Excel VBA】Outlook内の受信メールや送信済みメール一覧を取得し、Excelに出力する
[Excel VBA]FileSystemObjectとは?初めての方向けにもわかりやすく説明します!
【PowerPoint VBA入門】PowerPoint VBAまとめ記事!文字列取得方法をわかりやすく説明します!
【SeleniumBasic】まとめ記事 SeleniumBasicでのスクレイピングについてどこよりも詳しく解説します
【VBA-API】OpenAIのGPT-3を使ってブログ記事を作成する(ChatGPT API2023年導入予定)
【VBA】重複のない乱数を作成するマクロを4つ紹介します!
コメント