Excelスキルアップコレクション
           〜 Something U Want 〜


Google  

WWW を検索
Excelスキルアップコレクション内 を検索
 @     Top  >     Excel VBA スキルアップコレクション Topics  >     (03) 動的配列を利用する

 
(03) 動的配列を利用する

 サイズ変更可能な配列のことを動的配列と呼びます。VBAでは動的配列を利用することができます。

 下記サンプルコードは、動的配列を利用したサンプルです。

 1行目:  Public Sub Sample_Arr_01()
 2行目:      ' 動的配列を宣言する。
 3行目:      Dim Arr() As Integer
 4行目:      
 5行目:      ' 上記宣言だけでは動的配列は利用できません。
 6行目:      ' サイズ=5に拡張します。
 7行目:      ReDim Arr(5) As Integer
 8行目:      
 9行目:      ' サイズ=5に拡張した配列にデータを格納します。
10行目:      Dim lp As Integer
11行目:      For lp = LBound(Arr) To UBound(Arr)
12行目:          Arr(lp) = lp
13行目:      Next
14行目:      
15行目:      ' 配列のサイズを2つ拡張します。
16行目:      ReDim Preserve Arr(7) As Integer
17行目:      
18行目:      ' 配列のサイズを4つ縮小します。
19行目:      ReDim Preserve Arr(3) As Integer
20行目:      
21行目:      ' 配列の全データをイミディエイトウィンドウに出力します。
22行目:      For lp = LBound(Arr) To UBound(Arr)
23行目:          Debug.Print Arr(lp)
24行目:      Next
25行目:      
26行目:      ' メモリの完全解放を行う。
27行目:      Erase Arr
28行目:  End Sub
 3行目は、動的配列を利用する為の宣言文です。通常の配列を宣言する場合と違い、カッコ内の中身は空欄にします。括弧の中に「Dim Arr(5) As Integer」のように数値を入れてしまうと、静的配列の宣言となってしまい、配列のサイズを動的に変更できなくなってしまいます。
 7行目は、このサンプルコードの中での最初の配列サイズ変更に当たります。ここでの動的配列の型はInteger型にしています。Integer型の場合、このステートメントが終了した時点で、配列Arrには初期値0が格納されます。ちなみに、String型の場合の初期値は、サイズ0の文字列""になります。
 1行目〜13行目は、配列に値を設定するステートメントです。Forループの条件句に使用しているLBound( ) 関数とUbound( ) 関数は、配列のインデックスの最小値、最大値を返す関数です。静的配列でも利用できますが、動的配列を利用したプログラムでは、使用頻度が高まることでしょう。

LBound(配列, [次元]) … 引数の配列の最小インデックスを返す関数
UBound(配列, [次元]) … 引数の配列の最大インデックスを返す関数
 16行目はこのサンプルコード中での2回目のサイズ変更です。Preserveを指定することで、それまで配列に設定されていた値はできる限り保持されます。Preserveを省略すると、配列はサイズ変更すると同時に内容も初期化されます。

Redim Preserve 動的配列 As 型 ← 値を保持しながら動的配列のサイズ変更
  
 19行目はこのサンプルコード中での3回目のサイズ変更です。但し、サイズを拡張したのではなく、サイズを縮小しています。Preserveを指定しているので、それまでの配列の設定内容はできる限り保持されます。サイズを縮小した分、データの一部が切り捨てられることになります。

  
 27行目は、動的配列のメモリ解放ステートメントです。メモリも限られた資源なので、動的配列の内容が不要になった時点で、メモリ解放する習慣を付けましょう。

Erase 動的配列
  
 ここまで、サンプルコードの説明を通して動的配列の使い方を紹介しました。実際に、最初から最後までこのサンプルコードを実行すると、イミディエイトウィンドウに、以下のような結果が出力されます。

 動的配列の活用方法ですが、例えばシート上のデータを配列に取り込む場合、事前にデータ数がわからなくても、必要最低限の配列サイズでデータ取込みすることが可能になり、メモリを節約できます。

 以下のように、A列に大量のデータが存在しているとします。

 次のサンプルコードはA列のデータをVBAの動的配列に取込む処理のサンプルです。何件のデータが存在しているのか事前にわからなくても、動的配列を使えば、必要な配列サイズを確保しながらデータ取込みが可能になります。

 1行目:  Public Sub Sample_Arr_02()
 2行目:      ' 動的配列を宣言する。
 3行目:      Dim Arr() As Double
 4行目:      ReDim Arr(0) As Double
 5行目:      
 6行目:      ' セルの内容をセルA1から一つずつ行方向に参照する。
 7行目:      Dim Val As Range
 8行目:      Set Val = Range("A1")
 9行目:      Do While (Val.Value <> vbNullString)
10行目:          ' 配列を一つ拡張する。
11行目:          ReDim Preserve Arr(UBound(Arr) + 1) As Double
12行目:          ' 拡張した配列にセルの値を格納する。
13行目:          Arr(UBound(Arr)) = Val.Value
14行目:          ' 一つ下のセルを参照する。
15行目:          Set Val = Val.Offset(1, 0)
16行目:      Loop
17行目:  
18行目:      ' オブジェクトを破棄する。
19行目:      Set Val = Nothing
20行目:  
21行目:      ' メモリの完全解放を行う。
22行目:      Erase Arr
23行目:  End Sub
ページの先頭へ