Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2016)
dictionaryの使い方について
投稿日時: 21/07/19 20:12:45
投稿者: rukatan

 
困りに困っています。
classモジュールから戻り値に格納したdictionaryのデータを標準モジュールで使用したいのですが、うまくいきません。詳しい方お助け願います。
 
下記ソースになります。
参照設定は、チェック済みです。
 class Module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public Function CreateList () as dictionary
 
 dim wb as workbook
 set wb = workbooks.open(ファイルパス)
 dim ws as worksheet
 set ws = wb.worksheets(シート名)
 dim maxRow as long
 maxRow = range(開始位置).specialCells(xlcellTypeLastCell).row
 dim list as new dictionary
 dim cnt as long
 for cnt =range(開始位置).row to maxRow
    dim obj as nwe info
    witth obj
      .aaa=ws.cells(値A)
      .bbb=ws.cells(値B)
      .ccc=ws.cells(値C)
   end with
  list.add key:=obj.aaa item:=obj
  set obj = nothing
 next
set CreateList=list
end function
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main module
for eachでキーは取得できるのですが
obj.aaa
obj.bbb
obj.ccc
に格納した値を取り出せません。
どのようにすればよいのでしょうか?
雑で汚いプログラムで申し訳ございませんが詳しい方ご教授ください。
 

回答
投稿日時: 21/07/19 21:06:36
投稿者: WinArrow
投稿者のウェブサイトに移動

コードの内容まで読んでいませんが、
 
掲示のコードは手入力ですか?
ところどころ、誤入力があるようで、このコードで動いているとは、考えにくいです。
 
コードペインからコピペして、実際に動いているコードを掲示て下さい。

投稿日時: 21/07/19 21:32:42
投稿者: rukatan

業務用のコードのためコピペが出来ないのです...
携帯からの手打ちのため誤りがあり申し訳ございません

回答
投稿日時: 21/07/19 22:40:14
投稿者: WinArrow
投稿者のウェブサイトに移動

rukatan さんの引用:

業務用のコードのためコピペが出来ないのです...
携帯からの手打ちのため誤りがあり申し訳ございません

コピペしてから、都合の悪いところは、「○○」のように修正すればよいでしょう。
 
とにかく、手入力のために間違っているところがあると、
読む気になりません。
 
動作しているコードを再掲示していただきたいです。

回答
投稿日時: 21/07/19 22:43:10
投稿者: WinArrow
投稿者のウェブサイトに移動

それと
メイン側のコードが掲示していないので、
どこの問題があるか、判断できません。

回答
投稿日時: 21/07/19 23:20:03
投稿者: たらのり

こんばんは(酒気帯びです)
 
あてずっぽうですが,次の部分を
 

for cnt =range(開始位置).row to maxRow
    dim obj as nwe info
    with obj
        .aaa=ws.cells(値A)
        .bbb=ws.cells(値B)
        .ccc=ws.cells(値C)
    end with
    list.add key:=obj.aaa item:=obj
    set obj = nothing
next 

以下のように修正するとどうでしょうか
 
dim obj as info
for cnt =range(開始位置).row to maxRow
    set obj = new info
    with obj
        .aaa=ws.cells(値A)
        .bbb=ws.cells(値B)
        .ccc=ws.cells(値C)
    end with
    list.add key:=obj.aaa item:=obj
    set obj = nothing
next 

外していたらごめんなさい。
 

回答
投稿日時: 21/07/20 17:04:34
投稿者: WinArrow
投稿者のウェブサイトに移動

 

引用:

for cnt =range(開始位置).row to maxRow
    dim obj as nwe info
    witth obj
      .aaa=ws.cells(値A)
      .bbb=ws.cells(値B)
      .ccc=ws.cells(値C)
   end with
  list.add key:=obj.aaa item:=obj
  se nothing
 next

↑についての質問
 
(1)「info」って、何ですか?
(2)For〜Nextでループしているが
cnt
はどこで使っているのでしょうか?

回答
投稿日時: 21/07/20 23:30:39
投稿者: たらのり

こんばんは
 
次の元のコードでは,ループの中で info を New していても,
オブジェクトが作成されるのはプロシジャ内で 1度だけ,
最初に obj が参照されるときだけかと思ったのですが,
簡単なコードを作成してテストしてみると,ループの度に
Initialize が呼ばれるのが意外でした。
 

for cnt =range(開始位置).row to maxRow
    dim obj as nwe info
    with obj
        .aaa=ws.cells(値A)
        .bbb=ws.cells(値B)
        .ccc=ws.cells(値C)
    end with
    list.add key:=obj.aaa item:=obj
    set obj = nothing
next 

簡単なコードを書いてテストをしてみましたが,上記のような
記述でも期待どおりに動きました。
 
# 検証方法があやしいですけどねw

回答
投稿日時: 21/07/20 23:55:27
投稿者: simple

引用:
for eachでキーは取得できるのですが
obj.aaa
obj.bbb
obj.ccc
に格納した値を取り出せません。
クラスにする理由もよくわからないが、
    Set dic = クラスのインスタンス.CreateList()
とすれば dictionaryであるdicが得られているわけですか?
 
それならあとは、例えば、
    For Each e In dic
        Debug.Print dic(e).aaa
        Debug.Print dic(e).bbb
        Debug.Print dic(e).ccc
    Next
といった感じで、Itemが取得できるんじゃないんですか?
 
説明するなら、
keyである e に対応する Item は dic(e)で取り出せ、
これはinfoオブジェクトなわけです。
その各プロパティの値は、
dic(e).aaaなどとプロパティを指定することで得られるわけです。
 
なお、Itemが想定したものになっていなければ、
それは CreateListメソッドの中に間違いがあるんでしょう。
詳細なコードを示さないと原因は分かりません。
 
===================
ちなみに、細かい話ですが、上記のコードは、
    For Each e In dic.Keys
        Debug.Print dic(e).aaa
        Debug.Print dic(e).bbb
        Debug.Print dic(e).ccc
    Next
と書いても結果は同じです。(このほうが意味は分かりやすいかもしれない)。
 
dictionaryをコレクションとみて、
For Each e In dic として、各要素を列挙させた場合、
何が要素として列挙されるかというと、
それは、keysの各値(つまり、各要素のキー値)なのです。
それはそのように決めたので、それを利用するだけです。
(これは、ローカルウインドウでdictionaryオブジェクトの中身を見ると、
  各keyの値が表示されることからも納得的です。優先度はキーのほうが高い)

回答
投稿日時: 21/07/22 12:24:58
投稿者: simple

その後どうなりましたか?
>困りに困っています。
ではなかったのですか?

トピックに返信