このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】動的配列で要素数を変更する方法(Redim Preserve)

2023年1月13日

【VBA】動的配列で要素数を変更する方法(Redim Preserve)

今回は動的配列で要素数を変更する方法を紹介します。

要素数の変更はRedimステートメントによってできるのですが、Preserveを付けないと配列内のデータが消えてしまう点に注意が必要です。

おそらくこの記事を読んで要る方はデータを消さない方法を知りたいと思いますので、こちらの方法を紹介します。

また、後半で動的配列の基本的な使い方(宣言方法、初期化方法)についても説明します。

VBAが難しいと感じたら
自分で作るのが難しいと感じたらご相談ください。
ココナラにて、VBAの作成を受け付けています。
ご相談はこちらから

動的配列の要素数を変更する方法

配列内のデータを消したくない場合(Redim Preserve)

Sub DeleteData()
    
    Dim arr() As String
    ReDim arr(1)
    
    arr(0) = "a"
    arr(1) = "b"
    
    ''ReDimの後にPreserveを付ける
    ReDim Preserve arr(2)
    arr(2) = "c"
    
    Debug.Print arr(0) 'a
    Debug.Print arr(1) 'b
    Debug.Print arr(2) 'c
    
End Sub

すでに配列内にデータがあっていて、データを残したまま配列の要素数を変更したい場合はReDimの後にPreserveを付ける必要があります。

このPreserveを付け忘れると配列内のデータが消えてしまいます。

いまいちピンと来なければ一度Preserveを消してコードを実行してみてください。

arr(0)とarr(1)のデータが無くなっていることが分かると思います。

配列内のデータを消す場合(Redim)

Sub DeleteData()
    
    Dim arr() As String
    ReDim arr(1)
    
    arr(0) = "a"
    arr(1) = "b"
    
    ''Preserve無し
    ReDim arr(2)
    arr(2) = "c"
    
    Debug.Print arr(0) '空文字
    Debug.Print arr(1) '空文字
    Debug.Print arr(2) 'c
    
End Sub

このサンプルコードでは先ほどのコードからPreserveを消しています。

こうするとarr(0)とarr(1)に保存されていたデータが消えているのが分かると思います。

ReDim arr(1)

また、一番最初に動的配列の要素数を決める時に使うのも同じくRedimです。

動的配列を宣言する方法

Sub DeclareArr()
    Dim arr() As String
    ReDim arr(1)
End Sub

動的配列の宣言は上のコードのように行います。

変数宣言をする際に、変数名の後ろに()を付けます。

宣言した段階だと要素数が決まっていないため、データを代入したりしようとするとエラーとなります。

変数宣言をしたらRedimを書いて要素数を決定しましょう。

動的配列を初期化する方法

Sub EraseArr()
    
    Dim arr() As String
    ReDim arr(1)
    
    arr(0) = "a"
    arr(1) = "b"
    
    ''Eraseするとデータと要素数の両方がクリアされる
    Erase arr
    
End Sub

動的配列を初期化したい場合はEraseステートメントを使用します。

このステートメントを使うと動的配列のデータと要素数の両方がクリアされます。

ちょうど変数宣言した直後のような状態となります。

何らかの事情で動的配列を使い回したいときにはEraseステートメントを使って初期化してみてください。

VBAが難しいと感じたら
自分で作るのが難しいと感じたらご相談ください。
ココナラにて、VBAの作成を受け付けています。
ご相談はこちらから

VBA

Posted by やろまい