Excel VBA の実行時エラー辞典

実行時エラー '10':この配列は固定されているか、または一時的にロックされています

サイズ固定の配列を ReDim していないか、For Each で回している配列の変数を書き換えていないか確認します。

よくある原因

直し方

  1. 停止した ReDim や代入の行で、対象の配列がどこでどのように宣言されたかを確認します。
  2. 大きさを変える配列は、要素数を書かずに宣言(Dim values() As Long など)し、ReDim で大きさを決めます。
  3. モジュールレベルの配列は要素を引数で渡さず、必要なら値を別の変数にコピーしてから渡します。
  4. ループ中に配列を書き換えたい場合は 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)

調べ方

  1. エラー画面の「デバッグ」が使える場合は押し、黄色で止まった行とメッセージ全文を記録します。Windows では Alt+F11 で VBE を開けます。
  2. 停止行の少し前を選び、F9 でブレークポイントを設定します。再実行して止めたら、F8 で一行ずつ進めます。
  3. 停止した行の配列名で検索し、ReDim・For Each・引数として渡している箇所を一覧にします。
  4. Ctrl+G でイミディエイトウィンドウを開き、下の式を入力して Enter を押します。例の変数があるプロシージャ内で停止し、変数名は自分のコードに合わせてください。
? TypeName(values), LBound(values), UBound(values)

Err の情報はエラーが起きた直後に確認します。修正後は、正常な入力と問題が起きた入力の両方で結果を照合してください。

関連エラー

確認した公式資料