2016-04-28 24 views
0

Scripting.DictionaryオブジェクトのRemove-Methodの呼び出しがうまくいかないという問題があります。Excel VBA辞書項目の削除

Dim temp As String 
Set dict = CreateObject("Scripting.Dictionary") 

dict .Add(2,"asd") 
dict .Add(3,"asd") 
dict .Add(4,"asd") 
dict .Add(5,"asd") 
dict .Add(6,"asd") 

For Each Key in dict.Keys 
    temp = Key 
    If(Key > 3) Then 
     dict.Remove(temp) 
    End If 
Next 

このコードを実行すると、私の辞書には同じ数の項目が表示されます。

編集:実際の使用状況をよりよく反映するようにコードを変更しました。文字列の変換はここでは誤りです。キーを文字列にキャストした後、辞書は値を正しく一致させることができません。残念ながら、これは問題の解決策を得るのには役に立たなかった。

Edit2:Keyオブジェクト自体はRange型です。それを文字列変数に代入すると、削除操作で比較が失敗するという問題が発生します。私は変種として変種を使用しようとしましたが、キーは文字列にキャストされます。

+0

try dict.Keys() –

+0

動作しません。私はエラーメッセージが表示されないことに注意する必要があります。関連するエントリは単に削除されません。 – narain

+0

削除でparanthesisを使用しない –

答えて

2
Sub x() 

Dim dict As Scripting.Dictionary 
Dim i As Variant 

Set dict = New Scripting.Dictionary 

dict.Add 2, "asd" 
dict.Add 3, "asd" 
dict.Add 4, "asd" 
dict.Add 5, "asd" 
dict.Add 6, "asd" 

For Each i In dict.Keys() 
    if i>3 then dict.Remove i 
Next i 


End Sub 
+0

まだ動作しません – narain

-1

キーは数値ではなく2番目のパラメータ( "asd")ですので、実際に何も削除していません。パラメータを追加するときにパラメータの順序を逆にすると効果があります。

+0

私はそれがKey、Value:https://msdn.microsoft.com/en-us/library/5h92h863%28v=vs.84%29.aspx – narain

+0

Ooooops!たしかにそれは正しいね。私の謝罪別の、うまくいけば良い考え:あなたのキーは文字列型ではないので、それを変換している数値として追加していますか?私はあなたの比較が失敗する可能性があると思う( "3"> 3) – HedgePig

+0

上記のコードは単なる例にすぎません。私の実際のコードは文字列をキーとして使用していました。さらに、キーはサイドステップで文字列変数に保存されますが、これは明らかに不一致の原因です。 – narain