0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excel VBA 連想配列(Dictionary)を理解したい

Last updated at Posted at 2025-05-04

気づいたらAccessのデータベースが16万件を超えていた

AccessからテーブルをExcelに読み込んで、集計したり、テーブルの重複を判定していました。扱うデータの件数が10万件超えると For ~ Next のループだと処理速度が10分を超えてしまいます。
処理速度を上げるため、連想配列について調べました。

Sub test()
  
  Dim i As Long
  Dim dData As New Dictionary
  Dim data As Variant
  Dim shDB, shSUM As Worksheet
  
  Set shDB = ThisWorkbook.Sheets("データベース")
  Set shSUM = ThisWorkbook.Sheets("集計")
  
  data = shDB.Range("A1").CurrentRegion
  
  For i = 1 To UBound(data)
  
          If dData.Exists(data(i, 1)) Then
          dData(data(i, 1)) = dData(data(i, 1)) + data(i, 2)
          Else
          dData.Add data(i, 1), data(i, 2)
          End If
          
  Next i
  
  Dim keys As Variant
  keys = dData.keys
  
  For i = 1 To UBound(keys)
          shSUM.Cells(1 + i, "A").Value = keys(i)
          shSUM.Cells(1 + i, "B").Value = dData(keys(i))
  Next i
  
End Sub

実行すると、集計シートに名前ごとのスコアが集計された結果が表示されます。
集計シートのC列には、確認のためSUMIFが入力されています。
image.png

なぜこれで動くのかわからない、ウォッチウインドウで配列の中身を確認してみた

dDataにどのタイミングでデータがキーとデータが入るのかを確認するため、
For i = 1 To UBound(data) の行をブレークポイントにして、ウォッチウインドウを準備します。

image.png

image.png

ステップイン

data = shDB.Range("A1").CurrentRegion 実行直後
image.png

dDataはEmpty、dataにはデータベースシートのA列B列の値が格納されています。
image.png

If dData.Exists(data(i, 1)) Then
dData(data(i, 1)) = dData(data(i, 1)) + data(i, 2) 実行直後
image.png

dDataに異変が
image.png

さらに実行
image.png

dData.Add data(i, 1), data(i, 2) でひとつずつ格納されていることが理解できました。
image.png

言葉で説明されても理解できないので、自分で検証してみました。

参考文献
https://www.youtube.com/watch?v=HOTfZnBz_uI

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?