Dictionaryオブジェクトにアクセスするには、MS Scripting Libraryへの参照を設定する必要があります。
以下のコードは、年/月ごとに辞書エントリを作成します。各エントリには、名前の別の辞書が保持されます。子辞書のカウントは別個のカウントです。
Sub ListDistinctUserCount()
Dim vaValues As Variant
Dim dc As Scripting.Dictionary
Dim dcNames As Scripting.Dictionary
Dim i As Long
Dim sAllData As String
'read range into array
vaValues = Sheet1.Range("A2:D51").Value
Set dc = New Scripting.Dictionary
For i = LBound(vaValues, 1) To UBound(vaValues, 1)
'concat the year and month for dictionary key
sAllData = vaValues(i, 1) & "|" & vaValues(i, 2)
'if it's already added
If dc.Exists(sAllData) Then
'add the name if it doesn't exists
If Not dc.Item(sAllData).Exists(vaValues(i, 4)) Then
dc.Item(sAllData).Add vaValues(i, 4), vaValues(i, 4)
End If
Else
'otherwise add the year month and a new dict for the names
Set dcNames = New Scripting.Dictionary
dcNames.Add vaValues(i, 4), vaValues(i, 4)
dc.Add sAllData, dcNames
End If
Next i
For i = 0 To dc.Count - 1
Debug.Print dc.Keys(i), dc.Items(i).Count
Next i
End Sub
非常にエレガントではないが、私はより良い方法を考えることができませんでした。 VBA初心者のための
追加情報
A Variantデータ型は、他のデータ型を保持することができます。それは大きくて効率は低いが、場合によっては必要である。
マルチセル範囲のRange.Value
プロパティは、2次元の1ベースの配列を返します。その配列をバリアントに割り当てて、それをループすることができます。これは、個々のセルを読み取るよりもはるかに高速です。 Excelのグリッドへの読み書きは非常に遅いため、配列全体を読み込んでその方法でデータを操作するのが一般的です。
VBAには、データを格納するためのCollectionオブジェクトがあります。 Scripting.Dictionaryオブジェクトには、.Exists
プロパティのような優れた機能があり、すべてのキーまたはアイテムを配列として書き出す機能がいくつかあります。スクリプトライブラリは既定でOfficeと共にインストールされますが、既定では新しいプロジェクトには含まれません。あなたはツールに行く必要があります - 参照トンそれを含める。
辞書は、他の多くの言語で見られるように、キーアイテムリストです。アイテムは、ほぼすべてのデータ型にすることができます。この場合、アイテムは別の辞書です。
あなたは、ピボットテーブルを使用してみましたか? –
これにアクセスする方法は不明ですが、カウントするにはcountという名前を付ける必要があります。count(Distinct user_name)as usercount –
Excel 2010を使用していますが、Distinct Countオプションがあると思いますピボットテーブル。 – Mikeyjh