Excel VBAでDictionaryを使って重複しないデータだけを追加する際、エラー457(このキーは既にこのコレクションの要素に割り当てられています)が発生することがあります。本記事では、原因と回避方法を具体例とともに解説します。
Dictionaryで重複キーエラーが起きる原因
VBAのDictionaryではキーが重複すると自動的にエラーになります。しかし、A.ExistsでFalseを返しているのにAddでエラーになる場合があります。
原因としては、キー文字列に余分な文字(空白、複数のスラッシュ、見えない文字)が混入しているケースや、キーの生成方法に不整合があるケースが挙げられます。
具体例:キー文字列の確認
質問のコードでは、キーを以下のように作成しています。
'" & Mic(K, 1) & "/" & Mic(K, 2) & "/" & "/" & Mic(K, 8)
ここで、スラッシュが2つ連続しているため、期待したキーと実際のキーが異なる可能性があります。また、Mic配列の値に先頭や末尾の空白が含まれている場合、A.ExistsでFalseが返ってもAdd時に別の同一内容として認識され、エラーが発生することがあります。
回避方法:キーの整形と確認
1. Trim関数で空白を削除
キー文字列を生成する際に、各要素にTrimを使って空白を除去します。例。
Dim key As Stringkey = Trim(Mic(K, 1)) & "/" & Trim(Mic(K, 2)) & "/" & Trim(Mic(K, 8))
2. 連続スラッシュを避ける
不要なスラッシュは削除して、キーを一意に保つようにします。
3. Existsチェック後にAdd
ExistsでFalseを確認してからAddすることで、重複キーの追加を防ぎます。
実践例:修正版コード
Dim A As DictionarySet A = New DictionaryFor K = 1 To Mics Dim key As String key = Trim(Mic(K, 1)) & "/" & Trim(Mic(K, 2)) & "/" & Trim(Mic(K, 8)) If Not A.Exists(key) Then A.Add key, K End IfNext K
このようにキーを明確に整形することで、エラー457を回避できます。
まとめ
Dictionaryで重複キーエラーが発生する場合は、キー文字列の生成方法を見直すことが重要です。空白の除去や連続スラッシュの排除、Existsチェックの適切な使用で、重複しないデータの追加が正しく行えるようになります。

コメント