事務職のためのExcelVBA入門講座 > 集計関係サンプルマクロ > 項目ごとに集計する Dictionaryオブジェクトでクロス集計

集計関係サンプルマクロ

項目ごとに集計する Dictionaryオブジェクトでクロス集計

データの集計には配列をよく使います。
配列は便利なのですが、欠点があります。
それは、配列にどんな値があるかがわからないところです。

どんな値が入っているかわからないと、項目ごとに値を集計したい!というときに
困ってしまいます。
そういう時は、Dictionaryオブジェクトを使うと簡単に集計できます。

Dictionaryオブジェクトとは?


VBAで連想配列を使うときに使います。
連想配列とは、インデックス(添字)のかわりに任意の名前(キー)を設定できる配列のことです。
連想配列

Dictionaryオブジェクトの操作


Dictionaryオブジェクトの操作は基本的に以下の3つです。

1.Dictionaryオブジェクトに値を格納する
  Dictionaryオブジェクトに対してAddメソッドを実行します。
  Dictionaryオブジェクト.Add キー名,値
  指定したキー名がない場合は、新たに追加します。

2.Dictionaryオブジェクトから値を取り出す
  Dictionaryオブジェクト(キー名)のValueプロパティを参照します。
  Dictionaryオブジェクト(キー名).Value

3.指定したキー名があるか調べる
  Dictionaryオブジェクトに対してExistsメソッドを実行します。
  指定したキー名がある場合はTrue、ない場合はFalseが返ります。
  Dictionaryオブジェクト.Exists(strKey)

Dictionaryオブジェクトでクロス集計


上のような単純な項目ごとの集計だったらDictionaryオブジェクトを使うより、
SUMIF関数で計算した方が速いですね。
そこで、サンプルではDictionaryオブジェクトを使ってクロス集計をしてみます。

Dictionaryオブジェクトを使うには、「Microsoft Scripting Runtime」への参照設定が必要です。
キー項目は1つしか値を入れられないため、「項目名,日付」をキー項目にして
書き出すときにSplit関数でカンマでデータを区切って、配列に格納しています。

サンプルコード



Sub Dictionaryオブジェクトでクロス集計()

Dim objDIC As New Dictionary
Dim strKey As String
Dim tmp As Variant
Dim N As Variant
Dim i As Long
Dim ii As Long

For i = 1 To 5
  For ii = 1 To 3
    strKey = "Test" & i & "," & Format$(DateSerial(Year(Date), Month(Date), ii), "yyyy/mm/dd")
    If objDIC.Exists(strKey) = False Then
      objDIC.Add strKey, i
    End If
  Next ii
Next i

With ThisWorkbook.Worksheets(1)
  For Each N In objDIC
    i = 2
    ii = 2
    tmp = Split(N, ",")
    '◆行番号取得
    Do Until .Cells(i, ii).Value = ""
      If .Cells(i, "A").Value = tmp(0) Then
        Exit Do
      End If
      i = i + 1
    Loop
    
    '◆列番号取得
    Do Until .Cells(i, ii).Value = ""
      If .Cells(1, ii).Value = CDate(tmp(1)) Then
        Exit Do
      End If
      ii = ii + 1
    Loop
    
    '◆記入
    .Cells(i, "A").Value = tmp(0)
    .Cells(1, ii).Value = tmp(1)
    .Cells(i, ii) = objDIC(N)
    
  Next N

End With

End Sub

<<VBAエキスパートの勉強方法 | 事務職のためのExcelVBA入門講座トップへ | 項目ごとに集計する 項目が複数ある場合のクロス集計>>

この記事へのコメント

コメントを書く

お名前
メールアドレス
URL
コメント
[必須入力]
認証コード
[必須入力]


※画像の中の文字を半角で入力してください。

トラックバック

この記事へのトラックバックURL

この記事へのトラックバック


Powered by Seesaa
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。