大量のデータを格納して扱う時、配列という機能を利用すると便利に処理することができます。
特に、あとからデータを追加したい場合には動的配列と呼ばれる機能を使うことで、他のデータに影響を与えることなくスムーズにデータを追加することができます。
そこで今回は、VBAでも使用するケースの多い動的配列について、基礎的な使い方から応用的な方法まで詳しく解説していきたいと思います。
配列についてまだよく分からない……という方はぜひ参考にしてみてください!
動的配列とは?静的配列との違いは?
プログラミング全般において、複数の値を一つの塊として扱うことを配列と言います。配列内にあるデータの1つ1つは要素と呼ばれ、それぞれに割り振られたインデックス番号(添字)を指定することで、対応するデータにアクセスすることができます。
動的配列とは、配列の中でも格納できる要素の数が増減可能なもののことを指します。反対に、変数として宣言する際にあらかじめ要素数が決められていて、後から変更することができないものを静的配列と言います。
VBAでの配列の使い方についてはこちらでも詳しく解説しています!
VBAで動的配列を使うには
変数の宣言や初期化、値の代入など、VBAで動的配列を使う方法について解説していきます。
順に詳しく見ていきましょう。
動的配列を宣言する
まずは、動的配列を宣言する方法について紹介します。
基本的な構文は以下の通りとなります。
【基本構文】
Dim 配列名() As データ型
変数を宣言した段階では、配列内の要素数は未確定でメモリが確保されていない状態のため、配列に値を代入することはできません。宣言した配列を扱うには、後ほど紹介する方法で初期化を行う必要があります。
また、以下のように変数の宣言時に最大インデックス番号を指定することで、宣言と同時に要素数を確定することもできますが、その場合は静的配列となり数の増減は行えなくなるので注意が必要です。
【静的配列の場合の構文】
Dim 配列名(最大インデックス番号) As データ型
例外はありますが、基本的に配列のインデックス番号は0から順に数えていきます。そのため、例えば最大数に3を指定した場合、配列内に入る要素数は3つではなく合計4つとなります。
配列の要素数を指定する際は、必要な数から1を引いた数を指定するようにしましょう。
動的配列を初期化する
動的配列を初期化する方法はいくつかあります。
1つは、Redimステートメントを使用して初期化する方法です。Redimを使用する際の基本構文は以下の通りになります。
【基本構文】
Redim 配列名(最大インデックス番号)
初期化を行うことで、初めて動的配列の要素数が確定します。後ほど詳しく解説を行いますが、途中で要素数の増減を行いたい場合にもRedimステートメントを使用します。
また、Variant型の動的配列のみに限られますが、Array関数を使って要素数と初期値を同時に設定することも可能です。
【サンプルコード】
Dim arr() As Variant
arr = Array(1, 2, 3)
関数の戻り値がVariant型のため、変数の宣言時に他の型を指定するとエラーが発生してしまうので、注意が必要です。
変数を宣言する際は、Variant型を指定する場合に限り、括弧を付けずに変数名のみで宣言することもできます。
【サンプルコード】
Dim arr As Variant
arr = Array(1, 2, 3)
その他、格納したデータや要素数を全てクリアしたい場合は、Eraseステートメントを使用して配列をリセットすることができます。
【基本構文】
Erase 変数名
Eraseステートメントでリセットした場合、要素数に応じて確保したメモリが全て解放されるため、配列に再度アクセスする場合は初期化を改めて行う必要があります。
動的配列の要素に値を代入する
続いて、動的配列の要素に値を代入する方法について解説します。
配列にデータを格納する際は、値を入れたい要素のインデックス番号を指定して代入します。
【サンプルコード】
Sub sampleArray()
Dim arr() As String
ReDim arr(2)
arr(0) = "サンプル1"
arr(1) = "サンプル2"
arr(2) = "サンプル3"
MsgBox "インデックス0番:" & arr(0) & vbCrLf & _
"インデックス1番:" & arr(1) & vbCrLf & _
"インデックス2番:" & arr(2)
End Sub
【実行結果】
動的配列に後から要素を追加する
冒頭でも解説しましたが、動的配列は要素数を後から変更することができます。
初期化時に指定した数以上の要素を追加したい場合は、Redimで再度要素数を宣言します。
【サンプルコード】
Sub sampleRedim()
Dim arr() As String
ReDim arr(2)
Dim countBefore As Integer
For Each arrVal In arr
countBefore = countBefore + 1
Next arrVal
ReDim arr(3)
Dim countAfter As Integer
For Each arrVal In arr
countAfter = countAfter + 1
Next arrVal
MsgBox "追加前の要素数:" & countBefore & vbCrLf & _
"追加後の要素数:" & countAfter
End Sub
【実行結果】
Redimステートメントを再度使用したことにより、要素数が変更されたのが分かると思います。
このように、Redimを使って要素を追加したり、あるいは減らすことができますが、使用する上で気を付けなければいけない点があります。
Redimステートメントは、要素数を変更する際に格納していたデータをクリアしてしまいます。そのため、元のデータを残しつつ要素を追加したい場合には、以下のようにPreserveを付ける必要があります。
【基本構文】
Redim Preserve 配列名(最大インデックス番号)
Preserveがある場合と無い場合の違いについて、以下のサンプルコードで見てみましょう。
【サンプルコード】
Sub samplePreserve()
Dim arr() As Variant
Dim rdmVal As Variant, rdmPreVal As Variant
arr = Array(1, 2, 3)
ReDim arr(2)
rdmVal = arr(0)
arr = Array(1, 2, 3)
ReDim Preserve arr(2)
rdmPreVal = arr(0)
MsgBox "ReDim:" & rdmVal & vbCrLf & _
"ReDim Preserve:" & rdmPreVal
End Sub
【実行結果】
Preserveをつけたケースのみ、元の値が残されたままになっています。
ただし、変更後の要素数が元の数よりも少ない場合は、減った要素の数だけ後ろから順にデータが消えるので、注意が必要です。
【応用】要素数に関わらず要素を追加する
必要な要素数が事前に分からないために、動的配列を採用するケースはよくあると思います。また、処理の内容に合わせて要素数を可変させることもあり得るでしょう。
例えば、配列の要素数に応じて何かの処理を行う場合、こうしたケースでは数値を事前に固定させることができないため、自動で要素数を取得できるように記述する必要があります。ですが、要素数そのものを取得するための機能は、残念ながらVBAには用意されていません。
要素数を自動で取得したい場合は、代わりにUBOUND関数を使用する方法があります。この関数は、配列の最大インデックス番号を取得することができる関数で、戻り値を元に要素数を計算することができます。
【UBOUNDの使用例】
要素数 = UBound(配列名) + 1
上記の式は、インデックス番号の開始数値が0の場合の計算式です。例外はもちろんありますが、基本的にはこれで要素数を取得することができるようになります。
【サンプルコード】
Sub sampleUBound()
Dim arr() As Variant
Dim msg As String
arr = Array(1,2,3)
msg = "配列の要素数:" & UBound(arr) + 1 & vbCrLf
ReDim arr(UBound(arr) + 2)
msg = msg + "変更後の要素数:" & UBound(arr) + 1
MsgBox msg
End Sub
【実行結果】
このサンプルコードでは、主に2つの目的でUBound関数を使用しています。
1つ目は、配列の要素数を取得するためです。宣言した配列のインデックス番号は0から始まるため、先ほどの例と同じようにUBound関数の戻り値に1を足して、要素数を取得しています。
2つ目は、Redimで要素数を追加する際に、指定するインデックス番号を自動で計算するためです。UBound関数を使用することで、変更前の要素数を元に数値を可変させることができるため、元の数を意識することなく要素を追加することができます。
このように、UBound関数と組み合わせて数値を計算することで、様々なケースに応用させることができます。
まとめ
今回は、動的配列について解説をしてきました。
通常の変数より処理が複雑な分、慣れるまでに少々時間がかかるかもしれませんが、マスターできるようにぜひ頑張ってみてくださいね!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Rangeでセルを範囲選択する方法を解説
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。