こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。
皆さんは、VBAで配列を使ったことがありますか?
データをひとまとめにして使いたい場合に、配列はよく使います。
なかでも、動的配列の使い方を覚えておくと応用的なコードが書けるのでおすすめです!
そこで今回は、
・配列とは
・静的配列・動的配列の違いとは
といった基礎的なことから、
・VBAで動的配列を書く方法
・要素数を意識せずに配列の要素を追加する方法
・その他おすすめな配列操作方法
といった応用的な方法まで、徹底的に解説します!
配列とは
最初に、配列について簡単に解説します。
配列とは、「一度に複数の値を格納することができる変数」のことです。
配列内のひとつひとつのデータは、要素と言います。
要素には添字を指定することで、データにアクセスすることができます。
言葉だけではわかりづらいので、簡単なサンプルを用意しました。
サンプルコード:
Dim strMessage(3) as String strMessage(1) = "要素1" strMessage(2) = "要素2" strMessage(3) = "要素3"
この例では、「strMessage」が配列になっており「strMessage(3)」と指定することで、要素が3つの配列を宣言しています。
「strMessage(1)」「strMessage(2)」「strMessage(3)」のようにそれぞれアクセスすることで、値の出し入れをすることができます。
このように、まとめてデータを保存しておきたいときに使えるのが配列です。
静的配列・動的配列の違いとは
配列には、静的配列と動的配列の2種類があります。
2つの違いは、次の通りです。
- 静的配列:宣言時に要素数を指定
- 動的配列:後で要素数を指定
こちらも言葉だけではわかりにくいので、サンプルコードを用意しました。
サンプルコード:
Sub Test() '静的配列 Dim strMessage(3) as String strMessage(1) = "要素1" strMessage(1) = "要素2" strMessage(1) = "要素3" '動的配列 Dim intNum() as Integer Redim intNum(2) intNum(1) = 1 intNum(2) = 5 End Sub
変数宣言時に、「Dim strMessage(3) as String」のように要素を指定しているのが静的配列で、「Dim intNum() as Integer」のように要素の指定がないのが動的配列です。
動的配列の場合は、「Redim intNum(2)」のように配列の要素数を後から指定して使うことができます。
静的配列で宣言してしまった場合は、後から要素数の変更ができないので、動的配列の使い方を覚えておくのがおすすめです!
VBAで動的配列を書く方法とは
次に、動的配列の使い方について詳しく解説します。
動的配列の変数宣言方法
はじめに、動的配列の変数を宣言する方法について解説します。
静的配列と動的配列の違いで説明した通り、変数宣言時は要素数なしで次のように宣言します。
Dim 配列の変数名() as 型
サンプルコード:
Sub Test() Dim intNum() As Integer End Sub
型にはInteger型、String型、Double型など通常の変数と同じように型を設定することができます。
変数名にカッコ()をつけるだけなので、覚えやすいですね。
動的配列の初期化方法
次に、動的配列の初期化方法について解説します。
配列を初期化するためには、Redimを使って次のように書きます。
使い方:
ReDim 配列の変数名(要素数)
サンプルコード:
Sub Test() Dim intNum() As Integer ReDim intNum(2) End Sub
要素数に1以上の数値を入れることで、配列の要素を作ることができます。
動的配列に値を入れる方法
次に、動的配列の要素に値を入れる方法について解説します。
値を入れる場合は、配列名(要素)を指定して値を入れます。
使い方:
配列名(要素数) = 値
サンプルコード:
Sub Test() Dim intNum() As Integer ReDim intNum(2) intNum(1) = 1 intNum(2) = 5 End Sub
動的配列に後から要素を追加する方法
次に、要素を後から追加する方法について解説します。
配列に値を入れた後に要素を追加したい場合は、Redimで再度要素数を宣言します。
使い方:
'最初に要素数を指定 ReDim 配列の変数名(要素数) '要素に値を入れる 配列名(要素1) = 値 配列名(要素2) = 値 '追加したい要素数を再度ReDimで指定 ReDim 配列の変数名(要素数)
サンプルコード:
Sub Test() Dim intNum() As Integer ReDim intNum(2) intNum(1) = 1 intNum(2) = 5 '要素数の変更 ReDim intNum(3) intNum(3) = 10 'データの確認 MsgBox "intnum(1):" & intNum(1) & vbCrLf & _ "intnum(2):" & intNum(2) & vbCrLf & _ "intnum(3):" & intNum(3) End Sub
実行結果:
ただし、1点注意点があります。
Redimで要素数を再設定すると、もともと入っていたデータをクリアして要素数を追加してしまいます。
そのため、実行結果のように、「intNum(1)」「intNum(2)」に入れた値が初期化されて0になるわけですね。
元のデータを残しつつ要素を追加したい場合は、Redimで要素数を増やすときにPreserveをつける必要があります。
Preserveを付けたサンプルコード:
Sub Test() Dim intNum() As Integer ReDim intNum(2) intNum(1) = 1 intNum(2) = 5 '要素数の変更 ReDim Preserve intNum(3) intNum(3) = 10 'データの確認 MsgBox "intNum(1):" & intNum(1) & vbCrLf & _ "intNum(2):" & intNum(2) & vbCrLf & _ "intNum(3):" & intNum(3) End Sub
実行結果:
要素を追加して初期化したい場合はRedimのみ、値を残しつつ要素を追加したい場合はPreserveをつけてReDimと覚えればOKです。
応用編:要素数を意識せずに要素を追加する方法
先ほどのようなシンプルな処理であれば、要素数を確認してReDimで要素を追加するのは簡単かもしれません。
ただ、配列の数が増えてくると、全ての配列の要素数を意識しながらコードを書いていくのは難しいため、要素数を意識せずに要素を追加する方法を覚えておくのがおすすめです!
UBOUND関数を使えば、簡単に配列の要素数を取得することができます。
使い方:
UBOUND(配列)
サンプルコード:
Sub Test4() Dim intNum() As Integer ReDim intNum(2) intNum(1) = 1 intNum(2) = 5 '要素数の確認 MsgBox "intNum()の要素数:" & UBound(intNum) End Sub
実行結果:
UBOUND関数で要素数を取得して、1足した数で要素数を追加すれば、要素数を意識せずに1つ要素を追加することができます。
要素数を意識せずに要素を追加するサンプルコード:
Sub Test5() Dim intNum() As Integer ReDim intNum(2) intNum(1) = 1 intNum(2) = 5 '要素数の確認 Dim lngEleCount As Long lngEleCount = UBound(intNum) '要素数の追加 Dim newEleCount As Long newEleCount = lngEleCount + 1 ReDim Preserve intNum(newEleCount) intNum(newEleCount) = 10 'データの確認 MsgBox "intNum(1):" & intNum(1) & vbCrLf & _ "intNum(2):" & intNum(2) & vbCrLf & _ "intNum(3):" & intNum(3) End Sub
実行結果:
補足:その他の配列操作について
ここまで配列、静的配列と動的配列の違い、動的配列の使い方について解説してきました。
配列はとても奥が深いため、他の記事でも使い方をまとめています。
配列の初期化、配列操作総まとめについて以下で詳しく解説しているので、合わせてみてみるのがおすすめです!
まとめ
今回は、VBAで動的配列を操作する方法について解説しました。
一度にまとめてデータを使いたい場合、動的配列を使うケースはよくあります。
今回解説した方法は使い方も簡単なので、ぜひ使ってみてくださいね!