Sub ディクショナリ()
Dim dic As Scripting.Dictionary
Set dic = CreateObject("Scripting.Dictionary")
Dim MR As Long
Dim i As Long
Dim KEY As String
Dim NAM As String
MR = Sheets("基礎データ").Range("A" & Rows.Count).Row
For i = 2 To MR
KEY = Sheets("基礎データ").Range("A" & i).Value
NAM = Sheets("基礎データ").Range("B" & i).Value
If dic.Exists(KEY) Then
dic.Item(KEY) = dic.Item(KEY) + 1
Else
dic.Add (KEY), (NAM)
End If
Next
Dim VKEYS As Variant
VKEYS = dic.Keys
For i = LBound(VKEYS) To UBound(VKEYS)
Sheets("出力").Range("A1").Offset(i).Value = VKEYS(i)
Sheets("出力").Range("B1").Offset(i).Value = VKEYS(i)
Next
End Sub
2019/02/10 08:05
小川慶一さんのコメント
(コメントID: 6002)
牧野千秋さん:
「1つめ」について:
> 当然小文字で入力しても大文字にならない
ダブルクオートでくくった範囲は文字列だからです。
> このとき、"Scripting.Dictionary"に""がつくのはなぜ?
CreateObject 関数は、引数に、「Class As String」ということで、参照するクラスの名称を文字列型で指定するという仕様だからです。
牧野千秋さんの投稿
(投稿ID: 4371)
Dim LIST As Scripting.Dictionary
Set LIST = CreateObject("Scripting.Dictionary")
このとき、"Scripting.Dictionary"に""がつくのはなぜ?
当然小文字で入力しても大文字にならない
2つめ
テキスト通りに書いたのですが
dic.Item(KEY) = dic.Item(KEY) + 1
で型が一致しません、と出ます。
ここは「すでにキーにあるから、配列を1段下げるよ」という意味ではないのでしょうか。
小川慶一さんのコメント
(コメントID: 6002)
「1つめ」について:
> 当然小文字で入力しても大文字にならない
ダブルクオートでくくった範囲は文字列だからです。
> このとき、"Scripting.Dictionary"に""がつくのはなぜ?
CreateObject 関数は、引数に、「Class As String」ということで、参照するクラスの名称を文字列型で指定するという仕様だからです。
ref: msdn「CreateObject 関数」
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/createobject-function?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Dja-JP%26k%3Dk(vblr6.chm1010851)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue%26f%3D255%26MSPPError%3D-2147217396
「2つめ」については、追って回答しますね。