Excel VBA の実行時エラー辞典
実行時エラー '10':この配列は固定されているか、または一時的にロックされています
サイズ固定の配列を ReDim していないか、For Each で回している配列の変数を書き換えていないか確認します。
よくある原因
- 要素数を指定して宣言した配列(固定サイズの配列)を別のプロシージャへ渡し、受け取った側で ReDim しています。
- モジュールレベルの動的配列の要素を参照渡しで渡したまま、呼び出し先でその配列を ReDim しています。
- 配列を入れた Variant 変数を For Each で回している途中で、その変数に別の値を代入しています。
直し方
- 停止した ReDim や代入の行で、対象の配列がどこでどのように宣言されたかを確認します。
- 大きさを変える配列は、要素数を書かずに宣言(Dim values() As Long など)し、ReDim で大きさを決めます。
- モジュールレベルの配列は要素を引数で渡さず、必要なら値を別の変数にコピーしてから渡します。
- ループ中に配列を書き換えたい場合は For Each ではなく、LBound から UBound までの For...Next で処理します。
元のブックや入力ファイルを残し、コピーで試してください。以下は一つの原因を扱う例です。Sub 全体を示していないコードは、練習用の Sub の中に記述します。
値が 2 の要素を空にする例です。要素そのものを取り除きたい場合は、残す値だけを別の配列へ移してください。
修正前
Dim values As Variant, item As Variant
values = Array(3, 2, 1)
For Each item In values
If item = 2 Then values = Array(3, 1)
Next item
修正後
Dim values As Variant, i As Long
values = Array(3, 2, 1)
For i = LBound(values) To UBound(values)
If values(i) = 2 Then values(i) = Empty
Next i
Debug.Print values(0), values(1), values(2)
調べ方
- エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
- 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
- 停止した行の配列名で検索し、ReDim・For Each・引数として渡している箇所を一覧にします。
- Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? TypeName(values), LBound(values), UBound(values)
Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。