Sub test()
Dim dic As Scripting.Dictionary
Set dic = CreateObject("Scripting.Dictionary")
Dim c As Long
Dim cMx As Long
Dim st As String
cMx = Range("A" & Rows.Count).End(xlUp).Row
For c = 1 To cMx
st = Range("A" & c).Value
If dic.Exists(st) Then
dic.Item(st) = dic.Item(st) + 1
Else
dic.Add (st), 1
End If
Next
'★疑問1 vKeysとvItmsを動的配列で宣言しても同じ結果になった
'★疑問2 配列のサイズがわからなかったのでredimしていないがエラーが出なかった
'★疑問3 vKeysの型をstring,vItmsの型をlongにしたら『型が一致しません』エラーになる
Dim vKeys() As Variant
Dim vItms() As Variant
vKeys() = dic.Keys
vItms() = dic.Items
For c = LBound(vKeys) To UBound(vKeys)
Range("C1").Offset(c).Value = vKeys(c)
Range("D1").Offset(c).Value = vItms(c)
Next
End Sub
2018/08/03 03:07
小川慶一さんのコメント
(コメントID: 5602)
mokoさん:
こんばんは。
以下のプログラムを実行し、自分でも試しにいろいろ書いて、実行し、としてください。
それから、ご自身の投稿を見直し、それに対してコメントを返してみてください。
Sub VarTest()
'バリアント型変数には、配列を入れることもできます。
'TypeName関数は、引数として渡された変数がどんなデータを持っているか?を教えてくれる関数
'IsArray関数は、引数として渡された変数が配列かどうか?を教えてくれる関数
Dim vNor As Variant '「As Variant を省略しても、Variant型で宣言したものとみなされる」ということでしたね。ピンとこない場合は発展編1第1章の復習を!
Debug.Print "1"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
ReDim vNor(2)
Debug.Print "2"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
vNor(0) = "A"
vNor(1) = "B"
vNor(2) = "C"
Debug.Print "3"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
vNor = "hoge"
Debug.Print "4"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
End Sub
Sub ShoryakuTest()
'変数宣言時に、 As Variant をつけないでみました。
'それでも、Variant型で宣言したとみなされますね。
Dim vNor '「As Variant を省略しても、Variant型で宣言したものとみなされる」ということでしたね。ピンとこない場合は発展編1第1章の復習を!
Debug.Print "1"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
ReDim vNor(2)
Debug.Print "2"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
vNor(0) = "A"
vNor(1) = "B"
vNor(2) = "C"
Debug.Print "3"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
vNor = "hoge"
Debug.Print "4"
Debug.Print TypeName(vNor)
Debug.Print IsArray(vNor)
Debug.Print ""
End Sub
mokoさんの投稿
(投稿ID: 4041)
いつもお世話になっています。
KeysメソッドとItemメソッドも配列を返すのに、変数で宣言するのがしっくりきていません。
配列を返すのなら配列を宣言するのでは?と思い、試しにやってみたらうまく動いたのですが、動いたら動いたでredimしてないのに?とか
配列の型は?とかいろいろ疑問が出てきました。
連想配列は通常の配列とは違うから・・・という風に思っておけばいいのでしょうか?
小川慶一さんのコメント
(コメントID: 5602)
こんばんは。
以下のプログラムを実行し、自分でも試しにいろいろ書いて、実行し、としてください。
それから、ご自身の投稿を見直し、それに対してコメントを返してみてください。
> 小川先生
> いつもお世話になっています。
>
> KeysメソッドとItemメソッドも配列を返すのに、変数で宣言するのがしっくりきていません。
> 配列を返すのなら配列を宣言するのでは?と思い、試しにやってみたらうまく動いたのですが、動いたら動いたでredimしてないのに?とか
> 配列の型は?とかいろいろ疑問が出てきました。
>
> 連想配列は通常の配列とは違うから・・・という風に思っておけばいいのでしょうか?