VBA エラー 10 この配列は固定されているか、または一時的にロックされています。の原因と対処方法

VBAを実行するとVBA エラー 10「この配列は固定されているか、または一時的にロックされています。」を見る機会はありませんか?

コードをみても誤った箇所がわからず途方に暮れる場合もあるかと思います。

そんな中で悩むことは、

・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のエラーはパターンを知っておくと発生した時に慌てず対応することができますので、

しっかりと対処方法を把握するようにしておきたいですね!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です