Excel VBA の実行時エラー辞典
実行時エラー '457':このキーは既にこのコレクションの要素に割り当てられています
Collection の Add で、すでに登録したキーをもう一度使っていないか確認します。
よくある原因
- 重複を含む列の値を、そのまま Collection のキーにして Add しています。
- モジュールレベルなどの Collection を使い回し、前回の実行で追加したキーが残っています。
- 複数の列をつないでキーを作るときに区切り文字がなく、別の組み合わせが同じ文字列になっています("1" & "23" と "12" & "3" など)。
直し方
- 停止した Add の直前で、追加しようとしたキーの値を確認します。
- 重複を除くことが目的なら、エラー 457 を「登録済み」とみなして次へ進む処理にし、それ以外のエラーとは区別します。
- 重複が想定外なら元データを確認し、キーの作り方(区切り文字・対象の列)を見直します。
- Collection を使い回す場合は、処理の最初で New を使って作り直します。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
最初のシートの A2:A10 から、重複を除いた件数を数える例です。セルの値をキーにし、空のセルは飛ばしています。
修正前
Dim seen As New Collection, cell As Range
For Each cell In ThisWorkbook.Worksheets(1).Range("A2:A10")
seen.Add cell.Value2, CStr(cell.Value2)
Next cell
修正後
Dim seen As New Collection, cell As Range
For Each cell In ThisWorkbook.Worksheets(1).Range("A2:A10")
If Len(cell.Text) > 0 Then
On Error Resume Next
seen.Add cell.Value2, CStr(cell.Value2)
If Err.Number <> 0 And Err.Number <> 457 Then
Debug.Print cell.Address, Err.Description
End If
On Error GoTo 0
End If
Next cell
Debug.Print seen.Count
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- Add の行にブレークポイントを置き、キーにする値と、それまでに追加した件数を確認します。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? CStr(cell.Value2), seen.Count
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。