【VBA】1次元や2次元配列の宣言と初期化【ReDim、Preserve、Eraseを使う】
大体でIT 大体でIT2021/1/7
【VBA】1次元や2次元配列の宣言と初期化【ReDim、Preserve、Eraseを使う】 Excel VBAExcel 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を高速化することができますので、マスターしていきましょう。
参考になればと思います。最後までご覧くださいまして、ありがとうございました。
関連する記事から探す
- 配列の宣言と初期化 ←こちらの記事
- 配列の要素数と長さ
- 配列の格納と貼り付け
- 配列の削除
- 配列のループと検索
- 配列のソート
- フィルタ結果を配列に格納
- 配列を使って値の抽出を高速化