• ベストアンサー

VB6.0 一つの分類に対して複数の項目を紐付ける方法

VB6.0 アルゴリズムで悩んでいます。 分類A,A_2 分類B,B_1 分類A,A_1 ~ 上記のようなCSVを読み込みます。 その後、以下のように画面に展開したいのです。 分類A → A_2,A_1 分類B → B_1 ~ 分類は同じ値が存在した場合一つにまとめます。 項目は同じものが存在することはありません。 CreateObject("Scripting.Dictionary")を使用して何とかできないものかと思ったのですが、正直完全にお手上げ状態です。 少々説明が分かりにくいかもしれませんが、ご回答よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

コレクションを要素に持つケースだと柔軟に対応できるかも。   Dim dic As Object   Dim col As Collection   Dim i As Long   Dim csvLine(2) As String   Dim word As Variant   Dim key As Variant      Set dic = CreateObject("Scripting.Dictionary")   csvLine(0) = "分類A,A_2"   csvLine(1) = "分類B,B_1"   csvLine(2) = "分類A,A_1"      For i = LBound(csvLine) To UBound(csvLine)     word = Split(csvLine(i), ",")     If Not dic.Exists(word(0)) Then       Set col = New Collection       col.Add word(1)       dic.Add word(0), col     Else       dic(word(0)).Add word(1)     End If   Next      For Each key In dic.keys     Set col = dic(key)     Debug.Print "●" & key     For i = 1 To col.Count       Debug.Print "(" & i & ")"; col.Item(i)     Next   Next   dic.RemoveAll   Set dic = Nothing

ShimantoGa
質問者

お礼

回答ありがとうございます。 これです、これがやりたかったんです。 本当にありがとうございます。 しかし一点気になった点があります。 If Not dic.Exists(word(0)) Then Set col = New Collection ~ と動的にコレクションを増やしているのですが、これらはDictionaryと違って明示的に破棄する必要はないのでしょうか。

その他の回答 (2)

回答No.3

>Dictionaryと違って Dictionaryでも別に明示的に破棄しなくてもよかったはず。 まぁ、Dictionaryのほうに、Nothingを入れている以上どっちもやっておいたほうがBestそうですね。 (もしかしたら、DictionaryのRemoveAll(もしくはNothingを代入時)に、要素の参照カウンタもデクリメントされるかも。) For Each key In dic.keys Set dic(key) = Nothing Next dic.RemoveAll Set dic = Nothing

ShimantoGa
質問者

お礼

ありがとうございます。 どう実現すればよいか皆目見当もつかなかったためかなり苦労していました。 ですので本当に助かりました。 Collectionを破棄する構文と合わせて利用させていただきます。 本当にありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

画面に展開というのがわかりませんでしたが、  Dim myDic As Object  Dim myKey As Variant  Dim i As Integer  Dim v(3) As Variant  Dim w As Variant  Set myDic = CreateObject("Scripting.Dictionary")  v(0) = "分類A,A_2"  v(1) = "分類B,B_1"  v(2) = "分類A,A_1"  v(3) = "分類B,B_2"  For i = 0 To 3      w = Split(v(i), ",")      If Not myDic.Exists(w(0)) Then         myDic(w(0)) = w(1)      Else         myDic(w(0)) = myDic(w(0)) & "," & w(1)      End If  Next  For Each myKey In myDic.Keys      Debug.Print myKey, myDic(myKey)  Next  Set myDic = Nothing こんな感じの事でしょうか?

ShimantoGa
質問者

お礼

回答ありがとうございます。 ご教授していただいた処理で解決しました。 本当にありがとうございます。 しかしこの処理のことでもう一点質問させていただきたいのですが。 >myDic(w(0)) = myDic(w(0)) & "," & w(1) と記述して分類ごとの項目を紐付けることは可能なのですが、 >myDic(w(0)) & "," & w(1) この部分を配列やCollectionなどにすることはできないでしょうか。 Array(0) = w(1) Array(1) = w(1) objCollection.Add(count,w(1)) 分類の数が不定ですので可能かどうか分かりませんが、よろしければご回答よろしく願いします。

関連するQ&A

専門家に質問してみよう