【VBA】1次元や2次元配列の宣言と初期化【ReDim、Preserve、Eraseを使う】
【VBA】1次元や2次元配列の宣言と初期化【ReDim、Preserve、Eraseを使う】

【VBA】1次元や2次元配列の宣言と初期化【ReDim、Preserve、Eraseを使う】

大体でIT 大体でIT

2021/1/7

【VBA】1次元や2次元配列の宣言と初期化【ReDim、Preserve、Eraseを使う】 Excel VBA

Excel VBAで、1次元配列や2次元配列を宣言する方法と、初期化する方法について、ご紹介します。配列の次元や大きさを宣言するのは、「ReDim」を使います。配列を初期化する方法としては、「ReDim」、「ReDim Preserve」、「Erase」があります。配列を使えば、VBAを高速化することができますので、配列をマスターしていきましょう。

はじめに

この記事では、1次元配列や2次元配列の宣言と初期化について、ご紹介します。

配列の大きさを宣言したい場合は、「ReDim」を使います。

「ReDim Preserve」を使うと、元の値を保持したまま、配列の大きさを宣言し直すことができます。

配列を完全に初期化したい場合は、「Erase」を使うという感じです。

配列をうまく使うと、VBAを高速化することができますので、マスターしていきましょう。

では、配列の大きさを宣言する方法と初期化する方法について、解説していきます。

この記事で紹介すること

  • 配列の大きさを宣言する方法
  • 配列を初期化する方法
本記事の内容を動画でまとめています

こちらの記事も参考になります

  • 配列の宣言と初期化 ←こちらの記事
  • 配列の要素数と長さ
  • 配列の格納と貼り付け
  • 配列の削除
  • 配列のループと検索
  • 配列のソート
  • フィルタ結果を配列に格納
  • 配列を使って値の抽出を高速化

目次から見たい項目へ移動すると便利ですよ。

目次

  • VBAで配列の宣言(DimとReDim)
    • 1次元配列
    • 2次元配列
  • VBAで配列の大きさ変更
    • 配列の大きさを宣言し直す(ReDim)
    • 元の値を残して、配列の大きさを宣言し直す(Preserve)
    • 2次元配列で1次元目の要素数は変更できない
    • 次元数の変更はできない
  • VBAで配列を初期化する
    • 配列を初期化(Erase)
  • 配列の要素数が不明の場合
    • 入力する毎に配列を大きくする
    • 大きめの配列にして最後に縮小する
  • 2次元配列で1次元目の要素数を変更する
    • 配列を転置して要素数を拡張する
  • おわりに

VBAで配列の宣言(DimとReDim)

VBAで配列を宣言するには、「Dim」と「ReDim」を使います。

「Dim」で配列を宣言して、「ReDim」で配列の大きさを決定します。

配列でのポイントは、

  • 配列の次元数
  • 0番目スタートか、1番目がスタートか

というところです。

次元は、1次元配列や、2次元配列のように配列の次元を決めるものです。

配列は、0番目から始ったり、1番目から始ったりします。

それぞれの次元と、スタートする番号を変えて配列を宣言してみます。

1次元配列

1次元配列のイメージを見てみます。

例えば、0番目からスタートする配列は、次のようなイメージです。

0番目からスタート

VBAで、0番目から3番目までの1次元配列を宣言して、配列に値を入力するVBAコードです。

Sub TEST1() Dim A '1次元配列を宣言 ReDim A(3) '0番目スタート '配列に値を入力 A(0) = 1 A(1) = 2 A(2) = 3 A(3) = 4 End Sub

実行してみます。

0番目から3番目までの、1次元配列を作成できました。

1番目からスタート

続いて、1番目からスタートする配列は、次のようなイメージです。

VBAで、1番目から3番目までの1次元配列を宣言して、配列に値を入力するVBAコードです。

Sub TEST2() Dim A '1次元配列を宣言 ReDim A(1 To 3) '1番目スタート '配列に値を入力 A(1) = 1 A(2) = 2 A(3) = 3 End Sub

実行してみます。

1番目から3番目までの、1次元配列を作成できました。

こんな感じで、「Dim」で宣言して、「ReDim」で大きさを設定することができます。

1次元配列は、0番目からスタートする配列が一般的です。

2次元配列

つづいて、2次元配列を宣言してみます。

0行0列からスタート

0行、0列からスタートする2次元配列を設定してみます。

イメージはこちらです。

では、0行、0列から始まるする2次元配列を宣言します。

Sub TEST3() Dim A '2次元配列を宣言 ReDim A(2, 3) '0行0列スタート '配列に値を入力 A(0, 0) = 1 A(0, 1) = 2 A(0, 2) = 3 A(0, 3) = 4 A(1, 0) = 5 A(1, 1) = 6 A(1, 2) = 7 A(1, 3) = 8 A(2, 0) = 9 A(2, 1) = 10 A(2, 2) = 11 A(2, 3) = 12 End Sub

実行してみます。

0行0列から始まる2次元配列を、設定できました。

1行1列からスタート

次は、1行1列から始まる2次元配列を、宣言してみます。

イメージはこちらになります。

1行1列から始まる2次元配列を宣言して、値を入力するVBAコードです。

Sub TEST4() Dim A '2次元配列を宣言 ReDim A(1 To 2, 1 To 3) '1行1列スタート '配列に値を入力 A(1, 1) = 1 A(1, 2) = 2 A(1, 3) = 3 A(2, 1) = 4 A(2, 2) = 5 A(2, 3) = 6 End Sub

では、途中まで実行して、配列の中身を見てみます。

1行1列から始まる配列を宣言して、値を入力することができました。

セル範囲を指定して、セルの値を配列に格納した場合は、この1行1列から始まる配列になります。

今回は、わかりやすく値をVBAコードの中で入力していますけども、実際は、セルに入力された値を配列に入力して、配列を作成することの方が多いです。

VBAで配列の大きさ変更

配列の大きさを変更する方法について、解説します。

配列を保持しないで大きさを変更するだけなら、「ReDim」でできます。

値を保持して大きさを変更したい場合は、「ReDim Preserve」です。

それぞれ解説していきます。

配列の大きさを宣言し直す(ReDim)

配列の大きさを宣言し直す方法です。

一度宣言した配列を、再度、宣言し直して配列を初期化します。

0番目から3番目までの配列を、0番目から4番目までの配列に、宣言し直すVBAコードです。

Sub TEST5() '1次元配列を作成 Dim A ReDim A(3) A(0) = 1 A(1) = 2 A(2) = 3 A(3) = 4 '配列を再宣言 ReDim A(4) '←ここ End Sub

これは簡単で、もう一度「ReDim」を使って、配列の大きさを宣言するだけです。

宣言し直す前です。

宣言し直す前の配列

0~3番目までの配列です。値が入力されています。

宣言し直した後です。

宣言し直した後の配列

0~4番目までの配列になりました。

値は初期化されて、すべて「Empty」になりました。

何回でも宣言し直すことができます

ちなみに何回でも、配列の大きさを宣言し直すことができます。

こんな感じです。

Sub TEST6() '配列を作成 Dim A ReDim A(3) A(0) = 1 A(1) = 2 A(2) = 3 A(3) = 4 '配列を再宣言 ReDim A(4) '←ここ ReDim A(5) '←ここ ReDim A(6) '←ここ End Sub

実行してみます。

0~6番目までの配列になりました。

配列の値は、もちろん初期化されています。

元の値を残して、配列の大きさを宣言し直す(Preserve)

次は、元の値を残して、配列の大きさを変更する方法です。

「Preserve」を使います。

0~3番目までの配列を、値は残したまま、0~4番目までの配列に、宣言し直すVBAコードです。

Sub TEST7() '配列を作成 Dim A ReDim A(3) A(0) = 1 A(1) = 2 A(2) = 3 A(3) = 4 '値を保持して、配列を再宣言 ReDim Preserve A(4) '←ここ End Sub

配列の大きさを宣言し直す際に、「ReDim Preserve」を使うところがポイントです。

配列の大きさを、宣言し直す前の配列です。

宣言し直す前の配列

0~3番目までの配列に、値が入力されています。

では、値を残したまま、配列の大きさを宣言し直してみます。

元の値を保持して、宣言し直した後の配列

配列の大きさが、0~4番目までとなりました。

元の値は、入力されたままです。

元の値を保持したまま、配列の大きさを変更したい場合に使えます。

何回でも宣言し直すことができます

ちなみに、「ReDim Preserve」も何回でも使うことができます。

こんな感じです。

Sub TEST8() '配列を作成 Dim A ReDim A(3) A(0) = 1 A(1) = 2 A(2) = 3 A(3) = 4 '値を保持して配列を再宣言 ReDim Preserve A(4) '←ここ ReDim Preserve A(5) '←ここ ReDim Preserve A(6) '←ここ End Sub

実行してみます。

結果は、0~6番目までの配列になりました。

元の値は、残ったままです。

必要な配列の大きさがわからない場合に使えます。

例えば、とりあえず大きめの配列を用意して、最後に必要な配列のサイズに「ReDim Preserve」で配列の大きさを宣言し直すという感じです。

2次元配列で1次元目の要素数は変更できない

2次元配列の場合は、1次元目の要素数は変更できないです。

ちょっとやってみます。

Sub TEST9() '配列を作成 Dim A ReDim A(1, 3) A(0, 0) = 1 A(0, 1) = 2 A(0, 2) = 3 A(0, 3) = 4 A(1, 0) = 5 A(1, 1) = 6 A(1, 2) = 7 A(1, 3) = 8 '値を保持して、1次元の変更はできない ReDim Preserve A(2, 3) '←これはエラーとなる End Sub

実行するとエラーとなります。

こんな感じで、2次元配列では、内側の1次元目の要素数は変更できないです。

2次元目の要素数であれば、変更することができます。

2次元配列の2次元目の要素数を変更するVBAコードです。

Sub TEST10() '配列を作成 Dim A ReDim A(1, 3) A(0, 0) = 1 A(0, 1) = 2 A(0, 2) = 3 A(0, 3) = 4 A(1, 0) = 5 A(1, 1) = 6 A(1, 2) = 7 A(1, 3) = 8 '値を保持して、2次元の変更はできる ReDim Preserve A(1, 4) End Sub

実行までの配列です。

では、実行してみます。

2次元配列の2次元目の要素数を変更できました。

次元数の変更はできない

「Preserve」では、「次元数」は変更できません。

例えば、1次元配列を、値を保持したまま、2次元配列に宣言し直すというのは、できません。

1次元配列を、「ReDim Preserve」で2次元配列に宣言し直すVBAコードです。

Sub TEST11() '配列を作成 Dim A ReDim A(3) A(0) = 1 A(1) = 2 A(2) = 3 A(3) = 4 '値を保持して、1→2次元配列に再宣言 ReDim Preserve A(3, 2) '←これはエラーとなる End Sub

実行してみます。

結果は、エラーとなりました。

値を残して配列を宣言し直す場合は、次元数は同じにしましょう。

VBAで配列を初期化する

配列を初期化(Erase)

配列を初期化する方法です。「Erase」を使います。

一度宣言した配列を、まっさらな状態にすることができます。

配列を初期化するVBAコードです。

Sub TEST12() '配列を作成する Dim A ReDim A(3) A(0) = 1 A(1) = 2 A(2) = 3 A(3) = 4 '配列を初期化 Erase A End Sub

初期化する前の配列です。

初期化前の配列

では、初期化してみます。

初期化後の配列

配列の値や大きさもすべて初期化されました。

完全に配列を初期化したい場合に使えます。

配列の要素数が不明の場合

配列の要素数が不明の場合で、要素数を設定する方法は2パターンあります。

  • 入力する毎に配列を大きくする
  • 大きめの配列にして最後に縮小する

という感じです。

VBAを高速化したい場合は、「大きめの配列にして最後に縮小する」方法がおススメです。

入力する毎に「ReDim Preserve」を使うと、少し処理が遅くなってしまいます。

では、それぞれの方法を解説していきます。

入力する毎に配列を大きくする

配列の要素数がわからない場合に、入力する毎に配列を大きくして配列の要素数を設定するVBAコードになります。

Sub TEST13() Dim A '配列を作成 ReDim A(1 To 1) For i = 1 To 10 '配列の要素数を拡張する ReDim Preserve A(1 To i) A(i) = i Next End Sub

では、ポイント毎に実行してみます。

ループ毎に配列を拡張

最初は、1行の配列に値を入力します。

次に入力するときは、配列を1行だけ拡張して、値を入力します。

さらに、入力する際に1行だけ拡張して、値を入力します。

これを繰り替えしていくと、値を入力する分だけ配列を拡張することができます。

10行だけ拡張して配列を作成できた

最終値までループして、配列を拡張して、値を入力できました。

大きめの配列にして最後に縮小する

次は、大きめの配列を作成しておいて、最後に縮小する方法です。

Sub TEST14() Dim A '大きめの配列を作成 ReDim A(1 To 100) k = 0 For i = 1 To 10 k = k + 1 '最大値を保存する A(i) = i Next '最大値分に、要素数を縮小する ReDim Preserve A(1 To k) End Sub

では、ポイント毎に実行してみます。

実行してみる

まずは、大きめの空の配列を作成します。

100行分の配列を作成しました。

適当な値を配列に値を入力しながら、「最大行」を取得します。

今回の場合は、最大行は「10行」となります。

最後に、最大行に配列の大きさを縮小して、不要な行を削除します。

値に合わせて配列の大きさを変更できた

大きめの配列を作成して、最後に縮小する方法で、配列の大きさを設定できました。

2次元配列で1次元目の要素数を変更する

2次元配列で、値を残したまま、1次元目の要素数を変更してみます。

配列を転置して要素数を拡張する

やりたい内容は、2次元配列で、値を残したまま、1次元目を拡張したい、ということになります。

2次元配列で、1次元目を拡張したい

「ReDim Preserve」では、一番右側の次元のみを拡張することができます。

なので、内側の次元を拡張したい場合は、配列を「転置」することで、内側の次元を拡張することができます。

転置を使って、内側の次元を拡張するVBAコードになります。

Sub TEST15() Dim A ReDim A(1 To 2, 1 To 3) '適当に配列を入力 k = 0 For i = 1 To 2 For j = 1 To 3 k = k + 1 A(i, j) = k Next Next '転置する A = WorksheetFunction.Transpose(A) '元の行を拡張する ReDim Preserve A(1 To UBound(A, 1), 1 To 3) '転置して戻す A = WorksheetFunction.Transpose(A) End Sub

では、ポイント毎に実行してみます。

転置して1次元目を拡張する

配列を作成して値を入力したら、行列を「.Transpose」を使って転置します。

配列を転置したら、「ReDim Preserve」で、2次元目を拡張します。

2次元目を拡張したら、再度、行列を転置します。

これで、1次元目を拡張することができます。

2次元配列で、1次元目を拡張できた

2次元配列で、値を残したまま、1次元目を拡張できました。

おわりに

この記事では、1次元配列や2次元配列の宣言と初期化について、ご紹介しました。

配列の大きさを宣言したい場合は、「ReDim」を使います。

「ReDim Preserve」を使うと、元の値を保持したまま、配列の大きさを宣言し直すことができます。

配列を完全に初期化したい場合は、「Erase」を使うという感じです。

配列をうまく使うと、VBAを高速化することができますので、マスターしていきましょう。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

  • 配列の宣言と初期化 ←こちらの記事
  • 配列の要素数と長さ
  • 配列の格納と貼り付け
  • 配列の削除
  • 配列のループと検索
  • 配列のソート
  • フィルタ結果を配列に格納
  • 配列を使って値の抽出を高速化
📎📎📎📎📎📎📎📎📎📎