質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

24219閲覧

VBA Dictionary 取り出し方にて質問

King_of_Flies

総合スコア382

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/02/23 01:18

編集2018/02/23 01:23

VBAにて下記実装を行いました。

VBA

1Dim dictionary As Variant 2Set dictionary = CreateObject("Scripting.Dictionary") 3 4Dim hogeIndex As Integer 5Dim hogeString As String 6 7For hogeIndex = 1 To 10 8 hogeString = sheet1.cells(hogeIndex,1) 9 If Not dictionary.Exists(hogeString ) Then 10 dictionary.Add hogeString , hogeString 11 End If 12Next 13

上記コンパイルは通っている状態です。

ここでdictionaryにAddしたitemをループで取得したいのですが、
下記サイトの情報通りの実装を行っても値取得ができません。

http://www.excel-wing.com/study/jitumu/970

VBA

1Dim hugeIndex As Integer 2For hugeIndex = 0 To 10 3 Debug.Print(dictionary.Items(hugeIndex)) 4Next

dictionary.Itemsだとコンパイルエラー、dictionary.Itemだとコンパイルエラーは出ませんが、値取得は出来ない。

また、dictionaryにAddしてからDebug.Pintでdictionaryを出力しようてしている処理までの流れでdictionaryのオブジェクト破棄は行っていません。

dictionaryに追加したItemをkeyなど関係なく、Addした順番で出力したいのですが、
どのように実装すればよろしいでしょうか。

よろしくお願いいたします。

追記。
dictionary.Items(0)で出力しようとした際のエラーメッセージは下記になります。
【Proparty Let プロシージャが定義されておらず、Property Getプロシージャからオブジェクトが返却されませんでした。】

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こちらのページにあるように、itemsを一旦別の変数に代入すれば(n)で参照できるようですね。

VBA

1Dim hugeIndex As Integer 2Dim items 3items = dictionary.Items 4For hugeIndex = 0 To 9 5 Debug.Print items(hugeIndex) 6Next

Itemsは引数を伴わないメソッドなので、一旦通常の配列に移し変えて使えるようにしているイメージでしょうか。

もしくはFor Eachを使うと楽かもしれません。

VBA

1For Each Item In dictionary.Items 2 Debug.Print Item 3Next

Itemで値が取得できないのは、当然です。
Addの第一引数はキー名です。
提示コードでは、キー名に値を用いているので、1とか2では登録されていません。
キーをhogeIndexにすることでItem(n)で参照できるようになります。

VBA

1For hogeIndex = 1 To 10 2 hogeString = Sheet1.Cells(hogeIndex, 1) 3 If Not dictionary.Exists(hogeString) Then 4 dictionary.Add hogeIndex, hogeString ' hogeIndexをキー名にする 5 End If 6Next 7 8Dim hugeIndex As Integer 9For hugeIndex = 1 To 10 10 Debug.Print dictionary.Item(hugeIndex) 11Next

投稿2018/02/23 02:16

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

King_of_Flies

2018/02/23 02:18

配列にDictionaryを格納するのが楽だったので、ttypさんの案を採用しました。 ありがとうございました。
guest

0

Dictionary はキーと値を一組にして保持するオブジェクトです。
例えば dictionary.Add "foo", "bar" とした場合は dictionary.Item("foo")bar が取り出せます。
次の通りアレンジを加えず入力して実行してみてください。

VBA

1Sub Macro1() 2 Dim dictionary As Variant 3 Set dictionary = CreateObject("Scripting.Dictionary") 4 5 Dim hogeIndex As Integer 6 Dim hogeString As String 7 8 For hogeIndex = 1 To 10 9 hogeString = Sheet1.Cells(hogeIndex, 1) 10 If Not dictionary.Exists(hogeString) Then 11 dictionary.Add "cell" & hogeIndex, hogeString 12 End If 13 Next 14 15 For hogeIndex = 1 To 10 16 Debug.Print dictionary.Item("cell" & hogeIndex) 17 Next 18End Sub

投稿2018/02/23 02:09

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一度Itemsの結果を取得してから参照することとなるかと思います。
Items メソッド

vba

1Dim items As Variant 2items = dictionary.items 3 4Dim hugeIndex As Integer 5For hugeIndex = 0 To dictionary.Count - 1 6 Debug.Print items(hugeIndex) 7Next

参照されたサイトでも(追加)すみません、こちら参照設定のみできます。と追記されており、変数をAs Dictionaryで定義した場合のみ、Items(0)等の直接参照が可能となります。

投稿2018/02/23 02:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

蛇足ですが、Itemの列挙の方法についていくつか
参照設定なしでも、dictionary.Itemsから直接取れなくは無いですよということで。

vba

1'dictionary だと型名と被って大文字小文字が崩れるので避けた方が無難 2Dim dic As Object 3Set dic = CreateObject("Scripting.Dictionary") 4 5Dim hogeIndex As Long 6Dim hogeString As String 7 8With Sheet1.Cells 9 For hogeIndex = 1 To 10 10 hogeString = .Item(hogeIndex, 1).Text 11 If Not dic.Exists(hogeString) Then 12 dic.Add hogeString, hogeString 13 End If 14 Next hogeIndex 15End With 'Sheet1.Cells 16 17 18Debug.Print "方法1:添え字で直接取得" 19 '毎回配列全体を取得→添え字アクセスなので遅そう 20Dim hugeIndex As Long 21For hugeIndex = 0 To dic.Count - 1 22 Debug.Print dic.items()(hugeIndex) 23Next hugeIndex 24 25 26Debug.Print "方法2:値を配列化して添え字で取得" 27 '今回の用途なら一番無難そう 28Dim itemBuf() As Variant 29itemBuf = dic.items() 30For hugeIndex = LBound(itemBuf) To UBound(itemBuf) 31 Debug.Print itemBuf(hugeIndex) 32Next hugeIndex 33 34 35Debug.Print "方法3:値を配列化してForEach" 36 'VBAでは配列のForEachはForより遅いので微妙 37Dim itm As Variant 38For Each itm In dic.items() 39 Debug.Print itm 40Next itm

投稿2018/02/23 09:04

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問