VBAを実行するとVBA エラー 10「この配列は固定されているか、または一時的にロックされています。」を見る機会はありませんか?
コードをみても誤った箇所がわからず途方に暮れる場合もあるかと思います。
そんな中で悩むことは、
・VBA エラー 10「この配列は固定されているか、または一時的にロックされています。」の対処はどうすればよい?
ではないでしょうか?
今回は、
VBA エラー 10「この配列は固定されているか、または一時的にロックされています。」の原因とサクっとできる対処方法について
まとめます!
もくじ
VBA エラー 10「この配列は固定されているか、または一時的にロックされています。」はどんなエラー?
静的宣言されている配列をReDimで再定義しようとすると再定義できないために生じるエラーとなります。
動的配列や、バリアント型 変数の配列の場合でも、一時的にロックされる場合があります。
VBA エラー 10の原因①「ReDim を使用して、固定サイズの配列の要素数を変更」
ReDim を使用して、静的宣言されている配列の要素数を変更しようとエラーとなります。
Sub エラーテスト1()
Dim Hairetsu(3) As String
Call エラーテスト1pass(Hairetsu())
End Sub
Sub エラーテスト1pass(Hairetsu2() As String)
ReDim Hairetsu2(5) As String
End Sub
エラー10が表示されますね。
ちなみに、プロシージャ内でReDimで再定義しようとしてもコンパイル時にエラーとなるので、
エラー10とはなりません。
Sub エラーテスト1a()
Dim Hairetsu(3) As String
ReDim Hairetsu(5) As String
End Sub
エラーが10ではないですね。
あくまで、別のプロシージャやファンクションへ引数として受け渡した後に
再定義しようとすると発生するエラーだと思ってください。
VBA エラー 10の原因①「ReDim を使用して、固定サイズの配列の要素数を変更」の対処方法は元の配列を固定サイズではなく動的する
配列を固定サイズではなく動的する
VBA エラー 10の原因①「ReDim を使用して、固定サイズの配列の要素数を変更」の対処方法は
元の配列を固定サイズではなく動的にします。
動的配列にするためにはサンプルの通り
要素数を指定せずに宣言するだけでOKです。
Sub エラーテスト1()
Dim Hairetsu() As String
Call エラーテスト1pass(Hairetsu())
End Sub
Sub エラーテスト1pass(Hairetsu2() As String)
ReDim Hairetsu2(5) As String
End Sub
配列の値を別配列にコピーする
動的配列にしたくない場合は、別の配列に元の配列の値を
まるまるコピーして利用する方法もあります。
ReDimを使わないのでエラー10になることはありません。
Sub エラーテスト1pass(Hairetsu2() As String)
Dim Hairetsu3(5) As String
'配列のコピーを要素ごとに行う
For i = 1 To UBound(Hairetsu2)
Hairetsu3(i) = Hairetsu2(i)
Next
Hairetsu3(4) = "Dさん"
Hairetsu3(5) = "Eさん"
For i = 1 To UBound(Hairetsu3)
Debug.Print i & "番目は、" & Hairetsu3(i) & "です"
Next
End Sub
追加した値が表示されますね。
さいごに
今回は、
VBA エラー 10「この配列は固定されているか、または一時的にロックされています。」の原因とサクっとできる対処方法について
まとめました。
VBAのエラーはパターンを知っておくと発生した時に慌てず対応することができますので、
しっかりと対処方法を把握するようにしておきたいですね!
コメントを残す