Excel VBA Array・配列の使い方(基礎編)

ExcelVBA-基礎編

配列の使い方について、ご説明します。

配列は内容が非常に多いため、「基礎編」と「応用編」に分けて説明したいと思います。

基礎編では以下の内容を記載します。

  • 配列とは
  • 配列を使うメリット・デメリット
  • 配列は行列を入れ替えて扱う事に慣れる
  • 配列の宣言
  • 配列の再定義
  • 配列の初期化

応用編は「Array・配列の使い方(応用編)」をご覧ください。

1.配列とは

配列とは変数の一種ですが、通常の変数は1つの変数に1つの値を代入して扱いますが 、一つの変数に複数の値を代入し、扱うの事が出来ます。

配列に格納されたデータの一つ一つを「要素」と言い、要素番号(インデックス)を指定する事で、格納されたデータを扱うことが出来ます。

予め要素数と次元数が決まっている固定の配列を「固定長配列」といい、領域が動的に変わる可変の配列を「可変長配列」と言います。

また、1列のみの配列を「1次元配列」、複数列ある配列を「2次元配列」と言います。

Excelで表現するとA列のみ扱う場合が1次元、A〜C列扱う場合は2次元のようなイメージです。

配列の領域(行と列)のインデックスは基本的に0から始まります。

変数は非常に便利な反面、扱いの難易度が高く慣れるまで難しく感じるかもしれません。

扱いの難易度が上がる理由

配列を使用しない場合は基本的に、シート上の可視化されたセルの値を扱いますので、「視えている」ので直感的で扱いやすいです

配列を使用すると、変数内にデータを格納して、データが見えない状態で扱うため、しっかりデータ構成を把握する必要があり、さらに処理途中のデータの動きもぱっと見でわからないため難しく感じます。

また、変数の代入方法次第では行列が入れ替わったり、扱う要素番号(インデックス)が0から始まったり、1から始まったりする事も複雑に感じる理由ではないでしょうか。

2.配列を使うメリット・デメリット

上記で記載したと通り、初学者にはとても難しいと感じる配列は、覚えてまで使うほどのメリットがあるのか?

配列のメリット
  • メモリ上で扱うため処理速度が速い
  • 型の指定が可能
配列のデメリット
  • 配列領域の扱いが煩雑で難しい
  • 配列内の型の扱いが難しい

簡単にメリット/デメリットを記載しましたが、どれだけの効果があるのかイマイチわからないですね。

配列を使った場合の処理速度の高速化を記事にしていますので「処理速度の高速化対策」のもくじの5番目を見ていただけるとわかりやすいと思います。

3.配列は行列を入れ替えて扱う事に慣れる

いきなり「何の事?」と思う内容ですが、今後配列を扱う様になるとこの「行と列の概念」で必ず脳内で混乱をもたらします。

更には入れ替えを避けてコーディングしたが故に、あとあと行き詰まるなどの原因にもなります。

ますます「何の事?」と、お思いかと思います。

文字だけだとわかりにくいので、後半に図で説明します。

慣れてくると配列は基本的に「可変長配列」を使う事が多くなります。

つまり動的な配列のことです。

その可変長配列は要素を追加する事が出来ますが、この要素の追加が最終次元しか出来ません

また、データベースから直接取得したデータなども配列に格納すると行列が入れ替わります

列行を入れ替える「Transpose関数」もありますが、空白があるとエラーになったりするので、そのまま入れ替えずに処理して、セルに出力する時のみ入れ替えた方が都合が良いです。

セルで時系列データを追加して管理する場合、行に追加していく事が多いと思います。

また、縦に追加する事に慣れている人が多いと思います。

それ故に違和感と脳内変換が出来ず混乱します。

イメージが難しいのでサンプルデータでご説明します。

セルでデータ管理するイメージ図(縦に追加していきます。)

配列では上の図の様な2次元配列は1次元を追加出来ない。

配列では列に追加していくように扱うことに慣れる必要がある。

データベースなどのデータはデータベース上は1枚目の表のように見えていても、配列に格納したら3枚目の表の様に意図せず自動的に行列が入れ替わります。

この変換は慣れないと混乱しやすいので、早い段階で慣れる事をおすすめします。

配列の使い方(応用編)でも記載しています。

4.配列の宣言

配列も変数同様に使うためには宣言が必要です。

変数の宣言は「変数の宣言と適用範囲」をご覧下さい。

配列の宣言は、「固定長配列」と「可変長配列」よって違います。

固定長配列」は予め配列の領域が決まっている配列の事です。

可変長配列」は領域を動的に可変で扱う事が出来る配列です。

また、1次元配列と2次元(多次元)配列でも、宣言の仕方が違いますので併せてご説明します。

固定長配列の宣言

1次元配列の宣言

Dim 配列名(下限値 to 上限値) As データ型

下限値は0から始まる場合は省略可能です。

100個のデータを配列入れる場合以下の様になります。

Dim myArray(0 to 99) As Variant

もしくは0を省略して

Dim myArray(99) As Variant

2次元配列の宣言

Dim 配列名(行の要素数,列の要素数) As データ型と行の要素数と列の要素数をそれぞれ指定します。

Dim 配列名(下限値 to 上限値,下限値 to 上限値 ) As データ型

の様に宣言します。

次元数が3次元、4次元と増える場合は「,」で区切って領域を指定します。

下限値は0から始まる場合は省略可能です。

3列の各列に100個あるデータを配列に入れる場合は以下の様になります。

Dim myArray(0 to 99,0 to 2) As Variant

もしくは

Dim myArray(99, 2) As Variant

0は省略可能ですが、慣れるまでは省略しない方が扱いやすくなるかと思います。

可変長配列の宣言

Dim 配列名() As データ型で宣言します。

可変長配列は宣言時には、1次元や2次元(多次元)は指定しません。

()のみ記載します。

簡単ですね。

ですが、このままでは使えませんので再定義で配列の領域を定義します。

再定義については、次で説明します。

5.配列の再定義

配列の再定義とは、配列の領域を再度定義し直す事です。

どういうことかと言いますと、まずデータの大きさがわからないので、配列の大きさも指定しないんです。

そして、配列にデータを入れる直前で最終行や最終列を取得して初めてデータの大きさがわかるので、そこでデータの大きさに合わせて配列の大きさも決めてあげるのです。

これが再定義です。

再定義できるのは可変長配列でVariant型で宣言した配列のみです。

再定義には「ReDimステートメント」を使用します。

ReDimステートメントで再定義すると、それまでに格納していたデータは初期化されます

1次元配列の再定義

ReDim 配列名(下限値 to 上限値)と定義します。

宣言同様、0は省略可能です。

100個のデータを配列入れる場合以下の様になります。

宣言した後、領域を定義します。

Dim myArray() As Variant

ReDim myArray(0 to 99)

もしくは

ReDim myArray(99)

と0を省略できます。

定義して初めて配列にデータを格納出来るようになります。

2次元(多次元)配列の再定義

ReDim 配列名(行の要素数,列の要素数 )と行の要素数と列の要素数をそれぞれ指定します。

ReDim 配列名(下限値 to 上限値,下限値 to 上限値 )のように定義します。

宣言同様、0は省略可能です。

3列の各列に100個あるデータを配列入れる場合以下の様になります。

1次元同様に宣言してから、再定義します。

Dim myArray() As Variant

ReDim myArray(0 to 99, 0 to 2)

もしくは

ReDim myArray(99,2)

と0を省略できます。

定義して初めて配列にデータを格納出来るようになります。

今回は固定値で定義していますが、本来は可変のデータに対して使用する事が多いため、

動的に変化する変数を使用して定義する事が多いと思います。

簡単なサンプルデータとコードを記載します。

Option Explicit

Sub Sample1()

    'セルの範囲の最終行と最終列を取得して
    'ループで可変長配列にデータを格納する

    Dim myArray()   As Variant
    Dim MaxRow      As Long
    Dim MaxCol      As Long
    Dim i           As Long
    Dim n           As Long
    
    MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
    MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
    
    ReDim myArray(0 To MaxRow - 1, 0 To MaxCol - 1) '配列は0~始まるため領域は-1で再定義
    
    For i = 1 To MaxRow 'A1から最終行までループ
    
        For n = 1 To MaxCol 'A1から最終列までループ
    
            myArray(i - 1, n - 1) = Cells(i, n) '配列は0~始まるためiとnの変数-1
            
        Next n
        
    Next i

End Sub

6.配列の初期化

配列を初期化する方法はEraseステートメントです 。

ReDimでも格納されているデータが初期化されますが、再定義が行われるので厳密には違います。

Erase 配列名

で初期化出来ます。

初期化自体は簡単ですが、初期化した状態は宣言時に戻る訳ではなく、宣言した時のデータ型によって初期値が異なります。

配列のデータ型初期値
数値型0
文字列型長さ0の文字列
Variant型Empty
オブジェクト型Nothing

7.まとめ

配列はシート上のセルのデータを扱うより、複雑になりますが大量のデータを扱えるため非常に便利です。

複雑ではありますが慣れてしまえば難しくありませんので、ぜひ使用してみてください。

次回は応用編を掲載しますので、そちらも併せてご覧ください。

タイトルとURLをコピーしました