本ページには広告が含まれています。

Excel VBA 配列とは?基礎的使い方をサンプルで詳しく解説

Excel VBA 配列とは?基礎的使い方をサンプルで詳しく解説

同じ種類のデータを番号付きで格納できるのが「配列」です。配列を覚えると同じような内容の変数をまとめてしまうことでVBAコードをスリム化できます。配列データを一括してシートのセルへ書き込む等VBAの実行速度向上にも役立ちます

くるみこ
くるみこ

今まで、すでに「配列」を使っていますが「配列」とはどのようなものかについては詳しく解説していませんでした。ということで、今回は 配列について勉強しましょう!

すみませ~ん! 予習しようとしたけど難しいです! よくわからないので是非詳しく教えてください。よろしくお願いしますm(_ _)m

前回のおさらいはこちらの記事です(^^)/ 下のカードをクリックすれば開きます

くるみこ
くるみこ

前回記事でわかったことは
・Timer関数の使い方・利用方法
・VBAテスト実行などでウエイトをかける方法
・文字列日付を日付型に変換する方法

・検索時など日付型の違いによる注意点

【この記事でわかること
・「配列」とは何かがわかります

「配列」の宣言方法、代入方法や配列データの使用方法の基礎がわかります

スポンサーリンク

配列とは

配列とは、同じデータ型のデータを配列として1つにまとめた変数のことです。配列内のデータは、何番目のデータかを特定できるように番号付きで格納されます。この番号のことを「インデックス番号」と言います。また、配列を構成する1つ1つの変数は一般的に「要素」と呼ばれています

配列の宣言方法は

・配列を使用するときは、必ず宣言が必要です
・配列の型宣言は変数と同じです。宣言をしない場合はバリアント型です
・宣言の方法は変数と同じように宣言しますが、配列の場合は配列名の後に「()」(カッコ)を記述し、その中に配列の範囲を記述します。宣言した時点で指定された領域分のメモリが確保されます

宣言例Dim 配列名(インデックス番号の最大値) As データ型
 「aa(100) As String」 や 「aa(5 To 100) As String」の指定方法があります

・配列のインデックス番号は「0」から始まりますので、要素数はインデックス番号の最大値に1を足した数になります。インデックスが 100 の場合、要素数は 101 ということです
・モジュールシートの先頭に「Option Base 1」と宣言すればインデックスは「1」から始まります
・上の例の、aa(5 To 100) As String と宣言した場合、5 が先頭で 100 までということです

配列の要素に代入する方法

・配列の要素に値を代入するには次のように記述します
 「配列名(インデックス番号) = 代入する数値・文字列など

・次のコードは、要素数5の配列aの要素にそれぞれ5づつ増える値を代入しセルに書き込みます

'配列の宣言とForLoopを使った値代入例
Sub Sample01()
  Dim i As Long
  Dim a(4) As Long  '配列の宣言
  For i = 0 To 4
    a(i) = i * 5 + 5
  Next
  '代入したデータをセルに書き込む
  For i = 0 To 4
   Cells(i + 1, 1) = a(i)
  Next
End Sub

配列名(インデックス番号の最小値 To インデックス番号の最大値) As データ型の例

'数値指定配列の宣言とForLoopを使った値代入例
Sub Sample02()
  Dim i As Long
  Dim a(1 To 5) As Long  '配列の宣言
  For i = 1 To 5
    a(i) = i * 5 
  Next
  '代入したデータをセルに書き込む
  For i = 1 To 5
    Cells(i, 1) = a(i)
  Next
End Sub

・どちらも結果は同じ(5,10,15,20,25)になります
ループの開始番号を「0」に変更してスタートさせた場合、無いインデックス番号を指定しているので当然エラー「実行時エラー’9′;インデックスが有効範囲にありません。」が表示されます

多次元配列とは

これまで解説した配列は、インデックスが1つでデータが1列の「一次元配列」です。配列には複数列のデータを持つ「多次元配列」もあります。各要素がワークシートのように縦横に並んでいる状態をイメージすればよいでしょう。要素が2列なら二次元配列、3列では三次元配列となりますが、最大次元数は60までと制限があります

多次元配列の宣言方法

・多次元配列の宣言方法は、「()」内に「縦のインデックス番号の最大値,横のインデックス番号の最大値」を記述します。ワークシートで言えば、「行の最大値,列の最大値」ということになります

宣言例Dim 配列名(縦最大インデックス番号,横最大値インデックス番号) As データ型

・こちらは、縦2×横4の二次元配列の事例です(セルに結果を書き込むところまで)

'2次元配列の宣言と値代入例
Sub sample03()
  Dim aa(1, 3) As Long '縦2行、横4列の配列を宣言
  aa(0, 0) = 1
  aa(0, 1) = 2
  aa(0, 2) = 3
  aa(0, 3) = 4
  aa(1, 0) = 5
  aa(1, 1) = 6
  aa(1, 2) = 7
  aa(1, 3) = 8
  '代入したデータをセルに書き込む
  Cells(1, 1) = aa(0, 0)
  Cells(1, 2) = aa(0, 1)
  Cells(1, 3) = aa(0, 2)
  Cells(1, 4) = aa(0, 3)
  Cells(2, 1) = aa(1, 0)
  Cells(2, 2) = aa(1, 1)
  Cells(2, 3) = aa(1, 2)
  Cells(2, 4) = aa(1, 3)
End Sub

・同じものを2次元のFor Loopで処理する場合の例です(セルに結果を書き込むところまで)

'2次元配列の宣言と2次元のForLoopを使った値代入例
Sub sample04()
  Dim aa(1, 3) As Long '縦2行、横3列の配列を宣言
  Dim i As Long, j As Long, n As Long
  For i = 0 To 1
    For j = 0 To 3
      n = n + 1
      aa(i, j) = n
    Next j
  Next i
  '代入したデータをセルに書き込む
  For i = 0 To 1
    For j = 0 To 3
      Cells(i + 1, j + 1) = aa(i, j)
    Next j
  Next i
End Sub

配列が大きくなるほど、Loop処理を使えばコードをコンパクトにできますね

ここまで紹介した配列は、要素数が決まっている場合の宣言と代入・書き込み方法です。このように、あらかじめ要素数が決まっている配列のことを「静的配列」と呼びます

複雑なプログラムになると、要素数が定まっていないケースが沢山出てきます。そのような場合には、「動的配列」を使うことになります

動的配列とは

動的配列」とは、データ型宣言時に要素数を決めずに実行時に要素数が可変する配列のことです。配列に格納する要素数が分からない場合は、「動的配列」を利用します

動的配列」は格納データ分だけメモリを使いますので、メモリに無駄が生じないので効率的です

動的配列の宣言方法

・「動的配列」を利用する場合は、データ型宣言時に要素数を設定せず宣言します

宣言例Dim 配列名() As データ型   ←()内には何も入れません

・実行時に「動的配列」を利用する状況になった場合は、「動的配列」の次元数や要素数を変更するReDimステートメントを利用して () 内にインデックス番号の最大値を再割り当てします

宣言例ReDim 配列名(インデックス番号の最大値)

・「動的配列」の事例です。Redimで配列a()に(2)を再割り当てしています

'動的配列とRedimステートメントサンプル
Sub Sample05()
    Dim a() As Long
  
    ReDim a(2)
    a(0) = 5
    a(1) = 10
    a(2) = 15
    '代入したデータをセルに書き込む
    Cells(1, 1) = a(0)
    Cells(2, 1) = a(1)
    Cells(3, 1) = a(2)
End Sub

ReDim ステートメントとは

プロシージャレベルで使用され、動的配列変数の記憶領域を再割り当てします

構文
ReDim [Preserve] varname(subscripts)[As type]

・Preserve は省略可能です。既存データを保持したまま要素数を変更します
・varname は必須です。要素数を変更する動的配列変数名を指定します
・subscripts は必須です。変更する要素数を指定します
・type は省略可能です。配列変数のデータ型を指定します

ReDim ステートメントを繰り返し使用して、配列内の次元数や要素数を変更できます
・一度設定したデータ型を変更することはできません
すでに値が格納されていた場合は、再設定の時点ですべての値が破棄されます
・理由は、要素数の変更と共にまったく新しい領域に、配列変数の格納領域が再度割り当てられるためです。配列の値を保持した状態で要素数を変更したい場合は、Preserve キーワードを利用します

Preserveキーワード

Preserve キーワードを使用した場合、配列に含まれる既存のデータを消去することなく、動的配列の最後の次元のサイズを拡大することができます

宣言例ReDim Preserve 配列名(インデックス番号の最大値)

・こちらは、要素数の変更と配列の値の状態をチェックするサンプルコードです

'ReDim Preserveの動作検証サンプル
Sub Sample06()
    Dim a() As Long
  
    ReDim a(1, 1)
    a(0, 0) = 1
    a(0, 1) = 2
    a(1, 0) = 10
    a(1, 1) = 20
    
    ReDim Preserve a(1, 2)  '横に1追加
    a(0, 2) = 3
    a(1, 2) = 30
    MsgBox "配列a(0, 0)の値:" & a(0, 0) & vbCrLf & _
           "配列a(0, 1)の値:" & a(0, 1) & vbCrLf & _
           "配列a(0, 2)の値:" & a(0, 2) & vbCrLf & _
           "配列a(1, 0)の値:" & a(1, 0) & vbCrLf & _
           "配列a(1, 1)の値:" & a(1, 1) & vbCrLf & _
           "配列a(1, 2)の値:" & a(1, 2)
             
    ReDim a(2, 3)           'ReDimで再び要素数をセット
    MsgBox "配列a(0, 0)の値:" & a(0, 0) & vbCrLf & _
           "配列a(0, 1)の値:" & a(0, 1) & vbCrLf & _
           "配列a(0, 2)の値:" & a(0, 2) & vbCrLf & _
           "配列a(1, 0)の値:" & a(1, 0) & vbCrLf & _
           "配列a(1, 1)の値:" & a(1, 1) & vbCrLf & _
           "配列a(1, 2)の値:" & a(1, 2)
End Sub

・11行目で、Preserveキーワードを使用して変更した配列の要素を追加しています
・14行目で、Preserveキーワードを使用して追加したデータを表示しています
要素を変更した動的配列に元の値が保持されていたことが確認できると思います
・21~22行目は、通常の変更をした場合です。すべての値が破棄されているのが分かります

動的配列でインデックス番号の最小値変更方法

・動的配列でもインデックス番号の最小値を変更することができます
・変更方法は静的配列と同じように「最小値 To 最大値,最小値 To 最大値で指定できます
・「Option Base 1」で最小値を「1」に指定(最小値は「1」以外でもOK)指定できます
・ただし、配列を複数使っている場合「Option Base」で指定している場合は全ての配列に対して指定することになるので注意が必要です

スポンサーリンク

まとめ(おわりに)

くるみこ
くるみこ

今回は配列について解説しました。配列には静的配列動的配列がありますが、どちらも非常に使用頻度が高いと思います。動的配列をうまく利用することができるようになれば、複雑なプログラミングもできますしコードも簡素化できる場合もあります。 どうですか、理解できましたか?

はい! 静的配列動的配列の違いなどは理解できました(^^)
でも、使いこなせるようになるまでしっかり復習しなくちゃだめですね!

くるみこ
くるみこ

配列は奥が深いのでしっかり頑張ってくださいね(^^)/
では、次回は配列を使いこなしていくために、知っておいた方が良いことをさらに解説していきたいと思います!

まとめと感想など

・配列とは、同じデータ型のデータを配列として1つにまとめた変数のことです
・配列内のデータは「インデックス番号」付きで格納されます
・配列を構成する1つ1つの変数は「要素」と呼ばれています
・配列には「静的配列」と「動的配列」があり、使用には必ず宣言が必要です
・配列の宣言は「Dim 配列名(インデックス最大値) As データ型」で行います
  (aa(100) As String 、aa(5 To 100) As String の指定方法があります)
・配列の型宣言は変数と同じです。宣言をしない場合はバリアント型です
・配列のインデックスは指定しない場合は「0」から始まります
・開始インデックスを変更する場合は「Option Base 」で指定するか
 「開始インデックス」 To 終了インデックス」と宣言します
・ReDimステートメントで動的配列要素を(再)設定します
・ReDim Preserveキーワードで要素を保持したまま配列を拡大出来ます

マクロ(VBA)を実行する際は必ずバックアップを取ってから行ってください
・マクロ(VBA)は実行後にファイルを保存すると元に戻すことはできません!
・実行後にファイルを保存せず終了すれば、実行前に戻すことができます!

★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
当面は「初心者向けマクロVBA」の記事を継続して書いていきます

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう現在検討中です
・その他雑記的に「小ネタなどいろいろ」・・・・・
・今後の記事にもご期待ください(^^)/

スポンサーリンク
スポンサーリンク

記事のサンプルファイルをダウンロードできます

この記事のサンプルはこのリンク先からダウンロードできます

過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください