VBAでDictionaryの重複キーエラーを回避する方法と原因解説

Visual Basic

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チェックの適切な使用で、重複しないデータの追加が正しく行えるようになります。

コメント

タイトルとURLをコピーしました