この配列は固定されているか、または一時的にロックされています (エラー 10)
すべての配列の次元が再定義できるわけではありません。 動的であると特に宣言された配列であっても、 Variant変数 内の配列は一時的にロックされることがあります。 このエラーの原因と解決策は次のとおりです。
ReDim を使用して、固定サイズの配列の要素数を変更しようとしました。 たとえば、次のコードでは、固定サイズの配列
FixedArr
がSomeArr
プロシージャの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 のサポートおよびフィードバックを参照してください。