2017-03-23 7 views
1

問題があり、何か助けが必要です。私は、VBAの辞書を学ぶための簡単な例を作成し、すでに問題にぶつかっています。私は次のように設定している:VBA辞書はキーを複製しています

enter image description here

を、私は、キーと項目に追加して、キーにわたってループ処理をしようとしています。キーが存在する場合は、アイテムを追加します。代わりに起こっているのは、キーが複製されるということです。下の例では、私はAppleの代わりに2つのキーで終わります。私は間違っていますか?どんな助けでも大歓迎です。下記の関連コード:

Dim wkb As Workbook 
Dim ws As Worksheet 
Dim dict As Scripting.Dictionary 

Set wkb = ActiveWorkbook 
Set ws = wkb.ActiveSheet 

'clearing old totals 
ws.Range("C8:C9").ClearContents 

Set dict = New Scripting.Dictionary 
dict.CompareMode = vbTextCompare 

For i = 3 To 6 
    If dict.Exists(ws.Cells(i, "B").Value) = False Then 
     MsgBox "doesnt exist, adding " & ws.Cells(i, "B") 
     dict.Add ws.Cells(i, "B"), ws.Cells(i, "C") 
    ElseIf dict.Exists(ws.Cells(i, "B").Value) Then 
     MsgBox "exists" 
     dict.Item(ws.Cells(i, "B")) = dict.Item(ws.Cells(i, "B")) + ws.Cells(i, "C").Value 
    End If 
Next i 

MyArray = dict.Keys 
MsgBox "Keys are: " & Join(MyArray, ";") 

MyArray = dict.Items 
MsgBox "Items are: " & Join(MyArray, ";") 

For Each k In dict.Keys 
    ws.Range("C8") = ws.Range("C8") + dict.Item(k) 
    If k = "Apples" Then 
     ws.Range("C9") = ws.Range("C9") + dict.Item(k) 
    End If 
Next 
+1

辞書は重複しませんが、ケースと\を正規化するか、入力から空白をトリムする必要があるかもしれません。 – Comintern

+0

ええ、それは問題だと思っていましたが、2つの "Apples"のエントリは同じです...トリミングする空白やケースは同じではありません。 – CodinglyClueless

+0

@Cominternはすでに指摘しているように、辞書のキーは一意であり、だから、「アップル」の中に「幼虫」のように見えるが、そうではない人物がいるかもしれない。投稿された2つのリンゴをここで比較すると、最初のAはChrW(65)、2番目のAは実際はChrW(1040)実際にキリル文字から派生したものです。 – Ralph

答えて

4

は、あなたは現在、むしろ、細胞のValueよりも、キーとしてセルを追加して、セルB6には、B3を細胞ではない - 彼らは、少なくとも異なる.Row特性を有しています。

あなたがあなたのコードを変更する必要があります。

For i = 3 To 6 
    If dict.Exists(ws.Cells(i, "B").Value) = False Then 
     MsgBox "doesnt exist, adding " & ws.Cells(i, "B").Value 
     dict.Add ws.Cells(i, "B").Value, ws.Cells(i, "C").Value 
    ElseIf dict.Exists(ws.Cells(i, "B").Value) Then 
     MsgBox "exists" 
     dict.Item(ws.Cells(i, "B").Value) = dict.Item(ws.Cells(i, "B").Value) + ws.Cells(i, "C").Value 
    End If 
Next i 
+0

おかげで@ YowE3kは本当に助けと説明に感謝! – CodinglyClueless

+0

@CodinglyCluelessこれは、 'Range'オブジェクトのデフォルトプロパティである' .Value'に依存するべきではないもう一つの理由です - 辞書のキーは 'Range' **または** a' String'(それはオブジェクト自体をキーとして使用することに決めたので、オブジェクトのデフォルトプロパティを使う必要はありませんでした。 – YowE3K

+0

お知りになりたい!ありがとうございました! – CodinglyClueless

関連する問題