大体でIT
大体でIT
2021/1/7
Excel VBAで、1次元配列や2次元配列を宣言する方法と、初期化する方法について、ご紹介します。配列の次元や大きさを宣言するのは、「ReDim」を使います。配列を初期化する方法としては、「ReDim」、「ReDim Preserve」、「Erase」があります。配列を使えば、VBAを高速化することができますので、配列をマスターしていきましょう。
この記事では、1次元配列や2次元配列の宣言と初期化について、ご紹介します。
配列の大きさを宣言したい場合は、「ReDim」を使います。
「ReDim Preserve」を使うと、元の値を保持したまま、配列の大きさを宣言し直すことができます。
配列を完全に初期化したい場合は、「Erase」を使うという感じです。
配列をうまく使うと、VBAを高速化することができますので、マスターしていきましょう。
では、配列の大きさを宣言する方法と初期化する方法について、解説していきます。
VBAで配列を宣言するには、「Dim」と「ReDim」を使います。
「Dim」で配列を宣言して、「ReDim」で配列の大きさを決定します。
配列の次元数
0番目スタートか、1番目がスタートか
次元は、1次元配列や、2次元配列のように配列の次元を決めるものです。
配列は、0番目から始ったり、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番目からスタートする配列が一般的です。
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
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コードの中で入力していますけども、実際は、セルに入力された値を配列に入力して、配列を作成することの方が多いです。
配列を保持しないで大きさを変更するだけなら、「ReDim」でできます。
値を保持して大きさを変更したい場合は、「ReDim Preserve」です。
一度宣言した配列を、再度、宣言し直して配列を初期化します。
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」を使って、配列の大きさを宣言するだけです。
宣言し直す前の配列
宣言し直した後の配列
値は初期化されて、すべて「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
元の値を残して、配列の大きさを宣言し直す(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」を使うところがポイントです。
宣言し直す前の配列
では、値を残したまま、配列の大きさを宣言し直してみます。
元の値を保持して、宣言し直した後の配列
元の値を保持したまま、配列の大きさを変更したい場合に使えます。
何回でも宣言し直すことができます
ちなみに、「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
例えば、とりあえず大きめの配列を用意して、最後に必要な配列のサイズに「ReDim Preserve」で配列の大きさを宣言し直すという感じです。
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
「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
値を残して配列を宣言し直す場合は、次元数は同じにしましょう。
配列を初期化する方法です。「Erase」を使います。
一度宣言した配列を、まっさらな状態にすることができます。
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行だけ拡張して、値を入力します。
これを繰り替えしていくと、値を入力する分だけ配列を拡張することができます。
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
実行してみる
適当な値を配列に値を入力しながら、「最大行」を取得します。
最後に、最大行に配列の大きさを縮小して、不要な行を削除します。
値に合わせて配列の大きさを変更できた
大きめの配列を作成して、最後に縮小する方法で、配列の大きさを設定できました。
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次元目を拡張できました。
この記事では、1次元配列や2次元配列の宣言と初期化について、ご紹介しました。
配列の大きさを宣言したい場合は、「ReDim」を使います。
「ReDim Preserve」を使うと、元の値を保持したまま、配列の大きさを宣言し直すことができます。
配列を完全に初期化したい場合は、「Erase」を使うという感じです。
配列をうまく使うと、VBAを高速化することができますので、マスターしていきましょう。
参考になればと思います。最後までご覧くださいまして、ありがとうございました。