同じ種類のデータを大量に扱う時、配列を利用するととても便利です。
一方で、扱う値の数が増える分、通常の変数に比べて処理は複雑になります。
そこで今回は、配列の基礎的な使い方から応用的な方法まで詳しく解説していきますので、配列についてまだよく分からない……という方はぜひ参考にしてみてください!
配列とは?
複数ある同じデータ型の値を一つの塊として扱ったものを配列(Array)といいます。
配列内にあるデータの1つ1つは要素と呼ばれ、割り振られたインデックス番号(添字)を指定することでそのデータにアクセスすることができます。
配列には2つの形式があり、あらかじめ要素数や次元数が決められているものを静的(固定長)配列、数の増減が可能なものを動的(可変長)配列といいます。
配列の宣言・初期化・再定義
配列の使い方について、詳しく見ていきましょう。
まず、配列を宣言する方法についてですが、静的配列か動的配列かで書き方が少し異なります。
静的配列の場合は以下のように宣言します。
【基本構文】
Dim 配列名(最大インデックス番号) As データ型
配列のインデックス番号は0から数えていくので、例えば3を指定した場合、配列内に入る要素数は4つになります。最大インデックス番号には、必要な要素数から-1した数を指定しましょう。
動的配列の場合は、括弧内の数を指定せずに宣言します。
【基本構文】
Dim 配列名() As データ型
配列の初期化
初期化の方法はいくつかあります。
まず、任意の値を初期値として入れたい場合は、次のように各要素にアクセスして値を代入します。
【サンプルコード】
Dim arr(2) As String
arr(0) = "A"
arr(1) = "B"
arr(2) = "C"
動的配列の場合は、後ほど説明するRedimステートメントを使用して、事前に要素数を決める必要があるので注意してください。
また、Variant型の動的配列のみに限られますが、Array関数を使って一括で設定することも可能です。
【サンプルコード】
Dim arr2() As Variant
arr2 = Array(1, 2, 3)
代入した値をリセットして初期化させたい場合は、次のようにEraseステートメントを使います。
【基本構文】
Erase 配列名
動的配列の場合は設定した要素数と値が全てクリアされ、静的配列の場合はデータ型に合わせてそれぞれ以下の初期値で全要素が設定されます。
- 数値配列:0
- 文字列配列:長さ0の文字列
- オブジェクト配列:Nothing
- バリアント配列:Empty
配列の再定義
動的配列の場合には、ReDimステートメントを使って要素数やデータ型を再定義することができます。
【基本構文】
ReDim 配列名(最大インデックス番号) As データ型
ただし、再定義する前に変更した値は初期化されるので注意が必要です。
また、データ型の変更が可能なのは、変更元の配列がVariant型の場合のみになります。
Eraseステートメントで配列のメモリを解放する
先ほど、初期化の方法として紹介したEraseステートメントですが、動的配列の場合にはメモリ解放の方法としても使えます。
また、配列がVariant型の場合、次のように空の配列を代入することでも同様の結果が得られます。
【サンプルコード】
Dim sample() As Variant
sample = Array()
多次元配列の宣言・定義
2次元以上の配列を宣言する場合は、次のように「,」(カンマ)で区切って、次元ごとの要素数を定義します。
【基本構文】
Dim 配列名(上限値1, 上限値2, ...) As データ型
セル・配列間で要素の値を共有する方法
次に、シート上のセルとVBAの配列間で要素の値を共有する方法について解説していきます。
まずは、セルの値を配列に代入する方法について、以下のサンプルコードで見てみましょう。
【サンプルコード】
Sub sampleArray1()
Dim arr As Variant
Dim msg As String
arr = Range("A1:B3")
msg = arr(1, 1) & "," & arr(1, 2) & vbCrLf _
& arr(2, 1) & "," & arr(2, 2) & vbCrLf _
& arr(3, 1) & "," & arr(3, 2) & vbCrLf
MsgBox msg
End Sub
【実行結果】
セルと配列間で値を共有する場合、要素数はそれぞれ
「一次元目=行数(1、2、…)」「二次元目=列数(A、B、…)」
となります。
また、セルの値を変数に代入した場合、配列のインデックス番号は0からではなく1からの開始になるので注意が必要です。
要素の値をセルに格納する方法を解説
今度は反対に、配列の要素をセルに一括で格納する方法を以下のコードで見ていきましょう。
【サンプルコード】
Sub sampleArray2()
Dim arr(3, 2) As Variant
Dim line As Integer, row As Integer
For line = 0 To 2
For row = 0 To 3
arr(row, line) = row + 1 + 10 * line
Next row
Next line
Range("A1:B3") = arr
End Sub
【実行結果】
配列の要素をセルに格納する場合は、インデックス番号は0からの開始で問題ありません。ただし、同じ配列にセルの値を入れ直した場合には、先ほどと同じく1からの開始に変わります。
Uboundで配列の要素数を取得する方法
配列を扱う際、要素数を知りたいケースもあるかと思いますが、VBAには取得するための関数がありません。
代わりに、インデックス番号の最大値を取得するUBound関数を使用して計算を行います。
【基本構文】
要素数 = UBound関数 + 1
開始番号が0以外のケースがある場合は、LBound関数を使うなどして最小値分を引くといいでしょう。
ループで配列を操作する方法を解説
配列の各要素を操作する場合、ループを使うと効率が上がります。
以下でその方法について解説していきます。
Forループで配列を操作する
まずは、For Nextステートメントを使う方法です。以下のように記述して、各要素にアクセスします。
【基本構文】
For 変数名 = インデックス最小値 To インデックス最大値
'arr(変数名)で順に要素にアクセス
Next 変数名
ForEachループで配列を操作する
For Eachステートメントを使うと、要素数分だけループをしてくれるので、より手短に記述することができます。
【基本構文】
For Each 変数名 In 配列名
'変数に要素の値が入るので、変数を使って処理
Next 変数名
配列をコピーする方法を解説
配列を別の変数にコピーする場合は、動的配列に代入することで設定が可能です。
Variant型であれば、通常の変数に代入することもできます。
【サンプルコード】
Sub sampleCopy()
Dim arr1() As Variant, arr2 As Variant
arr1 = Array("りんご", "みかん", "ぶどう")
arr2 = arr1
Dim msg As String
For Each st In arr2
msg = msg & st & " "
Next st
MsgBox msg
End Sub
【実行結果】
配列をソートする方法を解説
VBAの場合、配列そのものをソートする機能はありません。
VBA上で完結させる場合はループを利用して並べ替える必要がありますが、そのぶんコードも複雑になります。
そのため、一旦配列の要素をセルに移し、Sortメソッドを使って並べ替えを行ってから、セルの内容を再度配列に代入し直す方法がおすすめです。
【Sortメソッドの構文例】
Range("範囲").Sort Key1:=Range("キー"), Order1:=xlAscending
Key1はソートの基準となる列、Order1は並び替えの順序(昇順や降順)を指定します。
配列の要素を検索する方法を解説
配列の中から、指定した条件に一致する要素を検索したい場合には、Filter関数を使います。
Filter関数の基本構文は以下の通りです。
【基本構文】
Filter(sourcearray,match[,include[,compare]])
includeは、指定した文字列を含む要素を検索するか否かを指定します。含む場合はTrue、含まない場合はFalseです。
compareは、文字列を比較するモードを指定します。「vbBinaryCompare」を指定した場合は大文字と小文字を区別して検索し、「vbTextCompare」を指定した場合は区別せずに検索をします。
[ ]内の2つは省略可能です。
以下のサンプルコードで、実際の動きを確認してみましょう。
【サンプルコード】
Sub sampleFilter()
Dim arr() As Variant, fArray As Variant
arr = Array("Windows10", "windows11", "macOS", "WindowsXP")
fArray = Filter(arr, "Windows")
Dim msg As String
For Each st In fArray
msg = msg & st & " "
Next st
MsgBox msg
End Sub
【実行結果】
includeは省略するとデフォルトでTrueとなり、compareの場合はvbBinaryCompareがデフォルトの指定となります。
配列の要素を追加・削除する方法を解説
続いて、配列の要素を追加・削除する方法について解説します。
配列の要素を追加する方法は?
要素の数を増やしたい場合は、先ほども紹介したReDimステートメントを使います。
ただし、ReDimを使用すると既に設定した要素の値が削除されてしまうので、値を保持したまま配列の要素数だけを変更したい場合には、ReDim Preserveステートメントを使います。
【基本構文】
ReDim Preserve 配列名(最大インデックス番号)
配列の要素を削除する方法は?
要素を削除する場合ですが、残念ながら、VBAには配列の一部を削除する機能は存在しません。
代わりに、ReDim Preserveを応用して削除する方法を紹介していきます。
【サンプルコード】
Sub sampleRemove()
Dim arr() As Variant
arr = Array(0, 1, 2, 3, 4)
'3番目の要素を削除
For i = 2 To UBound(arr) - 1
arr(i) = arr(i + 1)
Next i
ReDim Preserve arr(UBound(arr) - 1)
Dim msg As String
For Each st In arr
msg = msg & st & " "
Next st
MsgBox msg
End Sub
【実行結果】
ポイントは、削除したい要素からループを開始して、1つ隣の値を削除したい要素に上書きしていることです。
ReDim Preserveで要素数を減らすと同時に最後の値も削除されるので、事前に値の位置を前にずらすことによって、必要な値だけを配列に残すことができます。
配列の要素を結合する方法を解説
配列内の値や、別々の配列同士を結合したいケースもあるかと思います。
それぞれの方法について見ていきましょう。
1つの配列の要素を結合する方法は?
配列内の要素同士を結合する場合は、Join関数を使うと便利です。
Join関数は、指定した配列内の要素全てを順に結合した文字列を返します。
【基本構文】
Join(配列名、 [区切り文字])
区切り文字を指定すると、要素同士の間をその文字列で区切って結合します。省略した場合は半角スペースが間に入ります。
JoinとSplitで配列を連結する方法を解説
別々の配列を1つに連結する関数はVBAには用意されていないので、代わりにSplit関数とJoin関数を組み合わせて使う方法を紹介します。
まず初めに、Join関数を使って、それぞれの配列内の要素を結合します。
結合が完了したら、出来上がった文字列同士を「&」記号を使ってさらに結合し、一つの文字列にまとめましょう。その際、関数で指定した区切り文字を、それぞれの文字列の間に挟むのがポイントです。
次に、結合した文字列をSplit関数で分割して、配列の各要素に格納します。これにより、複数の配列を1つに連結させることができます。
実際の流れをサンプルコードで確認してみましょう。
【サンプルコード】
Sub sampleJoinSplit()
Dim arr1() As Variant, arr2() As Variant, arr3 As Variant
arr1 = Array(1, 2)
arr2 = Array(3, 4, 5)
arr3 = Split(Join(arr1) & " " & Join(arr2))
Dim msg As String
For Each st In arr3
msg = msg & st & ", "
Next st
MsgBox msg
End Sub
【実行結果】
配列同士を比較する方法を解説
配列同士を比較する際、ループを使って要素ごとに比較を行う方法がありますが、処理が複雑になりがちです。
同一か否かだけを判断したい場合は、Join関数を使って要素を結合した文字列を比較すると簡潔に記述できます。
【サンプルコード】
Sub sampleCompare()
Dim arr1() As Variant, arr2() As Variant
arr1 = Array("11", "21", "322", "27", "43")
arr2 = Array("11", "21", "321", "27", "43")
If Join(arr1) = Join(arr2) Then
MsgBox "同じ配列です"
Else
MsgBox "違う配列です"
End If
End Sub
【実行結果】
定数で配列を宣言する方法を解説
VBAでは、配列を定数として宣言しようとするとエラーが発生してしまいます。
そこで、厳密な定数とはいきませんが、定数の文字列を分割して配列へ格納する方法を紹介します。
【サンプルコード】
Const str As String = "1,2,3,4,5"
Sub sampleConst()
Dim arr As Variant
arr = Split(str, ",")
Dim msg As String
For Each st In arr
msg = msg & st & " "
Next st
MsgBox msg
End Sub
【実行結果】
配列を関数の引数に指定する方法は?
配列を関数の引数に指定する場合には、引数名の後に括弧を付けます。
【基本構文】
Sub プロシージャ名( 配列名() As データ型)
戻り値に配列を指定する場合には、戻り値のデータ型の後に括弧を付けます。
【基本構文】
Function プロシージャ名( 配列名() As データ型) As データ型()
まとめ
いかがでしたでしょうか?
配列は、様々な場面に応用して使うことができる便利な機能です。初めのうちは慣れないかもしれませんが、マスターできるように頑張ってくださいね!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。