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

すべての配列の次元が再定義できるわけではありません。 動的であると特に宣言された配列であっても、 Variant変数 内の配列は一時的にロックされることがあります。 このエラーの原因と解決策は次のとおりです。

  • ReDim を使用して、固定サイズの配列の要素数を変更しようとしました。 たとえば、次のコードでは、固定サイズの配列 FixedArrSomeArr プロシージャの NextOne に渡され、その SomeArr のサイズ変更が試みられています。

      Sub FirstOne 
        Dim FixedArr(25) As Integer    ' Create a fixed-size array and 
        NextOne FixedArr()    ' pass it to another procedure. 
      End Sub 
    
      Sub NextOne(SomeArr() As Integer) 
        ReDim SomeArr(35)        ' Error 10 occurs here. 
        '. . . 
      End Sub 
    

    元の配列を固定サイズではなく動的にしてください。それには、その配列を ReDim で宣言するか (その配列がプロシージャ内で定義されている場合)、要素数を指定せずに宣言します (その配列が モジュール レベルで宣言されている場合)。

  • モジュール レベルの動的配列のサイズを変更しようとしましたが、要素の 1 つが引数としてプロシージャに渡されています。 たとえば、次のコードでは、 ModArray はモジュール レベルの動的配列で、45 番目の要素が 参照渡しTest プロシージャに渡されています。

      Dim ModArray () As Integer    ' Create a module-level dynamic array. 
      '. . . 
    
      Sub AliasError() 
        ReDim ModArray (1 To 73) As Integer 
      Test ModArray(45)    ' Pass an element of the module-level  
      ' array to the Test procedure. 
      End Sub 
    
      Sub Test(SomeInt As Integer) 
        ReDim ModArray (1 To 40) As Integer  ' Error occurs here. 
      End Sub 
    

    この場合、モジュール レベルの配列の要素を渡す必要はありません。これは、モジュール内のすべてのプロシージャ内に表示されるためです。 ただし、要素が渡されると、プロシージャ内の参照 パラメーター のメモリの割り当て解除を防ぐために配列がロックされ、プロシージャが戻るときに予期しない動作が発生します。

  • 配列を含んでいるバリアント型 (Variant) 変数に値を代入しようとしましたが、そのバリアント型 (Variant) は現在ロックされています。 たとえば、コードで For Each...Next ループを使用して、配列を含むバリアントを繰り返し処理する場合、ループの開始時点で配列がロックされ、ループの終了時にロックが解除されます。

      SomeArray = Array(9,8,7,6,5,4,3,2,1) 
    
      For Each X In SomeArray 
        SomeArray = 301    ' Causes error since array is locked. 
      Next X 
    

    For Each...Next ループではなく、 For...Next を使用して繰り返し処理を行ってください。 配列が For Each...Next ループのオブジェクトであるときは、その配列を読み取ることはできますが、そこに書き込むことはできません。

詳細については、該当する項目を選択し、F1 キー (Windows の場合) または HELP (Macintosh の場合) を押してください。

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。