【VBA入門】配列総まとめ(初期化、ループ操作、コピー、結合、比較)

配列って使ってますか?配列は同じ型のデータを大量に扱う場合に一つのかたまりとして扱うことができるので便利ですよね。

その一方で、1つの変数を扱う場合に比べて使い方が複雑になるのも事実です。VBAにおいても例外ではありません。

この記事では、配列について

  • 配列の宣言、初期化、再定義
  • セルと配列で要素の値を共有する方法
  • Uboundで配列の要素数を取得する方法
  • ループで配列の要素を操作する方法
  • 配列をコピーする方法
  • Sortで配列の要素をソートする方法
  • Filterで配列の要素を検索する方法
  • 要素を追加、削除する方法
  • 配列を結合する方法
  • 配列同士を比較する方法
  • 定数配列について
  • 配列を関数の引数に指定する方法


など基本的な内容から、応用的な使い方についても解説していきます。

今回は配列について、使い方をわかりやすく解説します。

配列の宣言、初期化、再定義

配列では同じデータ型の変数をたくさん扱う場合に、一つのかたまりとして扱うことができます。配列内のひとつひとつのデータを要素といいます。

それぞれの要素にはインデックス番号(添字)を指定することでアクセスすることができます。配列を宣言する際に、要素数と次元数が決まっている配列を固定長配列といいます。

これに対して、要素数と次元数が決まっていない配列を可変長配列動的配列といいます。

配列の宣言、定義

それでは配列を宣言、定義する方法についてみていきましょう。

固定長配列と可変長配列で宣言の方法が少々異なります。固定長変数は配列名のあとに「()」(カッコ)を使って下記のように宣言します。

可変長配列の場合は、宣言時には要素数や次元数は指定しません。

Arrayで初期化

配列を初期化する方法には主に2つの方法があります。

Eraseステートメントを使う方法とArray関数を使う方法です。Eraseステートメントの引数には初期化する配列名を指定します。

それぞれのデータ型によって初期値が違います。

  • 数値配列:0(ゼロ)
  • 文字列配列:長さ0(ゼロ)の文字列
  • オブジェクト配列:Nothing
  • バリアント配列:Empty

それぞれの初期値で全要素が設定されます。Array関数を使う場合は要素の値を別々に指定することができます。

ただし、可変長配列でデータ型はバリアント型に限ります。

ReDimで再定義

ReDimステートメントを使って要素数などを再設定したり、再初期化することができます。

ReDimステートメントを使って配列の要素数などを変更した場合、元のデータはすべて消えてしまいますので注意してください!

また、データ型の変更が可能なのは可変長配列の宣言時にバリアント型で宣言した場合だけになります。

Eraseで配列のメモリを解放する方法

先ほどEraseステートメントを使った配列の初期化について説明しました。

Eraseステートメントを使ってメモリを解放することも可能です。

2次元配列(多次元配列)の場合

2次元以上の多次元の配列を宣言する場合は、次元ごとに「,」(カンマ)で区切って「()」に並べます。

ここでは配列の宣言、初期化、再定義などについてお伝えしてきました。

これらについては、こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】配列の初期化(ReDim、Preserve、Array、Erase)
更新日 : 2019年4月21日

セルと配列で要素の値を共有する方法

Excelシート上のセルとVBAの配列で要素の値を共有する方法についてみていきましょう。

セルの値を要素に代入する方法

セルの範囲の値を配列の要素に一括で代入する方法についてみていきましょう。

実行結果:
Filter04

いくつか注意があります。まず、配列arrの要素の値にアクセスするためのインデックス番号が0からではなく、1から始まっています。

また行と列が入れ替わっているので、WorksheetFunctionオブジェクトのTranspose関数を使って行と列を入れ替えてシートとそろえています。

なお、Transpose関数はワークシート関数でExcelシートのセルに入力する数式で使える関数です。ワークシート関数については、こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】関数の使い方(VBA関数一覧、ワークシート関数の入力)
更新日 : 2019年4月28日

要素の値をセルに格納する方法

今度は逆にVBAの配列の要素の値をセルの範囲に一括で格納する方法についてみていきましょう。

実行結果:
Filter04

こちらのサンプルコードでは、配列arrの要素の値にアクセスするためのインデックス番号は0から始めています。

また、同じようにWorksheetFunctionオブジェクトのTranspose関数を使って行と列を入れ替えてシートとそろえています。

Uboundで配列の要素数を取得する方法

配列を扱う場合に要素数を知っておくと便利な場合があります。

しかし、VBAでは配列の要素数そのものを取得する関数は用意されていません。

配列の要素数を取得するには、UBound関数とLBound関数を使って、以下の式で計算する必要があります。

要素数を取得する方法やUBound関数、LBound関数の使い方については、こちらで詳しく解説しています。

ぜひ参考にしてください。

【VBA入門】UBound、LBound関数で配列の要素数を取得
更新日 : 2019年4月24日

ループで配列の要素を操作する方法

配列の要素を操作するにはForなどのループを使って各要素にアクセスする必要があります。

Forループで操作する方法

For Nextステートメントを使って配列の要素にアクセスする方法は例えば以下のように記述します。

詳しくはこちらで解説していますので、ぜひ参考にしてください。

【VBA For Next】ループ処理の基本を5つのステップで完全理解
更新日 : 2019年4月20日

For Eachで操作する方法

For Eachステートメントを使うとFor Nextステートメントより手短に記述することができます。

こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】For Eachで配列やコレクション、Selectionを操作
更新日 : 2019年4月23日

配列をコピーする方法

配列をコピーする場合は配列に格納するのではなく、バリアント型の変数に格納します。

サンプルコードで確認しましょう。

実行結果:
Filter02

Sortで配列の要素をソートする方法

配列の要素が順に並ぶようにソートしたい場合があります。

VBAの場合は、ExcelのSortメソッドやSortオブジェクトを使うと便利です。

こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】Sortでセル範囲内をソートする(並び替える)方法
更新日 : 2019年4月23日

Filterで配列の要素を検索する方法

配列の要素の中から条件に一致する要素が含まれているか検索するには、Filter関数を使います。

Filter関数は以下のように記述します。

「[ ]」内は省略可能です。

引数sourcearrayには、検索される配列を指定します。引数matchには、検索する文字列を指定します。

引数includeは、引数matchが含まれる要素を検索する場合にTrueを指定します。引数compareは、文字列を比較するモードを指定します。

0を指定した場合、テキストモードでの比較で大文字と小文字を区別しません。1を指定した場合、バイナリモードでの比較となり大文字と小文字を区別します。

それではサンプルコードで確認しましょう。

実行結果:
Filter01

このサンプルコードでは、配列cities1から”県”という文字を含む要素のみを格納した配列をFilter関数を使ってcities2に格納しています。

要素を追加、削除する方法

配列の要素を追加、削除する方法について解説します。

要素を追加する方法

要素を追加する場合は、ReDimステートメントを使います。

ただし、このままではこれまでの要素の値が消去されてしまいます。要素の値を保持したまま配列の要素数を変更したい場合は、ReDim Preserveステートメントを使います。

ReDim Preserveステートメントについては、こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】配列の初期化(ReDim、Preserve、Array、Erase)
更新日 : 2019年4月21日

要素を削除する方法

要素を削除する場合は少し面倒です。

配列にはコレクションのremoveメソッドのように削除するメソッドはありません。

使えるメソッドを駆使して、要素を削除する方法をご紹介します。

実行結果:
Filter05

このサンプルコードでは、配列citiesの3番目の要素を削除しています。

4番目以降の要素を1つインデックス番号の小さい要素に代入し、そしてReDim Preserveステートメントを使って要素数を変更しています。

配列を結合する方法

配列の結合には、1つの配列の要素同士を結合する場合と、複数の配列を連結させる場合などが考えられます。

それぞれの場合についてみていきましょう。

Joinで配列の要素を結合する方法

1つの配列から要素同士を結合する場合、Join関数を使うと便利です。

For Eachステートメントを使って要素に1つずつアクセスして、「&」記号で結合する方法もありますが、要素数が多い場合に「&」記号で結合すると処理に時間がかかる場合があります。

Join関数は全ての要素を順に結合した文字列を返します。要素数が多い場合でも高速で処理することができます。

こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】文字列の結合を高速にする方法(Mid、Join)
更新日 : 2019年4月18日

JoinとSplitで配列を連結する方法

例えば要素数の違う2つの配列を連結する関数はVBAでは用意されていません。

ここではSplit関数とJoin関数を使う方法についてご紹介します。

まず、Join関数を使ってそれぞれの配列の要素を結合します。Join関数は引数を指定しない場合、半角スペースを区切り文字として要素を結合します。

それぞれの配列の要素を結合したら、「&」記号を使って結合しましょう。結合したら、半角スペースを区切り文字としてSplit関数で分割された文字列を配列の各要素に格納します。

これで連結した配列が出来上がります。

サンプルコードで確認しましょう。

実行結果:
Filter02

なおSplit関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】Split関数で文字列を分割(複数条件や正規表現も解説)
更新日 : 2019年4月28日

配列同士を比較する方法

配列同士を比較するには、For Eachステートメントを使って要素に1つずつアクセスして比較する方法もありますが、記述が少々面倒になります。

Join関数を使って要素を結合した文字列を比較すると、記述が短くできます。

サンプルコードで確認しましょう。

実行結果:
Filter03

定数配列について

VBAではConstステートメントを使って配列の定数を定義してもエラーが発生します。

しかし、定数を1つずつ定義するのも面倒です。

Split関数を使って、定数の文字列を区切り文字で分割して配列へ格納する方法をご紹介します。

実行結果:
Filter02

配列を関数の引数に指定する方法

配列を関数の引数に指定したい場合もあります。

引数に配列を指定する場合には引数名の後に「()」(カッコ)を付けます。なお、引数に配列を指定する場合は全て参照渡しになります。

これは引数に配列を指定する場合、先頭のアドレスを渡しているためで値を渡すようにはなっていないからです。また戻り値に配列を指定する場合には戻り値のデータ型の後に「()」(カッコ)を付けます。

以下のような記述になります。

こちらで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】Functionの使い方(呼び出し、引数、戻り値)
更新日 : 2019年5月27日

まとめ

ここでは配列の使い方について説明しました。

配列は同じ型のデータを大量に扱う場合に一つのかたまりとして扱うことができるので便利です。またVBAで用意されている関数を使いこなすことで、様々な応用的な使い方ができることをご理解頂けましたでしょうか?

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説