この配列は固定されているか、または一時的にロックされています (エラー 10)This array is fixed or temporarily locked (Error 10)

すべての配列の次元が再定義できるわけではありません。Not all arrays can be redimensioned. また、動的と宣言されている配列や、バリアント型 ( Variant ) 変数の配列の場合でも、一時的にロックされる場合があります。Even arrays specifically declared to be dynamic and arrays within Variant variables are sometimes locked temporarily. このエラーの原因と解決策は次のとおりです。This error has the following causes and solutions:

  • ReDim を使用して、固定サイズの配列の要素数を変更しようとしました。You tried to use ReDim to change the number of elements of a fixed-size array . たとえば、次のコードでは、固定サイズの配列 FixedArrSomeArr プロシージャの NextOne に渡され、その SomeArr のサイズ変更が試みられています。For example, in the following code, the fixed array FixedArr is received by SomeArr in the NextOne procedure, and then an attempt is made to resize 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 で宣言するか (その配列がプロシージャ内で定義されている場合)、要素数を指定せずに宣言します (その配列が モジュール レベルで宣言されている場合)。Make the original array dynamic rather than fixed by declaring it with ReDim (if the array is declared within a procedure), or by declaring it without specifying the number of elements (if the array is declared at module level).

  • モジュール レベルの動的配列のサイズを変更しようとしましたが、要素の 1 つが引数としてプロシージャに渡されています。You tried to redimension a module-level dynamic array, in which one element has been passed as an argument to a procedure. たとえば、次のコードでは、 ModArray はモジュール レベルの動的配列で、45 番目の要素が 参照渡しTest プロシージャに渡されています。For example, in the following code, ModArray is a dynamic, module-level array whose forty-fifth element is being passed by reference to the Test procedure:

      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 
    

    モジュール内のすべてのプロシージャ内に表示されるので、この場合はモジュールレベルの配列の要素を渡す必要はありません。There is no need to pass an element of the module-level array in this case, since it's visible within all procedures in the module. ただし、要素が渡された場合、配列は、プロシージャ内の referenceパラメーターのメモリの割り当てを防ぐためにロックされ、プロシージャが戻るときに予期しない動作を引き起こします。However, if an element is passed, the array is locked to prevent a deallocation of memory for the reference parameter within the procedure, causing unpredictable behavior when the procedure returns.

  • 配列を含んでいるバリアント型 (Variant) 変数に値を代入しようとしましたが、そのバリアント型 (Variant) は現在ロックされています。You attempted to assign a value to a Variant variable containing an array, but the Variant is currently locked. たとえば、コードで For Each...Next ループを使用して、配列を含むバリアントを繰り返し処理する場合、ループの開始時点で配列がロックされ、ループの終了時にロックが解除されます。For example, if your code uses a For Each...Next loop to iterate over a variant containing an array, the array is locked on entry into the loop, and then released at the termination of the loop:

      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 を使用して繰り返し処理を行ってください。Use a For...Next rather than a For Each...Next loop to iterate. 配列が For Each...Next ループのオブジェクトであるときは、その配列を読み取ることはできますが、そこに書き込むことはできません。When an array is the object of a For Each...Next loop, you can read the array, but not write to it.

詳細については、該当する項目を選択し、F1 キー (Windows の場合) または HELP (Macintosh の場合) を押してください。For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).

サポートとフィードバックSupport and feedback

Office VBA またはこの説明書に関するご質問やフィードバックがありますか?Have questions or feedback about Office VBA or this documentation? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.