Excel VBA 配列変数 動的配列 2次元配列

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

配列変数

同じデータ型の要素の集まりのことを「配列」と呼び、配列を格納する変数のことを「配列変数」と呼びます。例えば、「変数」を4個扱う場合は、「変数」を4個用意しなければなりませんが、「配列変数」を使用すると1個の「配列変数」で4個の「変数」をまとめて扱えるためにシンプルなコードで「変数」を扱えるようになります。



配列変数の使い方

まずは、配列変数の宣言をします。配列変数を宣言するには、変数名の最後の()内に要素数を表す「インデクス番号」を記述します。インデクス番号は、はじめの番号を0とするため配列変数を宣言する際は、要素数(変数数)から1を減算した数値を「上限値」として設定します。各要素(変数)は「変数名(インデクス番号)」で表します。「インデクス番号」は、0から順番に番号を振ります。

配列変数宣言の書式

Dim 変数名(上限値) As データ型

配列変数にデータを格納する書式

変数名(インデクス番号) = 格納する値


※同じデータ型の要素の集まりを「配列」と呼び、その要素を格納する変数を「配列変数」と呼びます。厳密には意味が違いますが、一般的には、「配列変数」のことを「配列」といいます。

コード例

sub 配列宣言()
Dim 変数(3) As Variant
    変数(0) = "データ1"
    変数(1) = "データ2"
    変数(2) = "データ3"
    変数(3) = "データ4"
End Sub

配列変数のインデックス番号の下限値を変更する方法

配列のインデクス番号の最初の番号(下限値)は、初期設定では「0」になります。そのために、配列変数の宣言時に指定する「上限値」は「配列の要素数-1」になりますが、少しわかりづらい面があります。Option Base【オプションベース】ステートメントを使用するとインデクス番号の下限値を0から1に変更することができます。Option Baseステートメントはモジュールの宣言セクションに記述します。設定できる下限値の値は「0」か「1」のいずれかです。Option Baseステートメントで下限値を「1」に指定すると、そのモジュール内のすべての配列変数の下限値が「1」になります。

Option Base【オプションベース】ステートメントの書式

Option Base 下限値(0または1)


コード例

Option Base 1
Sub 配列宣言2()
Dim 変数(4) As Variant
    変数(1) = "データ1"
    変数(2) = "データ2"
    変数(3) = "データ3"
    変数(4) = "データ4"
End Sub

配列変数のインデックス番号の下限値と上限値を指定する方法

TO【トゥ】キーワードを使用すると配列変数ごとに下限値と上限値を指定できます。例えば、セルの行番号や列番号に対応した値に設定することが可能です。Option Baseステートメントの設定に関係なく、設定した下限値が有効になります。

To【トゥ】キーワードを使用した書式

Dim 変数名(下限値To上限値) As データ型


コード例

Sub 配列宣言3()
Dim 変数(2 To 5) As Variant
    変数(2) = Range("A2")
    変数(3) = Range("A3")
    変数(4) = Range("A4")
    変数(5) = Range("A5")
End Sub

Array【アレイ】関数で配列変数に値を格納する方法

配列変数に値を格納するには「変数(0) = 値」のように要素ごとに値を格納しますが、Array【アレイ】関数を使用すると配列の各要素を一度に格納できます。Array【アレイ】関数は、引数に指定した要素を配列にして返す関数です。
※Array関数を使用した配列の下限値は「0」になります。Option Baseステートメントの設定で下限値は変更できます。
※Array関数が返す配列はバリアント型の値を返すため、変数宣言のデータ型はバリアント型(Variant)に指定します。

Array【アレイ】関数を使用した配列変数の書式

Dim 変数名 As Variant

変数名 = Array(要素1,要素2,y要素3,・・・)


コード例

Sub 配列宣言4()
Dim 変数 As Variant
    変数 = Array("データ1" ,"データ2","データ3","データ4")
End Sub

動的配列

「動的配列」とは、宣言時に要素数を指定せず、プロシージャ―の中で要素数を宣言できる変数のことです。

プロシージャの実行中に配列の要素数に変動がある場合に「動的配列」を使用します。

動的変数の使い方

動的配列変数を宣言するには、配列変数の宣言ステートメントで配列変数の後に「()」だけを記述します。(上限値は入れません)プロシージャ実行中に要素数がわかった時点で、ReDim【リディム】ステートメントを使用して配列変数に上限値を設定します。

動的配列の書式

Dim 変数名() As Variant

ReDim 変数名(上限値)


動的配列変数にA列の値を格納してMsgBoxに表示するコード例

Sub 動的配列()
Dim 変数() As Variant
Dim 行数 As Long
Dim 表示 As String
Dim i As Long
行数 = Cells(Rows.Count, 1).End(xlUp).Row - 1
ReDim 変数(行数 - 1)
For i = 0 To 行数 - 1
変数(i) = Cells(i + 2, 1)
Next i
表示 = Join(変数, vbCrLf)
MsgBox "A列に入力されている値" & vbCrLf & 表示
End Sub

コードの解説

2行目【Dim 変数() As Variant】
動的配列変数の宣言をバリアント型でします。


6行目【行数 = Cells(Rows.Count, 1).End(xlUp).Row – 1】
変数「行数」にA列のデータが入力されている行数から1を減算した値を代入します。1行目の見出し行を含まないため1行分を減算します。


7行目【ReDim 変数(行数 – 1)】
ReDim【リディム】ステートメントで動的配列変数に上限値を設定しています。インデクス番号は0からはじまるので上限値は「行数-1」になります。


8行目【For i = 0 To 行数 – 1】
For【フォー】ステートメントで繰り返し処理のはじまりです。カウンタ―変数のiには0~「行数-1」の値が繰り返し代入されます。カウンタ―変数iは動的配列のインデクス番号とセルの行数を兼ねます。


9行目【変数(i) = Cells(i + 2, 1)】
動的配列変数の「変数(i)」にセルの値を順番に代入します。セルの行数「i+2」の意味は繰り返しの最初はiが0なので2を加算することで1行目の見出しを除いて2行目からセルの値を取得しています。


11行目【表示 = Join(変数, vbCrLf)】
変数「表示」にjoin【ジョイン】関数を使用して動的配列変数の「変数」に格納されている配列の値を結合して「vbCrLf」(改行コード)で改行しています。


12行目【MsgBox “A列に入力されている値” & vbCrLf & 表示】
MsgBox【メッセージボックス】関数を使用して変数「表示」に格納されている値を表示します。


実行前

実行後


配列の下限値と上限値を取得する方法

動的配列を使用しているために要素数に変動する場合やOPtion Baseステートメントで下限値が変更されている場合、Toキーワードを使って下限値と上限値を指定している場合には配列の処理をおこなう上で正確な要素数を確認する必要がある場合があります。この場合には。下限値を取得するLBound【エルバウンド】関数上限値を取得すUBound【ユーバウンド】関数を使用します。

LBound【エルバウンド】,UBound【ユーバウンド】関数の書式

LBound(下限値を取得する配列変数名)


UBound(上限値を取得する配列変数名)


配列の要素数を取得する場合

UBound(配列変数名) – LBound(配列変数名)


配列の値を残したまま要素数を変更する方法

動的配列では、ReDim【リディム】ステートメントを使用することで、配列の要素数を何回でも変更できますが、一度、ReDimで要素数を設定し、その後ReDimで要素数を変更するとすでに格納されている値がクリアされてしまいます。格納されている値を残したまま配列の要素数を再設定するにはReDimステートメントにPreserve【プレサーヴ】キーワードを付加します。

Preserve【プレサーヴ】キーワードを付加しなかった場合

Preserve【プレサーヴ】キーワードを付加した場合


コード例

Sub 動的配列()
Dim 動的配列() As Variant
ReDim 動的配列(1)
動的配列(0) = "値1":動的配列(1) = "値2"
ReDim Preserve 動的配列(3)
動的配列(2) = "値3":動的配列(3) = "値4"
End Sub

2次元配列

2次元配列とは、列と行からなる配列のことをいいます。Excelの表のようなデータを扱う場合に使用します。2次元配列の宣言は、最大行数と最大列数をカンマで区切って指定します。※行数と列数は0から数えます。

2次元配列宣言の書式

Dim 変数名(最大行数,最大列数) As データ型

2次元に値を格納する書式

変数名(行のインデクス番号,列のインデクス番号) = 格納する値



A1セルからB3セルに2次元配列に格納した値を代入するコード例

Sub 二次元配列()
Dim 二次元配列(2, 1) As String
二次元配列(0, 0) = "値1"
二次元配列(1, 0) = "値2"
二次元配列(2, 0) = "値3"
二次元配列(0, 1) = "値4"
二次元配列(1, 1) = "値5"
二次元配列(2, 1) = "値6"
Range("A1:B3") = 二次元配列
End Sub

実行結果


Toキーワードを使用して2次元配列の下限値と上限値を設定する方法

2次元配列の宣言時の行数、列数にToキーワードを使用するとそれぞれの下限値、上限値を設定することができます。例えば「Dim 二次元配列(1 To 3,1 To 2) As Variant」のように記述します。セル範囲の行番号や列番号に対応させたいときに便利です。

配列の初期化

配列に格納されている値を消去するには、Erase【イレース】ステートメントを使用します。動的配列の場合は値の消去と同時にメモリ解放も行いますが静的配列の場合は値の初期化のみでメモリ解放は行いません。

配列の値を初期化する書式

Erase 変数名


以上で、配列変数、 動的配列 、2次元配列についての解説を終了します。ありがとうございました。

配列 関数一覧表

配列に関連する関数の一覧表です。
関数名がリンクになっていて
詳細説明ページが開きます。
関数名内容
Array配列の各要素をまとめて格納する
LBound配列インデクス番号の下限値を取得する
UBound配列インデクス番号の上限値を取得する
Split文字列を分割して配列に格納する
Join配列の要素を結合する
Filter特定の要素を取得する

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

フォローする

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